면접준비용(이후 정리)

11 분 소요

MEAN stack

  • mongodb
  • express
  • angular
  • nodejs

모두 자바스크립트로 동작 가능하며, 오픈 소스이다.

SPA

single page application이라 하며 모든 페이지가 단 하나로 되어 있는 사이트.

보통 웹사이트는 글쓰기, 회원가입 등 복잡한 기능을 여러 페이지에서 지원하지만, 이 페이지는 html 상에서 추가로 필요한 데이터만 서버로부터 받아 화면을 구성해주는 것으로 실제로 추가 HTML 호출이 일어나지 않는다.

일반적으로 웹사이트에서 메뉴바, 푸터 등은 페이지마다 정적임에도 불구하고 서버에 새로 읽어오게 되는데, 이에 따라 불필요한 데이터 소모가 일어난다. 불필한 코드를 계속해서 요청하지 않아도 된다는 장점이있다.

스크립트 언어

https://www.a-mean-blog.com/ko/blog/MEAN-Stack/_/MEAN-Stack-%EC%86%8C%EA%B0%9C

스크립트(Script) 언어란 소스 코드를 컴파일(Compile)하지 않고도 실행할 수 있는 프로그래밍 언어를 말한다.

예를 들어 C나 비주얼베이직, 자바같은 경우는 작성한 소스를 컴파일러를 통해 기계어 코드로 변경해야 사용자가 실행할수 있는 실행 파일이 얻어지는데 비해 스크립트 언어는 별도의 컴파일 없이 내장된 번역기에 의해 번역 되므로 바로 실행 할 수 있다.

스크립트 언어는 소스를 작성한 후 컴파일 과정 없이 바로 실행하여 결과를 확인할 수 있다는 장점이 있는 반면에 번역 과정을 거쳐야 하기 때문에 다소 느리다는 단점이 있다. C언어나 Java와 같은 비스크립트 언어의 경우 실행 속도가 빠른 장점이 있는 반면 컴파일 과정을 거쳐야 하는 등 개발 과정이 조금 복잡하다는 단점이 있다.

JVM

실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다. 이때, 실행엔진은 2가지 방식으로 동작할 수 있습니다.

자바 인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점을 가집니다. JIT 컴파일러(Just-In-Time Compiler) : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식입니다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠릅니다.

트랜잭션?

데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위

sql, nosql?

sql은 시스템이 커지면 스케일업 즉 서버 한 대의 성능을 높여야 한다.

nosql은 아님. 걍 서버 대수만 올리면됨

nosql 은 유연한 db 스키마를 가지고 있음.

https://brunch.co.kr/@kooslab/181

운영체제

쓰레드 프로세스

프로세스는 현재 실행중인 프로그램 자원을 요구하는 주체.

전통적 프로세스는 공유변수를 가지기 어렵다. 데이터 스택 영역 모두 복사하기 때문에 오버헤드 존재.

쓰레드 코드와 데이터 힙영역은 공유하고 스택과 프로그램 카운터 같은 특수 레지스터는 따로 갖는 형태.

컨텍스트 스위칭

Context Switching이란 인터럽트를 발생시켜 CPU에서 실행중인 프로세스를 중단하고, 다른 프로세스를 처리하기 위한 과정입니다. Context Switching는 현재 실행중인 프로세스의 상태(Context)를 먼저 저장하고, 다음 프로세스를 동작시켜 작업을 처리한 후에 이전에 저장된 프로세스의 상태를 다시 복구합니다. 여기서 인터럽트란 CPU가 프로세스를 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요함을 CPU에게 알리는 것을 말합니다.

쓰레드세이

쿠키 세션 토큰

연결을 끊어버리기 때문에, 클라이언트의 이전 상태를 알 수가 없다. 이러한 HTTP의 특징을 stateless라고 하는데, Connectless로 부터 파생되는 특징이라고 할 수 있다. 클라이언트의 이전 상태 정보를 알 수 없게 되면, 웹 서비스를 하는데 당장에 문제가 생긴다. 예컨데, 클라이언트가 과거에 로그인을 성공하더라도 로그 정보를 유지할 수가 없다. HTTP는 cookie를 이용해서 이 문제를 해결하고 있다.

세션은 서버측에 저장한다는 점에서 쿠키와 상반된다.

토큰

서버기반 인증의 문제.

서버측 메모리에 저장. 자원 부족.

확장성 세션동기화가 힘듦.

stateless 서버를 만들기 위해.

jwt

  • 헤더

토큰타입, 해시알고리즘

  • 페이로드

토큰 대상자 아이디 등.

  • 서명

