포트폴리오 글을 정리하다가 문득 깨달았습니다.
그동안 제가 쓴 글엔 JavaScript 자체를 정면으로 다룬 글이 없다는걸 알게됐습니당
그래서 이번 글은
Node.js를 처음 배울 때 가장 헷갈렸던 질문을 기준으로 정리해보려고 합니다.
"Node.js는 싱글 스레드인데, 왜 동시에 여러 일을 처리할까?"
"싱글 스레드면 느린 거 아닌가요?"
처음 Node.js를 배울 때 제일 헷갈렸던 문장이 있습니다.
"JavaScript는 싱글 스레드다."
그러면 자연스럽게 이런 생각이 따라옵니다.
- 한 번에 한 작업만 할 수 있다?
- 요청이 많아지면 바로 막히는 거 아닌가?
- 그런데 왜 Node는 대규모 트래픽 처리 사례가 많지?
저도 여기서 한동안 꼬였습니다.
결론부터 말하면,
문장이 틀린 게 아니라 해석이 반쪽짜리였던 것입니다.
JS 실행은 싱글, Node 런타임은 싱글이 아니다
핵심은 간단합니다.
- JavaScript 코드 실행(V8 콜 스택): 싱글 스레드
- Node.js 런타임 전체: 이벤트 루프 + OS 커널 + libuv 스레드 풀 + (필요 시) 워커/프로세스
즉 Node는 대략 이렇게 일합니다.
- 메인 스레드에서 JS 코드를 실행한다.
- 파일 읽기/네트워크/암호화 같은 작업은 외부(커널 또는 thread pool)에 위임한다.
- 완료 신호가 오면 이벤트 루프가 콜백/Promise를 처리한다.
그래서 우리가 쓰는async/await는
"멀티 스레드 문법"이라기보다
"기다리는 동안 메인 스레드를 막지 않는 문법"에 가깝습니다.
"비동기 = 멀티 스레드"가 아닌 이유
여기서 가장 많이 오해합니다.
1) 비동기와 병렬은 다르다
- 비동기(Async): 기다리지 않는 방식
- 병렬(Parallelism): 물리적으로 동시에 실행하는 방식
await를 썼다고 CPU 연산이 자동으로 여러 코어에 분산되진 않습니다.
2) 어떤 작업은 thread pool, 어떤 작업은 커널
Node는 작업 성격에 따라 다르게 처리합니다. - 네트워크 I/O: 커널 비동기 메커니즘 활용 (보통 thread pool 소모 적음)
fs,crypto,zlib,dns.lookup()일부: libuv thread pool 활용
즉,- *"모든 비동기 작업이 thread pool을 탄다"**는 말도 틀립니다.
3) CPU 바운드 작업은 결국 이벤트 루프를 막는다
예시로 아래 코드는async가 붙어 있어도 이벤트 루프를 오래 점유할 수 있습니다.
async function heavyWork() {
let sum = 0;
for (let i = 0; i < 2e9; i++) sum += i;
return sum;
}
이런 작업은 worker_threads나 cluster 같은 별도 전략이 필요합니다.
한 문장으로 정리하면
Node.js는 단순히 "싱글 스레드 언어"라기보다,
싱글 스레드 JS 실행을 중심으로 외부 비동기 자원과 병렬 자원을 조합해 동시성을 만드는 런타임입니다.
실무 기준으로 정리하면:
- I/O 중심 서버: 기본 async 모델이 강력하다.
- CPU 중심 작업: worker_threads/cluster 분리가 사실상 필수다.
- async/await는 만능 성능 버튼이 아니라 논블로킹 흐름 제어 도구다.
처음엔 "싱글 스레드라 한계가 명확하다"고 생각했는데,
공부할수록 오히려 Node의 강점은
어디서 싱글이고 어디서 병렬인지 경계를 명확히 설계할 수 있다는 점이라고 느꼈습니다.
3줄 요약
JS 실행은 싱글 스레드지만, Node 런타임은 다양한 비동기/병렬 자원을 사용한다.
비동기와 병렬은 다르며, async/await는 병렬 처리 문법이 아니다.
CPU 바운드 작업은 worker_threads/cluster로 분리 설계해야 한다.
'개발' 카테고리의 다른 글
| [rn-expo] Link와 useRouter는 결국 같은 구현체였다 (0) | 2025.12.09 |
|---|---|
| [면접 질문] react의 컴포넌트 주기와 훅 관련 질문 (1) | 2025.08.27 |
| [css][sticky] 아니 여백이 안지워진다니까요?? (1) | 2025.07.29 |
| [React] 화살표 함수 제네릭 타입이 안된다!?! (2) | 2025.07.04 |
| [코테] 프로그래머스 뒤에서 5등 위로 (0) | 2025.04.10 |