아래 내용은 [Node.js 교과서] 책 기반의 내용입니다.
1.1 핵심 개념 이해하기
노드가 무엇인지에 대해서 여러 가지 의견이 많지만, 어떠한 설명도 노드 공식 사이트의 설명보다 정확하지는 않을 것입니다.
Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다. Node.js는 이벤트 기반, 논블로킹 I/O 모델을 사용해 가볍고 효율적입니다. Node.js의 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다.
1.1.1 서버
노드를 통해 다양한 자바스크립트 어플리케이션을 실행할 수 있지만, 노드는 서버 어플리케이션을 실행하는 데 제일 많이 사용됩니다.
서버는 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말합니다.
서버는 클라이언트의 요청에 대해 응답을 합니다.
- 노드는 자바스크립트 애플리케이션이 서버로서 기능하기 위한 도구를 제공하므로 서버 역할을 수행할 수 있습니다.
1.1.2 자바스크립트 런타임
노드는 자바스크립트 런타임입니다.
런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻합니다. 따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있게 해줍니다.
1.1.3 이벤트 기반
이벤트 기반이란?
이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다. 이벤트로 클릭이나 네트워크 요청 등이 있을 수 있습니다.
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야 합니다.
-> 이것을 이벤트 리스너에 콜백함수를 등록한다고 표현합니다.
노드도 이벤트 기반 방식으로 동작하므로 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출합니다. 발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면 노드는 다음 이벤트가 발생할 때까지 대기합니다.
이벤트 기반 모델에서는 이벤트 루프라는 개념이 등장합니다.
여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 이벤트 루프가 판단합니다.
노드는 자바스크립트 코드의 맨 위부터 한 줄씩 실행한다. 함수 호출 부분을 발견했다면 호출한 함수를 호출 스택에 넣습니다.
function first(){
second();
console.log("첫번째");
}
function second(){
third();
console.log("두번째");
}
function third(){
console.log("세번째");
}
first();
세번째
두번째
첫번째
function run() {
console.log('3초 후 실행');
}
console.log('시작');
setTimeout(run, 3000);
console.log('끝');
시작
끝
3초 후 실행
콘솔 결과는 쉽게 예측할 수 있지만, 호출 스택으로 설명하기는 힘듭니다.
setTimeout 함수의 콜백인 run이 호출 스택에 언제 들어가는지 알기 어렵기 때문입니다. 이를 파악하기 위해서는 이벤트 루프, 태스크 큐, 백그라운드를 알아야 합니다.
- 이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당합니다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 불립니다.
- 태스크 큐 : 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간입니다. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서 있으므로 콜백 큐라고도 부릅니다.
- 백그라운드 : 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳입니다.
1.1.4 논블로킹 I/O
이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있습니다.
논블로킹 방식이란?
- 오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 그 함수가 다시 태스크 큐를 거쳐 호출 스택으로 올라오기를 기다리는 방식입니다.
- 논블로킹이란 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 뜻합니다.
1.1.5 싱글 스레드
이벤트 기반, 논블로킹 모델과 더불어 노드를 설명할 때 자주 나오는 용어가 하나 더 있습니다. 바로 싱글 스레드입니다.
노드는 싱글 스레드이므로 주어진 작업을 혼자서 처리해야 합니다. 반대로 멀티 스레드인 시스템에서는 여러 개의 스레드가 일을 나눠서 처리할 수 있습니다.
자바스크립트와 노드에서 논블로킹이 중요한 이유는 바로 싱글 스레드이기 때문입니다.
- 프로세스
- 운영체제에서 할당하는 작업의 단위
- 노드나 인터넷 브라우저 같은 프로그램은 개별적인 프로세스입니다.
- 프로세스 간에는 메모리 등의 자원을 공유하지 않습니다.
- 스레드
- 프로세스 내에서 실행되는 흐름의 단위
- 하나의 프로세스는 스레드를 여러 개 가질 수 있습니다.
- 스레드들은 부모 프로세스의 자원을 공유합니다.
- 같은 메모리에 접근할 수 있습니다.
노드는 스레드를 늘리는 대신, 프로세스 자체를 복사해 여러 작업을 동시에 처리하는 멀티 프로세싱 방식을 택했습니다. 자바스크립트 언어 자체가 싱글스레드 특성을 띠고 있기 때문입니다.
1.2 서버로서의 노드
노드가 싱글 스레드, 논블로킹 모델을 사용하므로 노드 서버 또한 동일한 모델일 수 밖에 없습니다.
노드 서버의 장단점은 싱글 스레드, 논블로킹 모델의 장단점과 크게 다르지 않습니다.
장점 | 단점 |
멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용 | 싱글 스레드라서 CPU 코어를 하나만 사용함 |
I/O 작업이 많은 서버로 적합 | CPU 작업이 많은 서버로는 부적합 |
멀티 스레드 방식보다 쉬움 | 하나뿐인 스레드가 멈추지 않도록 관리해야 함 |
웹 서버가 내장 | 서버 규모가 커졌을 때 서버를 관리하기 어려움 |
자바스크립트 사용 | 어중간한 성능 |
JSON 형식과 호환되기 쉬움 |
개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는 데 적합합니다. 네트워크나 덷이터베이스, 디스크 작업 같은 I/O에 특화되어 있기 때문입니다.
실시간 채팅 어플리케이션이나 주식 차트, JSON 데이터를 제공하는 API 서버가 노드를 많이 사용합니다.
'프로그래밍 > NestJS' 카테고리의 다른 글
NestJS + Swagger Decorator (0) | 2023.01.23 |
---|---|
NestJS+ Swagger 간편하게 사용하기 (0) | 2023.01.23 |
NestJS@9.x.x & TypeORM@0.3.x에서 customRepository 쉽게 사용하기 (0) | 2023.01.23 |
ERESOLVE unable to resolve dependency tree 에러 해결하기 (0) | 2023.01.23 |
RepositoryNotFoundError: No repository for "BoardRepository" was found. 에러 해결하기 (0) | 2023.01.23 |