반응형
Node.js · 멀티스레딩 · 멀티프로세싱 · Java Spring
Node.js의 이벤트 루프를 이해하고 나면
자연스럽게 이런 질문이 이어진다.
- 멀티스레드는 정확히 뭐가 다른가?
- 멀티프로세스는 왜 안전한가?
- Node.js 워커 스레드는 어디에 속하는가?
- 자바 스프링은 왜 구조가 완전히 다른가?
이 글은 **“요청을 어떻게 처리하고, CPU와 메모리를 어떻게 쓰는가”**라는
단 하나의 기준으로 이 모든 모델을 정리한다.
1. 실행 모델을 나누는 핵심 기준
모든 서버 모델은 결국 이 두 질문으로 나뉜다.
- 요청을 처리하는 실행 단위는 무엇인가?
- 스레드?
- 이벤트 루프?
- 메모리는 어떻게 공유하는가?
- 공유?
- 격리?
이 두 축으로 보면 구조가 명확해진다.
2. 멀티스레딩(Multi-threading)
정의
하나의 프로세스 안에서 여러 스레드가 메모리를 공유하며 동시에 실행되는 모델
구조
[Process]
├─ThreadA
├─ThreadB
└─ThreadC
↳SharedHeap
특징
- 요청 처리 단위: 스레드
- 메모리: 공유
- 실행: 병렬
- 통신: 메모리 접근
- 위험: 경쟁 상태, 데드락
👉 성능은 좋지만 동시성 설계 난이도가 높다
장단점 요약
장점
- 빠른 컨텍스트 스위칭
- 통신 비용 거의 없음
단점
- 락, 동기화 필수
- 하나의 버그가 전체 프로세스 영향
3. 멀티프로세싱(Multi-processing)
정의
여러 개의 프로세스를 띄워 각자 독립된 메모리 공간에서 병렬 실행하는 모델
구조
[ Process A ][ Process B ][ Process C ]
(Heap 분리) (Heap 분리) (Heap 분리)
특징
- 요청 처리 단위: 프로세스
- 메모리: 완전 격리
- 실행: 병렬
- 통신: IPC 필요
- 안정성: 매우 높음
👉 안전하지만 무겁다
장단점 요약
장점
- 장애 격리
- 경쟁 상태 거의 없음
단점
- 프로세스 생성 비용 큼
- 메모리 사용량 증가
4. Node.js의 기본 실행 모델
이제 Node.js를 보자.
핵심 한 문장
Node.js는 싱글 스레드 이벤트 루프 기반 서버다.
구조
[ JS Engine (V8) ]
├─ Call Stack
└─ Heap
[ Node.js Runtime ]
├─ Event Loop
├─Background (libuv / OS)
├─ Task Queue
└─ Microtask Queue
특징
- JS 실행 스레드: 1개
- I/O: 논블로킹
- 동시성: 이벤트 루프
- 장점: 구조 단순, 메모리 안전
- 단점: CPU 바운드 작업에 취약
👉 I/O 서버에 최적화된 모델
5. Node.js 워커 스레드의 위치
여기서 많이 헷갈린다.
결론부터
Node.js 워커 스레드는 멀티스레딩이지만, 메모리 모델은 멀티프로세싱에 가깝다.
구조
[ Node.js Process ]
├─Main Thread (V8 + Event Loop)
├─ Worker ThreadA (V8 + Heap)
└─ Worker ThreadB (V8 + Heap)
- 같은 프로세스
- OS 스레드
- V8 인스턴스 분리
- Heap 분리
- 메시지 기반 통신
정확한 표현
“메모리는 멀티프로세스, 실행은 멀티스레드”
이게 가장 정확하다.
6. Java Spring의 실행 모델
이제 Spring Framework를 보자.
기본 모델 (Spring MVC)
요청 하나당 스레드 하나
구조
[ JVM Process ]
├─ Thread Pool
│ ├─ Thread-1 → RequestA
│ ├─ Thread-2 → RequestB
│ └─ ...
└─ Shared Heap
동작 방식
- 요청 도착
- 스레드 풀에서 스레드 할당
- 컨트롤러 → 서비스 → DB 호출
- 응답 완료 시 스레드 반환
👉 블로킹 I/O 기반 멀티스레드 서버
특징
- 멀티스레딩 모델
- 메모리 공유
- 동기 코드에 매우 직관적
- 스레드 수가 곧 처리 한계
7. Node.js vs Java Spring (정리 표)
| 항목 | Node.js | Java Spring (MVC) |
| 기본 모델 | 이벤트 루프 | 멀티스레드 |
| 실행 단위 | 콜백 | 스레드 |
| I/O | 논블로킹 | 블로킹 |
| 메모리 | 기본 격리 | 공유 |
| CPU 작업 | 워커 필요 | 스레드 병렬 |
| 병목 | 이벤트 루프 | 스레드 풀 |
8. 실행 모델을 한 줄로 정리하면
- 멀티스레딩
- → 빠르지만 위험
- 멀티프로세싱
- → 안전하지만 무거움
- Node.js
- → 단순한 이벤트 루프
- Node.js 워커 스레드
- → 안전한 병렬 처리
- Java Spring (MVC)
- → 전통적인 멀티스레드 서버
9. 언제 어떤 모델이 맞는가
- I/O 중심 API 서버
- → Node.js
- CPU 연산 많은 서비스
- → Java Spring / Node.js + Worker
- 안정성 최우선
- → 멀티프로세스
- 고성능 계산
- → 멀티스레드
반응형
'WEB,WAS > Nodejs' 카테고리의 다른 글
| Node.js 이벤트 루프 정리(콜 스택 · 백그라운드 · 태스크 큐 · Promise · 엔진과 런타임) (0) | 2026.02.02 |
|---|---|
| Windows 환경에서 PM2를 서비스로 등록해 특정 계정으로 자동 재기동하기 (0) | 2025.08.19 |
댓글