본문 바로가기
WEB,WAS/Nodejs

서버 실행 모델(spring,nodejs) 멀티스레딩

by Rainbound-IT 2026. 2. 2.
반응형

Node.js · 멀티스레딩 · 멀티프로세싱 · Java Spring

Node.js의 이벤트 루프를 이해하고 나면

자연스럽게 이런 질문이 이어진다.

  • 멀티스레드는 정확히 뭐가 다른가?
  • 멀티프로세스는 왜 안전한가?
  • Node.js 워커 스레드는 어디에 속하는가?
  • 자바 스프링은 왜 구조가 완전히 다른가?

이 글은 **“요청을 어떻게 처리하고, CPU와 메모리를 어떻게 쓰는가”**라는

단 하나의 기준으로 이 모든 모델을 정리한다.


1. 실행 모델을 나누는 핵심 기준

모든 서버 모델은 결국 이 두 질문으로 나뉜다.

  1. 요청을 처리하는 실행 단위는 무엇인가?
    • 스레드?
    • 이벤트 루프?
  2. 메모리는 어떻게 공유하는가?
    • 공유?
    • 격리?

이 두 축으로 보면 구조가 명확해진다.


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

동작 방식

  1. 요청 도착
  2. 스레드 풀에서 스레드 할당
  3. 컨트롤러 → 서비스 → DB 호출
  4. 응답 완료 시 스레드 반환

👉 블로킹 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
  • 안정성 최우선
  • → 멀티프로세스
  • 고성능 계산
  • → 멀티스레드
반응형

댓글