NodeJS
JS
의 runtime
, 자바스크립트가 돌아가는 환경을 말하며 웹 브라우저 외의 영역인 서버측에서 자바스크립트 언어를 사용 할 수 있게 해준다.
- 각 브라우저별로 엔진이 존재하며, 해당 엔진은 아래와 같다.
브라우저 | 엔진 |
---|
Chrome | V8 |
IE | Chakra |
Firefox | Spider monkey |
Safari | JavaScriptCore |
- 여기서 크롬 브라우저의
V8
엔진이 NodeJS
에 들어가있고, 엔진의 역할은 자바스크립트 언어를 기계어로 해석하는 역할을 한다.
특징
- Single thread non-blocking I/O
- 입출력은 싱글 스레드, 실질적인 작업은 이벤트 루프에 의해 멀티 스레드로 실행.
- 간단한 작업에 관해 고효율
- CPU intensive한 작업에 관하여 비효율
- Interprete language(인터프리터 언어)
- 동기적 언어가 비동기적으로 움직이는법 아래 링크 클릭
Single thread
- 하나의 스레드가 모든 작업 수행.
- 단일 스레드 이므로 메모리 사용량이 적다.
- 스레드 하나가 무너진다면 프로그램 전체에 문제가 발생.
- 메모리 사용량이 적기때문에 CPU사용률이 높은 어플리케이션에서는
NodeJS
사용을 권장하지 않는다.
- 단일 스레드 이기 때문에 하나의 작업 시간이 많이 걸리면 전체 시스템의 성능이 떨어짐.
I/O
- 입렵과 출력,
Input
Output
을 의미하며 파일 읽기, 쓰기, 폴더 생성이나 네트워크 요청 등이 대표적인 예시.
Blocking I/O
- 하나의 프로세스가 어떤 자원을 사용하고자 할 때 그 자원을 다른 프로세스가 점유하고 있다면, 그 프로세스가 자원의 사용을 마칠 때까지 기다리는 것. 이때 기다리고있는 프로세스는
blocked
되었다고 표현하며 실제로 아무것도 하지 않는다.
- 여러개의 스레드를 사용한다 해도
CPU
또한 한정적인 자원이기 떄문에 CPU
를 차지하기 위한 스레드의 대기시간이 필요함.
- 추가로 스레드에게 자원을 분배하기 위해 사용하는 스케줄링도
CPU
를 이용해 연산이 필요한 작업이기 때문에 쓰레드가 많아질수록 이부분에 대한 성능저하가 발생함.
- 위 설명은
single thread
가 multi thread
보다 좋다는 뜻은 아니며 단지 특징을 설명하는 내용이기 떄문에 상황에 맞게 사용하는게 좋습니다.
Single thread non-blocking I/O
- 위의 문제를 보안하기 위해
NodeJS
는 싱글 스레드, 이벤트 기반 논 블로킹 I/O를 채택하였다.
- 때문에 스레드가 한개여도 처리 완료에 대한 응답을 기다리지 않고 콜백 등록 후 다음 작업으로 바로 넘어갈 수 있다.
- I/O 요청에 대한 작업을 완료하지 않아도 해당 작업은 이벤트 루프에 의해 내부적으로 따로 작동하기 때문에 스레드는 다음 요청으로 건너뛸 수 있다.
- 바로 이 이유 때문에
NodeJS
는 싱글 스레드 이지만 간단하고 많은 작업에 대해서 고성능이라고 할 수 있다.
- 요청이 많은 SNS, 채팅 등이 적합하다.
Interprete language
- 스크립트 언어의 특성 상 해당 언어가 수행되어야 에러가 나는지 확인할 수 있고, 에러가 날 경우 프로세스가 종료됨(잘죽음).
- 실제로 AWS EC2에서 도커로 배포 후 며칠 후 실행 시간을 보니 DB는 계속 살아있었지만 서버는 죽었다가 재시작된걸 확인 할 수 있었다.
추가(중요)
- WebAPI와 같이 비동기적으로 작동하는 함수들은 JS 환경에서 요청이 생성되지만 실행 되는 환경은 JS가 아닌 커널에서 작동된다 (JS 외부).
- 이것이 동기적 언어인 JS가 비동기적으로 작동하는 것처럼 보이는 핵심적인 이유이다.
도움이 될만한 사이트