jwt는 HAMC이라는 방법으로 서명한다.

헤더와 페이로드를 특정 알고리즘으로 서명하는 것.

CDN이란?

CDN(Content Delivery Network)는 물리적으로 떨어져 있는 사용자에게 컨텐츠를 더 빠르게 제공하기 위해 고안된 기술입니다. 만약 우리나라에 있는 사람이 미국에 있는 서버로부터 이미지나 파일 등을 다운받으려고 하면 시간이 오래 걸립니다. 따라서 느린 응답속도와 다운로드 시간을 극복하기 위해 서버를 분산시켜 캐싱해두고, 빠르게 다운받을 수 있게 합니다.

CDN은 콘텐츠에 대한 요청이 발생하면 사용자와 가장 가까운 위치에 존재하는 서버로 매핑시켜, 요청된 파일의 캐싱된(사전 저장된) 버전으로 요청을 처리합니다. 서버가 파일을 찾는 데 실패하는 경우 CDN 플랫폼의 다른 서버에서 콘텐츠를 찾은 다음 엔드유저에게 응답을 전송합니다.

Docker 란

https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

온 디맨드 이미지 리사이징

https://heropy.blog/2019/07/21/resizing-images-cloudfrount-lambda/ https://helloinyong.tistory.com/246

content delivery network

https://goddaehee.tistory.com/173

http란

Hypertext Transfer Protocol (HTTP) is an application-layer protocol for transmitting hypermedia documents, such as HTML. It was designed for communication between web browsers and web servers, but it can also be used for other purposes

httponlycookie

https://owasp.org/www-community/HttpOnly

제일 근접한 서버에서 처리함으로써 지연시간을 줄인다.

federated learning

연합학습이란, 민감정보를 이용한 러닝을 효과적으로 진행할 수 있는 방식으로써, 사용자 개개인의 데이터를 이용한 로컬 모델의 러닝이후 weight값을 모아 평균을 구하고, 이를 글로벌 모델에게

secure aggregation Protocol

KGC?

key generation server 약자.

trusted third party

middle server

데이터베이스 캐싱

링크

데이터베이스 모델

REST, HTTP API

REST 구성

  • 자원(resource) - URI
  • 행위(verb) - HTTP METHOD
  • 표현(representation)

REST 특징

1. uniform interface

유니폼 인터페이스는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍쳐 스타일을 의미한다.

2. stateless

REST는 무상태성을 가진다. 다시 말하자면, 작업을 위한 상태정보를 따로 저장하고 관리하지 않는다.

세션 정보나 쿠키 정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 된다. 때문에 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로서 구현이 단순해진다.

3. cacheable

REST의 가장 큰 특징 중 하나는 HTTP라는 기존 웹표준을 그대로 사용하기 때문에, 웹에서 사용하던 기존 인프라를 그대로 활용한다. 따라서, HTTP가 가진 캐싱 기능을 적용 가능하다. 기존 프로토콜에서 사용하는 last-modified, e-tag를 이용하면 캐싱 구현이 가능하다.

4. self-decriptiveness(자체 표현 구조)

REST API를 보고도 기능을 추론, 이해할 수 있다.

5. client - server 구조

REST서버는 API를 제공 클라이언트는 사용자 인증과 컨텍스트를 직접 관리하는 구조로 각각의 역할을 확실히 분할하기 때문에 서로간 의존성이 줄어든다.

6. 계층형 구조

REST 서버는 다중 계층으로 구성할 수 있다. 보안, 로드밸런싱, 암호화 계층을 추가해 구조상의 유연성을 확보하며 PROXY, GATEWAY등 네트워크 기반 중간매체를 둘 수 있음.

REST API 중심 규칙

  • URI는 정보 자원을 표현해야 한다.
  • HTTP METHOD는 자원에 대한 행위를 표현해야 한다.
GET /members/delete/1  (X)
DELETE /members/1  (O)

설계시 주의점

슬래시 구분자는 계층관계를 나타내는 데 사용한다.

http://restapi.example.com/houses/apartments
http://restapi.example.com/animals/mammals/whales

URI 마지막 문자로 슬래시를 포함하지 않는다.

URI에 포함되는 모든 글자는 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이다.

http://restapi.example.com/houses/apartments/ (X)
http://restapi.example.com/houses/apartments  (0)

가독성을 위해 하이픈(-) 사용

밑줄(_)은 사용하지 않는다.

가독성 관련 문제이다.

URI는 소문자가 적합하다.

RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문이다.

확장자는 포함하지 않는다.

js

es6?

