내가 사용하는 노드에 대해 글로 정리할 필요가 있다고 생각이 들었어요.
Node.js의 동작 원리에서 가장 중요한 건 "싱글 스레드(Single Thread) 기반의 이벤트 루프(Event Loop)와 비동기 I/O(Non-blocking I/O)"에요.
저는 이벤트 루프를 중심으로 요즘 유행하는 식당으로 비유해볼게요.
Node.js 내부에서는 이 과정을 처리하기 위해 다음과 같은 구조가 유기적으로 돌아가요.

console.log('1. 주문 받음');
setTimeout(() => {
console.log('2. 요리 완성 (오래 걸림)');
}, 3000); // 3초 뒤 실행
console.log('3. 다음 주문 받음');
console.log('1...')이 Call Stack에 들어가고 즉시 실행돼요. (출력: 1. 주문 받음)setTimeout을 만남. 비동기적으로 백그라운드(Libuv)로 던져버리고 바로 다음 줄로 넘어기요.console.log('3...')이 Call Stack에 들어가고 즉시 실행돼요. (출력: 3. 다음 주문 받음)console.log('2...')를 Callback Queue에 넣음.console.log(2...) 가 실행돼요. (출력: 2. 요리 완성)이벤트 루프를 차단하지 마세요 한글번역
만약 위에 예시에서 setTimeout 함수에 콜백으로 들어간 함수가 연산이 오래 걸리는 작업이면 어떻게 될까요?
콜백 큐에 들어오는 순서대로 콜스택이 빌 때마다 투입되는 설계는 이상적으로 보이지만, 여러 번 말했듯이 Node.js는 싱글 스레드 이기 때문에, 메인 스레드에서 시간이 오래 걸리는 연산이 시작될 경우 다른 작업을 하지 못해요.
그러니 무거운 연산이 필요한 경우, 워커 스레드를 따로 만들어서 해결해야해요.
잘하는 것 (I/O 작업): 데이터를 주고받는 게 많은 서비스 (채팅, 스트리밍, ZEP 같은 실시간 서버, API 서버). 종업원이 기다리지 않고 미친 듯이 주문을 받으므로 효율이 좋아요.
못하는 것 (CPU 작업): 머리를 엄청 써야 하는 작업 (복잡한 수학 계산, 이미지/비디오 인코딩, AI 학습).
이벤트 루프에 대해서 우테코 피터의 테코톡을 참고했어요