Node.js의 이벤트 루프

Node.js의 이벤트 루프(Event Loop)는 비동기 I/O 작업을 처리하는 핵심 메커니즘으로, Node.js가 높은 성능과 효율성을 유지할 수 있게 해주는 중요한 기능.


이벤트 루프란 무엇인가?

이벤트 루프는 Node.js의 비동기 처리를 관리하는 시스템.
Node.js는 단일 스레드에서 실행되지만, 이벤트 루프를 통해 비동기 작업을 효율적으로 처리할 수 있음.
이벤트 루프는 각 비동기 작업의 완료 여부를 감시하고, 완료된 작업의 콜백 함수를 실행하는 역할을 함.


왜 필요할까?

  • 비동기 I/O 처리: Node.js는 비동기 I/O를 지원하여, 파일 시스템 접근, 네트워크 요청 등 시간이 걸리는 작업을 수행하는 동안 다른 작업을 계속할 수 있음.
    이벤트 루프는 이러한 비동기 작업이 완료되었을 때 콜백 함수를 호출하여 결과를 처리.

  • 높은 동시성: 이벤트 루프를 통해 여러 요청을 동시에 처리할 수 있음.
    클라이언트의 요청이 들어오면, Node.js는 해당 요청을 비동기적으로 처리하고, 다른 요청을 계속해서 수용할 수 있음.
    이는 고성능 웹 서버 애플리케이션을 구축하는 데 매우 유용.

  • 자원 효율성: 이벤트 루프는 CPU와 메모리를 효율적으로 사용할 수 있게 해줌.
    블로킹 없이 I/O 작업을 처리함으로써, 서버가 대기 시간 동안 유휴 상태가 되지 않도록 합니다.


이벤트 루프의 작동 방식

1. 콜 스택 (Call Stack)
정의: 콜 스택은 현재 실행 중인 함수의 호출을 관리하는 데이터 구조.
함수가 호출될 때 스택에 추가되고, 실행이 완료되면 제거.
작동 방식: JavaScript는 단일 스레드에서 실행되기 때문에, 콜 스택이 비어 있을 때만 다음 작업이 진행.

2. Web APIs
정의: Web APIs는 브라우저나 Node.js에서 제공하는 비동기 작업을 처리하는 API.
주로 I/O 작업, 타이머, 네트워크 요청 등을 처리.
작동 방식: Web APIs는 비동기 작업이 완료될 때 콜백 함수를 호출하도록 설계.
이때 해당 콜백은 콜백 큐에 추가.

3. 콜백 큐 (Callback Queue)
정의: 콜백 큐는 비동기 작업의 결과로 생성된 콜백 함수를 대기시키는 큐.
이벤트 루프에 의해 관리되며, 콜 스택이 비어 있을 때 콜백이 실행.
작동 방식: 비동기 작업이 완료되면, 해당 작업의 콜백은 콜백 큐에 추가되고, 이벤트 루프가 이를 감시하여 콜 스택으로 이동시킴.

4. 이벤트 루프 (Event Loop)
정의: 이벤트 루프는 비동기 I/O 작업과 콜백 처리를 관리하는 메커니즘.
콜 스택이 비어 있는지 확인하고, 콜백 큐에서 대기 중인 콜백을 실행.
작동 방식: 이벤트 루프는 다음과 같은 순서로 작동.

  1. 콜 스택이 비어 있는지 확인.
  2. 콜백 큐에서 대기 중인 콜백이 있는지 확인.
  3. 콜백이 있으면, 이를 콜 스택에 추가하여 실행.
  4. 위 과정을 반복.
+-----------------------+
|      Call Stack       |
|                       |
|    (Function A)       |
|    (Function B)       |
|                       |
+-----------------------+
            |
            |
            v
+-----------------------+
|      Web APIs         |
|                       |
|   (I/O Operation)     |
|   (setTimeout)        |
|                       |
+-----------------------+
            |
            |
            v
+-----------------------+
|      Callback Queue   |
|                       |
|   (Callback from I/O) |
|   (Timer Callback)    |
|                       |
+-----------------------+
            |
            |
            v
+-----------------------+
|      Event Loop       |
|                       |
|   (Checks Call Stack) |
|                       |
+-----------------------+


예시 코드

console.log('시작');

setTimeout(() => {
    console.log('타이머 1초 후 실행');
}, 1000);

setTimeout(() => {
    console.log('타이머 0.5초 후 실행');
}, 500);

console.log('');

실행 순서
console.log('시작');이 실행되어 “시작”이 출력.
setTimeout 함수들이 호출되어 타이머가 설정.
console.log('끝');이 실행되어 “끝”이 출력.
이후 0.5초 후에 타이머 0.5초 후 실행이 출력되고, 1초 후에 타이머 1초 후 실행이 출력.