const, let

const를 기본으로 사용한다. 이는 불변성을 말하는 것이 아니라 값을 재할당할 수 없다는 것이다. const를 사용하더라도 배열과 오브젝트의 값을 변경하는 것은 가능하다.

const declaration tells readers, “this variable is never reassigned,” reducing cognitive load and improving maintainability.

Block scope is common in many other programming languages and helps programmers avoid mistakes such as:

var count = people.length;
var enoughFood = count > sandwiches.length;

if (enoughFood) {
    var count = sandwiches.length; // accidentally overriding the count variable
    console.log("We have " + count + " sandwiches for everyone. Plenty for all!");
}

// our count variable is no longer accurate
console.log("We have " + count + " people and " + sandwiches.length + " sandwiches!");

arrow function

람다식, 익명함

람다식은 함수형 프로그래밍의 적합한 문법적 표현방식이다.

람다식은 결국 로컬 구현객체를 생성하게 되지만, 이의 사용 목적은 인터페이스가 가지고 있는 메소드를 간편하게 즉흥적으로 구현해서 사용하는 것이 목적이다.

반복문의 블럭 크기를 줄이고 프로그래머의 의도를 좀 더 간결히 나타낸다.(가독성) 지역적 사용으로 인한 함수에 대해 외부 노출을 피할 수 있다.

또한 high order function 함수형 프로그래밍으로 람다식을 사용하기도 한다.

https?

Transport Layer SecuritySecure Socket Layer 등의 프로토콜을 사용한다.

TLS는 핸드쉐이킹을 통해 서로 통신이 열리면 인증서와 키공유등을 통해 암호화 파라미터를 공유한다.

SSL의 경우 OSI 7계층중 특정 계층에 속해있는 것이 아닌 전송계층 과 응용계층 사이에 독립적인 계층을 만들어 동작한다.

index

MVC

디자인 패턴 중 하나로써 규약을 통해 쓉게 쓸 수 있는 형태로 만든 것이다.

비지니스 처리 로직과 사용자 인터페이스 요소를 분리시켜 서로 영향없이 개발할 수 있다.

이미지

model

모델은 어플리케이션의 정보, 데이터를 나타낸다. 정보의 접근, 가공을 책임지는 컴포넌트이다.

  1. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야한다.
  2. 뷰나 컨트롤러와 독립적이며 이에 대한 어떤 정보도 가지고 있지 않는다.
  3. 변경에 대한 통지방법을 구현해야 한다.

controller

데이터와 사용자 인터페이스 요소를 잇는 다리역할을 한다. 이벤트를 처리하며, 이는 모델이 “어떻게” 처리할지를 알려주는 컴포넌트이다.

view

화면에 보여주기 위한 역할을 하며, 최종 사용자에게 맞춤 UI를 제공한다,

TCP, UDP

TCP

  • 연결 지향형 프로토콜
  • 데이터 dropout을 방지하는 데이터 흐름제어를 한다.
  • 에러 메세지가 발생할 경우 자동으로 전송하는 에러제어
  • TCP 는 멀티캐스팅이나 브로드캐스팅을 지원하지 않는다.

UDP

  • 신뢰성있는 전송을 보장하지 않음.
  • 효율적이다.

스레드

스레드는 프로세스의 실행 단위라고 할 수 있다. 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유할 수 있다. 스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택으로 구성된다. 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다. 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것을 멀티스레딩이라고 한다. 이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 갖고 있다.

sql 엔진 차이점

https://rebeccajo.tistory.com/14

비 클러스터 인덱스

Non-Clustered Index는 데이터와 인덱스를 각각 다른 위치에 저장합니다. 인덱스는 해당 데이터의 위치에 대한 포인터를 포함하고 있습니다. Non-Clustered Index의 인덱스가 서로 다른 위치에 저장되므로 단일 테이블에는 많은 Non-Clustered Index가 있을 수 있습니다.

예를 들면, 책 한권은 내용을 빠르게 찾기 위해서 보통 두 가지 이상의 색인을 가지게 됩니다. 앞쪽에는 “목차” 기준으로 정렬되어 있고, 뒤쪽에는 “찾아보기”와 같은 용어에 대한 알파벳 순으로 표시하는 것을 볼 수 있습니다. 책을 테이블이라고 하고 목차, 찾아보기를 Non-Clustered Index로 생각하면 이해가 될 수 있습니다.

객체지향 프로그래밍이란

