Node.js는 크롬 V8 자바스크립트 엔진을 기반으로 빌드된 자바스크립트 런타임입니다.
Node.js의 등장으로 자바스크립트는 HTML과 브라우저의 종속성에서 벗어나, 브라우저 없이도 실행 가능한 언어로 확장되었습니다.
Node.js란 ?
- 자바스크립트와 Node.js의 차이
- 자바스크립트는 프로그래밍 언어입니다.
- Node.js는 자바스크립트 런타임으로, 자바스크립트로 작성된 프로그램을 실행할 수 있는 환경을 제공합니다.
- Node.js는 서버인가요?
- 아닙니다. Node.js는 서버 역할도 수행할 수 있는 자바스크립트 런타임입니다.
- Node.js는 HTTP, HTTPS, HTTP/2 등 서버 실행에 필요한 모듈을 제공하며, 이를 활용해 자바스크립트로 작성된 서버를 실행할 수 있습니다.
Node.js의 핵심 구성 요소
- V8 엔진
- 오픈 소스 자바스크립트 엔진으로, 구글 크롬 브라우저에서 사용됩니다.
- 자바스크립트 코드를 고성능으로 실행합니다.
- libuv
- 이벤트 기반, 논블로킹 I/O 모델을 구현한 라이브러리입니다.
- Node.js의 주요 특징인 비동기 I/O와 이벤트 루프를 지원합니다.
Node.js의 주요 특징
- 논블로킹 I/O 모델
- 오래 걸리는 작업(예: 파일 시스템 접근, 네트워크 요청, 데이터 압축)을 백그라운드에서 처리합니다.
- 메인 스레드는 다음 코드를 계속 실행하며, 작업 완료 시 비동기 방식으로 응답을 처리합니다.
- 일부 작업(I/O)은 백그라운드에서 병렬로 처리되고, 나머지 작업은 싱글 스레드로 실행됩니다.
- 싱글 스레드와 멀티 스레드
- Node.js는 싱글 스레드 기반으로 동작합니다.
- 그러나 내부적으로 멀티 스레드를 활용하며, 프로그래머가 직접 다룰 수 있는 스레드는 하나뿐입니다.
- 멀티 프로세스 활용
- Node.js는 멀티 스레드 대신 멀티 프로세스를 활용하는 경우가 많습니다.
- 프로세스: 운영체제에서 할당하는 작업의 단위 (프로세스 간 작업 공유 불가).
- 스레드: 프로세스 내에서 실행되는 작업의 단위 (부모 프로세스의 자원을 공유).
싱글 스레드와 논블로킹 I/O의 장단점
- 싱글 스레드 모델
- 장점:
- 프로그래밍 난이도가 비교적 쉽습니다.
- CPU와 메모리 자원을 적게 사용합니다.
- 단점:
- 블로킹 작업 발생 시 다른 작업이 모두 대기 상태가 됩니다.
- 에러 처리 실패 시 서버가 멈출 수 있습니다.
- 장점:
- 멀티 스레드 모델
- 장점:
- 에러 발생 시 새로운 스레드를 생성해 문제를 극복할 수 있습니다.
- 단점:
- 프로그래밍 난이도가 높습니다.
- 새로운 스레드 생성이나 유휴 스레드 관리에 비용이 발생합니다.
- 스레드 수만큼 자원을 많이 사용합니다.
- 장점:
Node.js 서버의 특징
- Node.js는 서버를 구성할 수 있는 다양한 모듈을 제공합니다.
- HTTP/HTTPS 모듈을 활용해 서버를 손쉽게 구축할 수 있으며, 논블로킹 I/O 모델로 높은 성능을 발휘합니다.
실행 예제와 결과
동기적 실행 예제
function longRunningTask() {
console.log('작업 끝');
}
console.log('시작');
longRunningTask();
console.log('다음 작업');
시작
작업 끝
다음 작업
모든 작업이 순차적으로 실행됩니다.
하나의 작업이 완료될 때까지 다음 작업은 대기합니다(블로킹 방식).
비동기 실행 예제
function longRunningTask() {
console.log('작업 끝');
}
console.log('시작');
setTimeout(longRunningTask, 0);
console.log('다음 작업');
시작
다음 작업
작업 끝
JavaScript는 기본적으로 동기적으로 코드를 실행하지만, 비동기 코드를 만나면 작업을 Web API 또는 Node.js 환경(libuv)으로 넘깁니다.
Web API 또는 libuv는 타이머, 네트워크 요청 등의 작업을 백그라운드에서 처리합니다.
이후 콜 스택이 비게 되면, 이벤트 루프가 콜백 큐에서 작업을 가져와 콜 스택에 올려 실행합니다.
'Node.js > 정리' 카테고리의 다른 글
쿠키와 세션을 활용한 로그인 구현 및 보안 개선 (0) | 2025.01.20 |
---|---|
Node.js로 RESTful Server 만들어보기 (0) | 2025.01.13 |
Node.js로 HTTP 서버 만들어보기 (0) | 2025.01.06 |