노드 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을 배워봅시다!
'IT Developer > Node.js' 카테고리의 다른 글
Node.js 기초 <9. 파일 시스템(fs 모듈)과 스트림(Stream) 활용> (0) | 2025.03.11 |
---|---|
Node.js 기초 <8. Node.js와 데이터베이스 (MySQL, PostgreSQL, MongoDB)> (0) | 2025.03.10 |
Node.js 기초 <7. RESTful API 개발: CRUD 구현 및 HTTP 요청 처리> (0) | 2025.03.09 |
Node.js 기초 <6. Express.js로 서버 만들기: 기본 개념과 라우팅> (1) | 2025.03.08 |
Node.js 기초 <5. npm과 패키지 관리: 의존성 관리 및 버전 관리> (0) | 2025.03.07 |
Node.js 기초 <4. Node.js의 내장 모듈과 CommonJS/ESM> (1) | 2025.03.06 |
Node.js 기초 <2. Node.js 설치 및 환경 설정> (1) | 2025.03.04 |
Node.js 기초 <1. Node.js란? 기본 개념과 특징> (2) | 2025.03.03 |