IT Developer/Node.js

Node.js 기초 <3. Node.js의 이벤트 루프와 비동기 처리>

TEMA_ 2025. 3. 5. 15:52
반응형

노드 Node.js

3. Node.js의 이벤트 루프와 비동기 처리 

 

안녕하세요! 태마입니다.

Node.js 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

노드 Node.js

포스팅 시작하겠습니다 :)

 


 

1. 주제 간단 정리

 

1. 이벤트 루프(Event Loop)란?

이벤트 루프(Event Loop)는 Node.js에서 비동기 작업을 효율적으로 처리하는 핵심 기술입니다.
Node.js는 싱글 스레드 기반이지만, 이벤트 루프 덕분에 여러 작업을 동시에 처리할 수 있습니다.

📌 이벤트 루프의 특징
✔ 요청을 받으면 바로 실행하는 것이 아니라 대기열(Queue)에 저장
✔ 작업이 완료되면 콜백 함수(Callback Function)를 실행
✔ 비동기 방식으로 서버의 처리 속도를 극대화할 수 있음


 

2. 동기(Synchronous) vs 비동기(Asynchronous) 처리 방식

1) 동기 방식 (Synchronous)
✔ 하나의 작업이 끝날 때까지 기다린 후 다음 작업 실행
✔ 실행 순서가 예측 가능하지만, 속도가 느릴 수 있음
✔ 예제: 음식점에서 손님이 주문하면 요리가 끝날 때까지 기다리는 것

console.log("1번 작업 시작");
console.log("2번 작업 실행");
console.log("3번 작업 완료");

📌 출력 결과

 
1번 작업 시작
2번 작업 실행
3번 작업 완료

📌 동기 방식에서는 모든 작업이 순서대로 실행됨!

2) 비동기 방식 (Asynchronous)
✔ 하나의 작업이 끝나길 기다리지 않고 다른 작업을 먼저 실행 가능
Node.js의 이벤트 루프가 이를 가능하게 만듦
✔ 예제: 음식점에서 여러 손님이 주문하면 먼저 준비된 음식부터 제공하는 것

console.log("1번 작업 시작");
setTimeout(() => {
  console.log("2번 작업 실행 (3초 후)");
}, 3000);
console.log("3번 작업 완료");

📌 출력 결과

1번 작업 시작
3번 작업 완료
2번 작업 실행 (3초 후)

📌 비동기 방식에서는 2번 작업이 끝나길 기다리지 않고, 3번 작업을 먼저 실행!

✅ 여기까지 Node.js의 비동기 처리 개념을 배웠습니다!
👉 "그렇다면, Node.js 내부에서 이벤트 루프가 어떻게 동작할까?"
2부에서 이벤트 루프의 구조와 실행 순서를 깊이 알아봅시다!

반응형

 

2. 상세 주제 정리

 

1. Node.js 이벤트 루프의 동작 원리

Node.js의 비동기 처리는 **이벤트 루프(Event Loop)**를 통해 실행됩니다.
이벤트 루프는 Call Stack과 Callback Queue를 관리하여 효율적인 처리를 가능하게 합니다.

이벤트 루프의 주요 구성 요소

구성 요소설명

Call Stack (호출 스택) 실행할 함수 저장
Web APIs (비동기 함수 처리 공간) setTimeout, fetch 등 관리
Callback Queue (콜백 큐) 완료된 비동기 작업 저장
Event Loop (이벤트 루프) Call Stack이 비면 Callback Queue에서 작업 실행
Microtask Queue (마이크로태스크 큐) Promise.then() 같은 빠른 작업 처리
Next Tick Queue (넥스트 틱 큐) process.nextTick() 즉시 실행

📌 이벤트 루프는 Call Stack이 비어 있는 경우, Callback Queue에서 작업을 가져와 실행함!


 

2. setTimeout, process.nextTick, Promise.then 실행 순서 비교

Node.js의 이벤트 루프는 실행 순서가 중요합니다.
아래 코드를 실행하면 어떤 순서로 출력될까요?

console.log("1번 실행");

setTimeout(() => {
  console.log("2번 실행 (setTimeout)");
}, 0);

Promise.resolve().then(() => console.log("3번 실행 (Promise.then)"));

process.nextTick(() => console.log("4번 실행 (process.nextTick)"));

console.log("5번 실행");

📌 출력 결과

1번 실행
5번 실행
4번 실행 (process.nextTick)
3번 실행 (Promise.then)
2번 실행 (setTimeout)

✅ 실행 순서 정리
1️⃣ console.log("1번 실행") 실행
2️⃣ console.log("5번 실행") 실행
3️⃣ process.nextTick()이 먼저 실행됨
4️⃣ Promise.then()이 그다음 실행됨
5️⃣ setTimeout()이 마지막에 실행됨

📌 Node.js에서는 process.nextTick() → Promise.then() → setTimeout() 순으로 실행됨!


 

3. Node.js에서 비동기 처리 방법 (콜백, 프로미스, async/await)

1) 콜백 함수 (Callback) – 기본적인 비동기 방식

function fetchData(callback) {
  setTimeout(() => {
    callback("데이터 받아옴!");
  }, 1000);
}

fetchData((data) => {
  console.log(data);
});

📌 출력 결과

 
데이터 받아옴!

📌 하지만, 콜백이 중첩되면 콜백 지옥(Callback Hell) 문제가 발생할 수 있음!

2) Promise 사용 – 콜백 지옥 해결

function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve("데이터 받아옴!");
    }, 1000);
  });
}

fetchData().then((data) => console.log(data));

📌 출력 결과

 
데이터 받아옴!

📌 Promise를 사용하면 비동기 코드를 더 깔끔하게 작성 가능!

3) async/await 사용 – 가장 직관적인 방식

async function fetchData() {
  return "데이터 받아옴!";
}

async function main() {
  const data = await fetchData();
  console.log(data);
}

main();

📌 출력 결과

 
데이터 받아옴!

📌 async/await 덕분에 비동기 코드를 동기 코드처럼 읽을 수 있음!


 

4. 이벤트 루프의 성능 최적화 – 실무에서 사용하는 기법

1) 비동기 처리 방식 선택하기

방법장점단점

콜백 (Callback) 간단한 비동기 처리 가능 콜백 지옥 발생 가능
Promise 콜백보다 가독성이 뛰어남 코드가 길어질 수 있음
async/await 가장 직관적인 방식 예외 처리 필요

📌 대부분의 최신 Node.js 프로젝트에서는 async/await을 권장함!

2) 이벤트 루프 최적화 – Node.js 성능을 높이는 방법

최적화 기법설명

Worker Threads CPU 작업을 병렬로 처리
Cluster 모드 여러 개의 프로세스를 생성하여 부하 분산
Message Queue (RabbitMQ, Kafka) 백그라운드 작업을 분리하여 처리
캐싱 (Redis) 자주 조회하는 데이터를 캐싱하여 속도 개선

📌 이벤트 루프를 효율적으로 활용하면, 대규모 트래픽도 원활하게 처리할 수 있음!

 

✅ 여기까지 Node.js의 이벤트 루프 구조와 비동기 처리 방법을 배웠습니다!
👉 "그렇다면, Node.js에서 모듈 시스템을 어떻게 활용할 수 있을까?"
다음 회차에서 Node.js의 내장 모듈과 CommonJS/ESM을 배워봅시다!

반응형