객체 지향 프로그래밍 이전의 프로그래밍 패러다임을 살펴보면, 중심이 컴퓨터에 있었다. 컴퓨터가 사고하는대로 프로그래밍을 하는 것이다. 하지만 객체지향 프로그래밍이란 인간 중심적 프로그래밍 패러다임이라고 할 수 있다. 즉, 현실 세계를 프로그래밍으로 옮겨와 프로그래밍하는 것을 말한다. 현실 세계의 사물들을 객체라고 보고 그 객체로부터 개발하고자 하는 애플리케이션에 필요한 특징들을 뽑아와 프로그래밍 하는 것이다. 이것을 추상화라한다.

OOP 로 코드를 작성하면 이미 작성한 코드에 대한 재사용성이 높다. 자주 사용되는 로직을 라이브러리로 만들어두면 계속해서 사용할 수 있으며 그 신뢰성을 확보 할 수 있다. 또한 라이브러리를 각종 예외상황에 맞게 잘 만들어두면 개발자가 사소한 실수를 하더라도 그 에러를 컴파일 단계에서 잡아낼 수 있으므로 버그 발생이 줄어든다. 또한 내부적으로 어떻게 동작하는지 몰라도 개발자는 라이브러리가 제공하는 기능들을 사용할 수 있기 때문에 생산성이 높아지게 된다. 객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수에 용이하다. 또한 데이터 모델링을 할 때 객체와 매핑하는 것이 수월하기 때문에 요구사항을 보다 명확하게 파악하여 프로그래밍 할 수 있다.

객체 간의 정보 교환이 모두 메시지 교환을 통해 일어나므로 실행 시스템에 많은 overhead 가 발생하게 된다. 하지만 이것은 하드웨어의 발전으로 많은 부분 보완되었다. 객체 지향 프로그래밍의 치명적인 단점은 함수형 프로그래밍 패러다임의 등장 배경을 통해서 알 수 있다. 바로 객체가 상태를 갖는다는 것이다. 변수가 존재하고 이 변수를 통해 객체가 예측할 수 없는 상태를 갖게 되어 애플리케이션 내부에서 버그를 발생시킨다는 것이다. 이러한 이유로 함수형 패러다임이 주목받고 있다.

함수형 프로그래밍

컨셉

  1. 변경 가능한 상태를 불변상태(Immutab)로 만들어 SideEffect를 없애자.
  2. 모든 것은 객체이다.
  3. 코드를 간결하게 하고 가독성을 높여 구현할 로직에 집중 시키자.
  4. 동시성 작업을 보다 쉽게 안전하게 구현 하자.

변경 가능한 상태를 불변상태(Immutable)로 만들어 SideEffect를 없애자.

함수의 기본은 f(x) = y, 한 번쯤은 봤을 법한 공식입니다. 쉽게 말해서 함수f()에 x 를 입력하면 항상 y라는 결과값이 나오는 것을 말합니다. 여기서 중요한 점은 함수 안에서 상태를 관리하고 상태에 따라서 결과값이 달라지면 안된 다는 말 입니다. 상태를 사용하지 않음으로 SideEffect를 사전에 차단 할수 있습니다. 또 변수 보다는 상수를 사용해 SideEffect를 차단합니다.

모든 것은 객체이다.

함수형 언어에서는 모든것이 객체입니다. 클래스 외에 함수 또한 객체 이기 때문에 함수를 값으로 할당 할수 있고, 파라미터로 전달 및 결과 값으로 반환이 가능합니다. 위 3가지를 만족하는 객체를 1급 객체 라고 합니다. 자바 8 이전에 함수는 위 3가지를 만족시키지 못해 함수가 1급 객체가 아니였지만 함수형 프로그래밍 언어에서는 3가지 조건을 만족시켜 함수가 1급 객체 입니다. 이전에 정리한 글에 보다 자세한 설명과 예제가 있습니다.

1급 객체란?

아래 3 가지조건을 충족한다면 1급 객체라고 할수 있습니다.

  1. 변수나 데이타에 할당 할 수 있어야 한다.
  2. 객체의 인자로 넘길 수 있어야 한다.
  3. 객체의 리턴값으로 리턴 할수 있어야 한다.

AOP

  • 핵심 기능 / 공통 기능을 구분하여, 공통 기능을 개발자의 코드 밖에서 필요한 시점에 적용하는 방법
  • Spring에선는 @Aspect 어노테이션을 통해, 공통 기능을 정의하고 그 기능이 사용될 시점을 적의 가능
  • Ex. 핵심 기능 = 비즈니스 로직 / 공통 기능 = logging, 보안, DB 연결 등

자바 컴파일

