본문 바로가기

프로그래밍/Node.js

[Node.js 요약 정리] 1. Node.js 개요

1. Node.js 개요

1) Node.js

- 정의: 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임

- 특징: 이벤트 기반, 논블로킹 I/O 모델을 사용해 가볍고 효율적

*이벤트 기반: 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미

*논블로킹 I/O: 논블로킹이란 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 뜻하며 현재 노드 프로세스 외의 다른 컴퓨팅 자원을 사용할 수 있는 I/O(입출력) 작업이 시간적 이득을 많이 얻음


2) 용어 정리

- 이벤트 루프: 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할 담당

- 태스크 큐: 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간

- 백그라운드: 타이머나 I/O 작업 콜백 도는 이벤트 리스너들이 대기하는 곳

- 프로세스: 운영체제에서 할당하는 작업의 단위로서 프로세스 간에는 메모리 등의 자원을 공유하지 않음

- 스레드: 프로세스 내에서 실행되는 흐름의 단위로서 부모 프로세스의 자원을 공유


3) 싱글 스레드

- 정의: 노드 프로세스는 하나의 스레드를 통해 작업을 수행

- 특징: 노드는 스레드를 늘리는 대신(멀티 스레드) 프로세스 자체를 복사해 여러 작업을 동시에 처리하는 멀티 프로세싱 방식을 채택

- 장점: 간편한 프로그래밍이 가능하며 Deadlock에 대한 우려가 없음

- 비고

*child_process.fork() API를 사용해서 프로세스 생성 가능

*내부적으로는 멀티 스레드를 사용하지만 개발자가 제어할 수 있는 스레드는 하나


4) 노드 서버의 장단점

- 노드 서버의 장단점은 싱글 스레드, 논블로킹 모델의 장단점과 크게 다르지 않음


*장점

- 자바스크립트 사용(JSON 형식과의 호환성 보장)

- 웹 서버가 내장되어 있어 입문자가 쉽게 접근 가능

- 멀티 스레드 방식에 비해 쉬운 프로그래밍 가능하며 자원을 적게 소모

- libuv 라이브러리를 사용하여 I/O 작업을 논블로킹 방식으로 처리해주기 때문에 I/O 작업이 많은 서버로 적합


*단점

- 싱글 스레드 방식으로 CPU 코어를 하나만 사용하며 스레드가 멈추면 서버 전체가 정지

- 비동기에 강점을 보이는 언어나 로드 밸런싱에 특화된 서버에 비해 느린 속도

- 서버 규모가 커졌을 때 관리가 어려움

- 미디어 데이터 처리 혹은 대규모 데이터 처리와 같이 CPU를 많이 사용하는 작업을 위한 서버로는 부적합