Node Js를 사용하는 백엔드 개발자를 위한 면접 질문을 정리하고 있습니다. 아래에 계속 업데이트 될 예정입니다. 아직은 정리중이니 감안하고 봐주시길 바랍니다.
특징
장점
단점
특징
장점
단점
HTTP 특징
Connection 프로토콜(비연결지향) : 클라이언트가 서버에 요청을 하면 응답을 보낸 후 연결을 끊는 처리방식
Stateless 프로토콜(상태정보 유지 안함) : 클라이언트의 상태 정보를 가지지 않는 서버 처리 방식
⇒ Stateful의 경우에 대처하기 위해 쿠키와 세션을 사용, 둘의 가장 큰 차이점은 상태 정보 저장 위치
세션 vs 쿠키
세션은 보안이 쿠키보다 좋으나 서버에 저장돼 서버 자원을 사용하기 때문에 사용자가 많을 경우 소모되는 자원이 많음. 자원 관리 차원에서 쿠키와 세션을 적절히 병행 사용하며 서버 자원의 낭비를 방지하여 웹사이트 속도를 높일 수 있음.
세션
특징
동작 순서
쿠키
특징
HTTP의 일종으로 사용자가 어떤 웹사이트에 방문할 경우 그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 정보 기록 파일
HTTP에서 클라이언트의 상태 정보를 클라이언트 PC에 저장하였다가 필요시 정보를 참조, 재사용 가능
쿠키의 동작 순서
DOM 이벤트를 기반으로 실행하는 자바스크립트를 성능상의 이유로 제어하는 방법
Devops
특징
장점
단점
컨테이너
웹서버 : 정적인 사이트 ex. 이미지, 파일, CSS, HTML ⇒ nginx, apache, IIS등
웹어플리케이션 : was, 동적인 사이트 : 로그인, 디비 접속등 (프로세스 실행+서버자원 최적화/프로세스 수 혹은 메모리 조절)⇒ phusion passenger, apache tomcat JBoss
보통은 두개 다 같이 사용
클라이언트와 서버 사이에 존재, 스케일 아웃(서버의 확장성)을 높일 수 있음. 다만 로드밸런서에 문제가 생길 경우 전체 서비스가 작동하지 않는 다는 단점이이씀.
서버 단위의 로드밸런서 말고도 앱 단위의 로드밸런서가 있음.
보안을 위해 IP나 포트를 이용해 정의 하는 서버 접속 규칙
공개키, 개인 키
app.enableCors()
(NEST의 예시)Javascript
자바스크립트는 single-thread
기반의 언어입니다. 즉, 자바스크립트는 하나의 호출 스택을 가집니다. 하나의 호출 스택을 가진 단일 스레드로 동작하는 자바스크립트에서 어떻게 동시성을 지원할까요? 답은 이벤트 루프입니다. 자바스크립트는 이벤트 루프 기반의 비동기 방식으로 Non-Blocking IO를 지원합니다.
비동기 함수들이 실행될 때 task-queue에 등록이 되는데 이러한 함수들이 완료된 후에 콜스택이 비워진 후 실행되게 됩니다. 이 과정에 call stack에 남은 task가 있는지 task queue에 종료된 task가 있는지 확인하는 과정이 있습니다. 이건 while문처럼 매번 task queue를 확인 하는 형태를 띄고 있는데, 이것을 event loop라고 합니다.
set-timeout에 숫자 0을 넣어 실행하는 경우가 가끔 있습니다. 얼핏보면 0초 후에 실행되니 바로 실행 되는 것으로 보일 수 있지만 이것은 비동기 함수를 이용하여 taskqueue에 등록하는 방법으로 모든 함수가 실행된 후에 실행되도록 하는 방법입니다.
string, number, bigint, boolean, undefined, Null, ES6 부터 추가된 symbol
Object 형식의 타입, 주소를 참조하여 메모리에 저장된 것을 갖고 옴. 참조한 값이 바뀌면 자동으로 바뀜.
변수 선언이 어디에 있든 상관없이 다른 코드보다 먼저 실행되는 특징
console.log(kmj) // output: undefined
var kmj
var 는 es6이전의 변수할당 문법이고, let const 는 es6문법으로 동일하게 변수를 선언할 때 사용 합니다
let,const 는 var 와 다르게 재 선언이 불가하고
var의 경우 호이스팅 으로 인하여 선언 된 라인 이전에 var 값을 사용할 수 있지만 let,const는 그러지 못합니다.
이는 호이스팅 즉 변수들을 해당 스코프의 최상위로 올리는 과정에서 var는 선언과 동시에 초기화가 되지만 let,const는 초기화가 되지 않아서 그렇습니다
또한
var는 함수레벨 스코프를, let,const는 블록 스코프를 가지는 차이가 있습니다
식별자(ex. 변수명, 함수명, 클래스명 등)의 유효범위를 뜻하며, 선언된 위치에 따라 유효 범위가 달라진다. 전역에 선언된 변수는 전역 스코프를, 지역에 선언된 변수는 지역 스코프를 갖는다.
전역 변수는 어디에서든지 참조가 가능한 값이다. 반면, 지역 변수는 함수 몸체 내부를 말한다. 따라서 지역 변수는 자신의 지역 스코프와 그 하위 지역 스코프에서 유효하다.
한 가지 주의해야 할 점은, 자바스크립트에서 모든 코드 블록(if, for, while, try/catch 등)이 지역 스코프를 만들며, 이러한 특성을 블록 레벨 스코프라 한다. 하지만 var 키워드로 선언된 변수는 오로지 함수의 코드 블록만을 지역 스코프로 인정한다. 이를 함수 레벨 스코프라 한다.
전역 변수로 인해 재할당이 발생하거나, 전역 스코프를 공유하기 때문에 어딘가에 동일한 이름이 있다면 예상치 못한 결과를 가져올 수 있는 위험이 있다. 따라서 오로지 함수 코드 블록만을 지역 스코프로 인정하는 var
대신, 블록 레벨 스코프를 지원하는 const
와 let
을 사용하는 것을 권장한다
모든 코드 블록(함수, if 문, for 문, while 문, try/catch 문 등) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다. 즉, 코드 블록 내부에서 선언한 변수는 지역 변수이다.
자바스크립트 비동기 처리에 사용되는 객체
싱글스레드인 자바스크립트는 기본적으로 동기식이지만, API에 요청을 보낼 때 응답이 올 때까지 마냥 기다리기만 할 수 없기 때문에 비동기 처리가 필요하다.
하지만 비동기 처리를 할 경우, 의도하지 않은 순서로 함수가 실행될 수 있기 때문에 원하는 부분에서 동기 방식으로 변환을 해줘야 한다.
첫번째 방식이 지난번에 살펴본 콜백함수이다. 콜백함수는 함수안에서 또 다른 함수를 호출하는 것인데 여러 함수를 순서대로 호출할 필요가 있을 경우 콜백지옥을 경험하게 되는 문제점이 있다.
숫자 n 을 파라미터로 받아와서 다섯번에 걸쳐 1초마다 1씩 더해서 출력하는 작업을 setTimeout 으로 구현해보자.
Promise는 성공할 수도 있고, 실패할 수 도 있다. 성공할 때는 resolve 함수
를 호출하고, 실패할때는 reject 함수
를 호출한다.
https://mjn5027.tistory.com/85
Database
**데이터베이스키 종류**
• 후보키 : 유일성과 최소성을 만족한 키
◦ 유일성 : 해당 키로 하나의 튜플을 식별할수있음
◦ 최소성 : 꼭 필요한 속성으로만 이루어짐
• 기본키 : 후보키들 중 하나, Null 가질 수 없음, 동일한 값을 가질수없음
• 대체키/보조키 : 기본키를 제외한 후보키
• 외래키 : 다른 릴레이션의 속성, 참조 관계를 표현하는 데에 쓰임
• 슈퍼키 : 유일성은 만족하지만 최소성은 만족하지 못하는 키
두 가지 이상의 릴레이션을 연결해서 데이터를 검색하는 기법
RDBMS에서는 릴레이션끼리 관계를 가지고 있는데, 각 테이블에 저장된 데이터를 효과적으로 검색하기 위해 조인이 필요하다.내부 조인, 외부 조인, 셀프 조인
동등 조인(EQUI Join) : 동등 비교(=) 사용
Left Outer Join : 좌측 테이블의 모든 결과값 포함
2.Right Outer Join : 우측 테이블의 모든 결과값 포함
해커에 의해 조작된 쿼리문에 DB에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법
파티셔닝
• 데이터를 여러 DB에 분산시키는 것
• X테이블의 일부 데이터는 A에, Y테이블의 일부 데이터는 B에
수평 단편화/수평 파티셔닝/샤딩
• 데이터를 수평으로 쪼갠다
수직 단편화/수직 파티셔닝
• 수직으로 칼럼을 쪼갬
• 칼럼을 나눠서 새로운 테이블로 갖고있는 것
• 특정 컬럼이 빈번하게 참조될때, 여러 데이터가 캐시에 올라갈수있음
ORM (Object - Relation Mapping)
• 객체-관계 매핑
• 객체지향적인 코드로 비즈니스 로직에 집중 가능
• 객체와 RDBMS간의 매핑을 하는 것
• 재사용 및 유지보수 용이
• DBMS에 대한 종속성 감소
NoSQL
• RDBMS와 달리 다른 형태의 데이터 저장
• 데이터 간의 관계 저장하지않음
• 고정되지않은 테이블 스키마
장점
• 유연함, 언제든지 저장된 데이터를 조정하고 새로운 필드를 추가할수있음
• 데이터는 애플리케이션이 필요로 하는 형식으로 저장됨
단점
• 중복을 계속 업데이트해야 함
• 데이터 구조 결정을 미루게 될 수 있음
• 수정 시 중복된 모든 컬렉션에서 수행해야함
DB의 구조와 제약조건에 관해 명세를 기술한 것
• 가상테이블
• 보안관리, 편의, 수행속도 향상
• 저장장치 내에 물리적으로 존재하지는 않음
• 필요한 데이터만 뷰로 정의할수있음
• 독립적 인덱스 불가능, CRUD에 제약이 있음
데이터의 중복으로 인한 부작용을 말합니다
1. 삽입 이상 : 데이터를 삽입하는 데 필요없는 속성도 함께 추가해야함
1. 갱신 이상 : 데이터를 갱신한 이후 일관성이 위반됨
1. 삭제 이상 : 데이터를 삭제하는 데 의도하지 않은 것이 함께 삭제됨, 정보 손실이 일어남
정규화란 RDBMS에서 중복을 최소화하기 위해 데이터를 분해하는 작업을 말합니다.
정규화를 함으로써 이상현상을 방지할 수 있다는 장점이 있고, 릴레이션 간의 연산이 많아질 수 있다는 단점이 있습니다.
반정규화는 성능 향상을 위해 중복,통합을 하는 기법이다.
조인으로 인한 성능 저하가 예상되는 경우 반정규화를 실행한다.
반정규화를 과도하게 적용하면 무결성이 깨질수있다.정규화의 종류에 대해서 말해보세요.
제 1 정규형 : 도메인이 원자값만을 포함함
제 2 정규형 : 완전 함수적 종속
제 3 정규형 : 기본키에 대해 이행적 종속 제거
BCNF 정규형 : 모든 결정키가 후보키함수적 종속성이란 무엇인가요?
X → Y
: 릴레이션 R에서 X값을 알면 Y를 알 수 있고, X 값에 의해 Y값이 달라질 때, Y는 X에 함수적 종속이다.
• RDBMS에서 검색 연산의 속도를 높이기 위한 방법
• 항상 정렬된 상태를 유지하므로 탐색이 빠르다
• 데이터 삽입/삭제/수정 시에는 추가적인 작업이 필요하므로 실행 속도가 느려진다.
• 저장 성능을 희생하고 데이터 읽기 속도를 높이는 기능
인덱스 자료구조
• B+- Tree : 일반적으로 사용됨
• Hash : 해시 값을 계산해 검색하므로 빠르나 부분 검색을 할 수 없음
인덱스를 사용하면 좋은 경우
• where 절에서 자주 사용되는 Column
• 외래키에 사용되는 Column
• Join에 자주 사용되는 Column
인덱스를 피해야 하는 경우
• 데이터의 중복도가 높은 Column
• 삽입, 삭제, 수정 연산이 자주 일어나는 Column
B Tree 인덱스 알고리즘 : 칼럼의 값을 변형하지 않고 원래의 값으로 인덱싱, 등호 뿐만 아니라 부등호 연산에도 적용 가능
Hash 인덱스 알고리즘 : 해시값을 이용해 인덱싱
클러스터드 인덱스
• 테이블당 하나만 생성 가능
• 인덱스로 지정한 열에 맞춰 자동 정렬
비클러스터드 인덱스
• 테이블당 여러개 생성 가능
데이터베이스의 상태를 변경시키는 작업의 단위
4가지 특징 ACID
• Atomicity(원자성) : 트랜잭션의 연산은 모두 반영되어야하며, 하나라도 실패하면 모두 취소되어야한다.
• Consistency(일관성) : 트랜잭션을 성공하면 언제나 일관성있는 데이터베이스 상태로 변화한다.
• Isolation(독립성, 격리성) : 둘 이상의 트랜잭션이 동시에 수행되는 경우 다른 트랜잭션의 연산에 끼어들수없다.
• Durability(지속성) : 완료된 트랜잭션은 영구적으로 반영되어야한다.
트랜잭션 격리 수준(Isolation level)
: 트랜잭션에서 일관성 없는 데이터를 허용하는 수준
1. 레벨 0 - Read Uncommitted 트랜잭션에 처리중이거나, 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용함
레벨 1 - Read Committed Commit이 이루어진 트랜잭션만 조회 가능
레벨 2 - Repeatable Read 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장함 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 불가능
레벨 3 - Serializable 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능
Commit
• 모든 작업을 정상적으로 처리하겠다고 확정하는 명령
• 실제 DB에 저장
• Commit 수행 후 하나의 트랜잭션을 종료하게 됨
Rollback
• 작업 중 문제가 발생하면 변경사항을 취소하고 트랜잭션을 종료함
• 이전 commit까지만 복구함
장점
• 데이터 무결성 보장
Typeorm이 속도가 더 빠름
dI(dependency injection)
was와 ws의 차이
와우 감샴다