자바는 컴파일하여 바이트 코드로 변경 후 JVM이 바이트 코드를 해석(인터프리터, just-in-time 컴파일러)하여 기계어 캐싱을 통해 런타임한다.

String ,String Buffer, String Builder

스트링과 스트링 버퍼 빌더 차이는 mutable, immutable

그럼 두 클래스의 차이점은 무엇일까요? 바로 동기화 여부입니다.

  • StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원.
  • 반면, StringBuilder는 동기화를 보장하지 않음.

hahsmap, hashtable, concurrenthashmap

HashMap

  • HashMap은 synchronized 키워드가 없기 때문에 동기화가 보장되지 못한다. (싱글 스레드 환경에서 사용하길) 따라서 동기화처리를 하지 않기 때문에 값을 찾는 속도가 상당히 빠르다. 또한 HashTable과 다르게 key,value null값을 허용한다. 즉 속도가 빠르지만, 신뢰성 안정성은 떨어진다고 생각하면 된다.

ConCurrentHaspMap

  • HashMap의 멀티스레드 환경에서의 동기화처리로 인한 문제점을 보완한 것이 ConCurrentHashMap이다. 하지만 HashMap과 다르게 key,value에 null을 허용하지 않는다.

HashTable

  • HashTable의 메서드는 전부 synchronized 키워드가 붙어있기 때문에 메서드 호출 전 쓰레드간 동기화 락을 통해 멀티 쓰레드 환경에서 data의 무결성을 보장해준다. 또한 key,value값의 null을 허용하지 않는다. 즉 동기화 락때문에 속도는 느리지만, data의 안정성이 높고 신뢰가 높은 컬렉션이다.

샤딩, 레플리카

레플리카는 fail-over나 read/write 경합 감소(또는 제거), read 코스트 분산 등에 치중되어있다.

fail-over시에는 복제 디비를 둠으로써, 메인 디비가 장애가 생겨도 복제 디비에서 정상적인 서비스를 빠르게 구성할 수 있게 구성하는 것이 목적이다.

read/write node를 분리함으로써 성능 분산도 처리할 수 있다. (특히 경합이 이루어질 경우 성능 저하도 우회할 수 있다.)

샤딩의 목적은 데이터를 분산 저장함으로써, 트래픽 분산에 목적이 있다. 샤딩도 디테일에서 여러방식으로 갈리는데, 샤딩된 노드끼리 통신해야 할 경우에는 트래픽이 다시 몰리는 경우가 있다. (여러 노드의 데이터를 조합해서 결과를 내야 하기 때문)

샤딩은 분산된 데이터 그 자체로 의미가 있을 때는 샤딩 그 자체가 트래픽 분산이 깔끔하게 이루어진다. 실질적으로 이 경우는 샤딩이라 부르기보단 DB 분산 (또는 파티셔닝. 게임의 경우 월드 단위 DB를 따로 쓰는 등의)이라고 부르는 경우도 많은 것이 그 이유다.

js 깊은 복사 얕은 복사

일반 문자열 숫자 불린은 복사된 값이 영향을 미치지 못한다. 레퍼런스가 다르다.

하지만 객체 같은 경우는 같은 값을 참조한다. 같은 메모리 주소.

shallow copy는 js에서 가장 상위 객체만 생성되고 하위 객체들은 모두 참조값이 같은 경우다.

deep copy는 내부 객체까지 모두 다른 경우다.

자바스크립트 네이밍 컨벤션

변수, 인스턴스, 객체, 함수는 반드시 camelCase

생성자와 클래스는 반드시 PascalCase

trailing, leading underscores는 금지한다.

자바스크립트는 원래부터 private한 속성과 메서드가 존재하지 않는다.

array vs linked List

배열은 랜덤 엑세스가 가능한 상수시간 접근이 가능하다.

삭제가 오래걸린다.

전부다 떙기고 그래야 해서

배열은 전부다 shift 선형 링크드 리스트는 삭제할 자리를 찾는데 선형

코테

파스칼의 삼각형

퀵소트

피벗 정해서 그것보다 큰놈들 정리 그것보다 작은 놈들 정리

Refernce
  • https://www.a-mean-blog.com/ko/blog/MEAN-Stack/_/MEAN-Stack-%EC%86%8C%EA%B0%9C
  • https://meetup.toast.com/posts/92
  • https://github.com/Mrchanghao/Interview_Question_for_Beginner
  • https://velog.io/@godori/ES6-%EC%A0%95%EB%A6%AC-vpjmrh6hhe
  • https://eslint.org/docs/rules/no-var.html
  • https://medium.com/@lazysoul/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80-d881230f2a5e