Node.js 개요
Node.js
- V8 엔진에 기반해 만들어진 자바스크립트 서버 사이드 플랫폼
- Event Driven
- Single Thread
- Non-blocking I/O
- 변수 선언은 var, let, const 이용
Event Loop
- 시스템 커널에 작업을 떠넘겨 non-blocking I/O 작업을 수행할 수 있게 해준다.
- 완료시 커널이 Node.js에 알려 주어 적절한 콜백을 poll 큐에 추가할 수 있게 하여 실행되게 한다.
- 여러 단계의 이벤트 큐로 이루어짐 (timer, pending callbacks, …)
- 싱글 쓰레드로 관리된다.
알아둬야할 점
- 이벤트 루프가 싱글 쓰레드로 관리된다는 것이 Node.js가 싱글 쓰레드로 동작한다는 의미는 아니다. (실제 코드 상 실행 지점이 한 곳이라고 생각하면 된다.)
- Node.js는 내부적으로 쓰레드풀을 생성해 I/O 작업을 할당시켜 병렬 작업을 가능하게 한다.
- worker_threads 라는 모듈을 이용해 직접 쓰레드풀에 쓰레드를 생성할 수 있다. 하지만, 쓰레드 생성 자체가 시간을 많이 사용하는 작업이기 때문에 오히려 성능을 낮출 수 있으므로 잘 판단해서 사용해야 한다.
blocking vs non-blocking I/O
- I/O : libuv가 지원하는 시스템 디스크나 네트워크와 상호작용하는 것
- blocking : 해당 작업이 완료될 때까지 기다려야 함 (node.js가 멈춤)
- nonblocking : 해당 작업이 끝나면 콜백으로 알려줌 (성능 향상)
var, let, const
- var : function scope, 함수의 맨 위로 hoisting 되며 재선언 가능 (but, var로 선언된 변수는 호이스팅되지 않는다.)
- let : block scope, 변수 재선언이 불가능하고, 값에 대한 변경이 가능하다.
- const : block scopoe, 변수 재선언이 불가능하고, 값에 대한 변경 역시 불가능하다. (다른 언어와 마찬가지로 object 내의 필드 변경은 가능)
- let,const 둘 다 블록 스코프로 hoisting 일어나지만, TDZ(Temporal Dead Zone)으로 인해 선언 전 변수 접근이 불가능하다.
NPM (Node Package Manager)
- NPM 공식 사이트
- 해당 기능을 통해 Node.js 오픈 라이브러리들을 쉽게 설치할 수 있다. (프라이빗 모듈도 토큰을 등록해 사용할 수 있음)
- 특정 라이브러리를 install하는 경우 package.json에 저장
- npm install을 칠 경우 package.json에 저장된 모듈들을 설치해준다.
- typescript 라이브러리의 경우에는 타이핑을 따로 지원하는 경우가 많다 (@types/library_name) 을 통해 검색해보면 있는지 없는지 알 수 있다.
NVM (Node Version Manager)
- 여러 버전의 Node를 설치, 관리하기 용이하게 해준다.
nvm i 10 # node 버전 10 설치
node -v # 사용 중인 버전 확인
nvm alias default 10 # 버전 10을 디폴트로 사용
nvm use 10 # 버전 10을 사용