진행중인 SFS 프로젝트에서도 Node.js를 사용하고 Node.js관련 면접 준비할 겸 [Node.js 교과서]로 공부한 내용을 정리하고자 한다. 추후에는 [Node.js 디자인 패턴]로 공부한 내용도 추가할 것이다.
Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다. Node.js는 이벤트 기반, 논블로킹 I/O모델을 사용해 가볍고 효율적입니다. Node.js의 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다.
이벤트 기반 : 이벤트가 발생할 때 미리 저장해둔 작업을 수행하는 방식을 말한다. ex) 클릭이나 네트워크 요청 등이 있다.
Node.js도 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출한다.
Node.js 내부 구조
이벤트 루프 동작 방식
1. 매크로 태스크 큐에서 가장 오래된 태스크 를 꺼내서 실행시킨다.
2. 마이크로 태스크 큐에 있는 모든 태스크를 실행시킨다.
3. 렌더링 작업을 실행한다.
4. 매크로 태스크 큐에 새로운 매크로 태스크가 나타날 때까지 대기한다.
5. 1번으로 돌아간다.
논블로킹 : 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 뜻한다.
출처 : Node.js 교과서(저자 : 조현영)
블로킹보다 논블로킹 방식이 같은 작업을 더 짧은 시간 동안 처리할 수 있다.
하지만 싱글 스레드라는 한계 때문에 자바스크립트의 모든 코드가 이 방식으로 시간적 이득을 볼 수 있는 것은 아니다. => 노드 프로세스 이외 다른 컴퓨팅 자원을 사용할 수 있는 I/0 작업이 주록 시간적 이득을 많이 보기 때문에 이를 고려하면 좋을 것 같다.
논블로킹,블로킹 / 동기, 비동기에 대한 너무 잘 정리된 블로그를 발견해서 첨부한다.
스레드(Thread) : 프로세스 내에서 실행되는 흐름의 단위. 하나의 프로세스는 스레드를 여러개 가질 수 있음. 스레드들은 부모 프로세스의 자원을 공유
프로세스(Process) : 운영체제에서 할당하는 작업의 단위. Node.js나 인터넷 브라우저 같은 프로그램은 개별적인 프로세스. 프로세스 간 메모리 자원 공유 X
노드 프로세스는 내부적으로 스레드를 여러개 가지고 있지만 직접 제어할 수 있는 스레드는 하나 뿐 👉🏻 싱글 스레드라고 부름
싱글 스레드, 논블로킹 모델
출처 : Node.js 교과서(저자 : 조현영)
👉🏻 Node.js에서는 cluster와 pm2 패키지를 통해 프로세스 자체를 복사해 여러 작업을 동시에 처리하는 멀티 프로세싱 방식 채택
장점 | 단점 | 단점 커버 |
---|---|---|
멀티 스레드 방식에 비해 컴퓨터 자원 적게 사용 | 싱글 스레드라서 CPU 코어 하나만 사용 | 멀티 프로세싱으로 커버 |
I/O 작업이 많은 서버로 적합 | CPU 작업이 많은 서버로는 부적합 | AWS Lambda나 Google Cloud Functions 같은 서비스에서 작업 처리 지원해줌으로써 커버 |
멀티 스레드 방식보다 쉬움 | 하나뿐인 스레드가 멈추지 않도록 관리해야 함 | try catch문으로 에러처리로 커버 |
웹 서버가 내장되어 있음 | 서버 규모가 커졌으 때 서버를 관리하기 어려움 | nginx 등의 웹서버와 노드 서버 연결로 극복 |
자바스크립트를 사용함 | 자바스크립트 자체의 문제점(ex. 암시적 형변환 등..) | Typescript를 사용해 커버 |
JSON 형식과 호환하기 쉬움 |
👉🏻 에어비엔비, 우버, 넷플릭스, 링크드인, 페이팔, 월마트, 이베이 등에서 Node.js를 사용 중.