이벤트루프이벤트 루프 면접이벤트 루프란이벤트 루프 동작원리이벤트 루프 태스크 큐

이벤트 루프: 비동기 프로그래밍의 핵심 이해

KUKJIN LEE
KUKJIN LEE
2024년 2월 18일
156

이벤트 루프 (Event Loop)는 대부분의 현대적인 웹 브라우저 및 JavaScript 실행 환경에서 비동기 코드 실행을 관리하는 메커니즘입니다. 이벤트 루프는 코드 실행의 흐름을 제어하고, 이벤트 발생, 콜백 함수 호출 및 다른 비동기 작업을 관리하여 프로그램이 비동기적 작업을 효율적으로 다룰 수 있도록 합니다.

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

JavaScript는 단일 스레드(single-threaded)로 동작합니다. 이는 한 번에 한 작업만을 수행할 수 있음을 의미합니다. 그렇기 때문에 네트워크 요청, 파일 읽기, 사용자 입력과 같은 I/O 연산이 발생할 때, 프로그램은 기다리지 않고 계속해서 다음 작업을 수행해야 합니다. 이러한 비동기 작업을 효과적으로 처리하기 위해 이벤트 루프가 사용됩니다.

  • Call Stack (호출 스택): 현재 실행 중인 함수의 호출 정보를 저장하는 스택입니다. 함수가 호출되면 해당 함수의 정보가 스택에 추가되고, 함수가 반환되면 스택에서 제거됩니다.

  • Callback Queue (콜백 큐): 비동기 작업의 콜백 함수가 대기하는 대기열(queue)입니다. 비동기 작업이 완료되면 해당 콜백 함수가 콜백 큐에 추가됩니다.

  • Event Loop (이벤트 루프): 호출 스택과 콜백 큐를 모니터링하며 호출 스택이 비어 있는 경우에만 콜백 큐에서 콜백 함수를 꺼내와 호출 스택으로 이동시키는 역할을 합니다.

우선 실행 결과를 살펴보면 아래와 같습니다.

  1. 시작
  2. 비동기 함수 완료
  3. 콜백 함수 실행

프로그램이 시작되면 가장 먼저 '시작'이 출력됩니다. 이후 asyncFunction은 비동기 함수로, setTimeout 함수를 사용해 2초 후 작업을 완료하고 콜백 함수를 호출합니다. 하지만 콜백 함수의 실행을 기다리지 않고 다음 코드로 넘어갑니다. '끝'이 출력됩니다. 2초를 기다린 asyncFunction은 실행됩니다. 2초가 지난 후, setTimeout의 콜백 함수가 실행됩니다. '비동기 함수 완료'가 출력됩니다. 마지막으로 setTimeout의 콜백 함수에서 정의한 내용 '콜백 함수 실행'이 출력됩니다.

 

function asyncFunction(callback) {
    setTimeout(function() {
        console.log("비동기 함수 완료");
        callback(); 
    }, 2000);
}

console.log("시작");

asyncFunction(function() {
    console.log("콜백 함수 실행");
});

console.log("끝");

 

이벤트 루프의 동작 과정

  1. 코드 실행이 시작되면서 초기 함수 호출이 스택에 추가됩니다.
  2. 비동기 작업이 발생하면 해당 작업은 백그라운드에서 처리됩니다.
  3. 비동기 작업이 완료되면 콜백 함수가 콜백 큐에 추가됩니다.
  4. 이벤트 루프는 호출 스택이 비어 있는지 계속 확인하고, 호출 스택이 비어있다면 콜백 큐에서 콜백 함수를 꺼내 호출 스택에 추가합니다.
  5. 호출 스택에 추가된 함수가 실행되면서 비동기 작업이 발생할 수 있고, 이 과정이 반복됩니다.

관련 글

TypeScript any 린트 에러(no-explicit-any) 근본적으로 해결하기

TypeScript 프로젝트에서 @typescript-eslint/no-explicit-any 린트 에러는 단순 규칙 비활성화로 해결할 문제가 아닙니다. 눈 앞 문제는 해결할 수 있지만, TypeScript를 사용하는 가장 중요한 이유를 위배하게 됩니다. any 타입은...

2025년 7월 23일269

JSP 주석, 아직도 `` 쓰시나요? 올바른 사용법

코드를 작성하다 보면 주석을 남기는 경우가 많습니다. 하지만 JSP 환경에서 어떤 주석을 사용하냐에 따라 보안 수준과 성능 이 크게 달라집니다. 표준 주석: 서버 사이드 주석 <%-- --%> JSP 페이지 내 개발 관련 주석은 <%-- --%> 를 사용하는게 좋습니다...

2025년 7월 9일144

쉽게 만드는 React Tab 라이브러리 react-tabs

개발자가 커스텀 스타일을 쉽게 적용할 수 있도록 최소한의 스타일만 제공하여 유연한 스타일링 이 가능한 라이브러리입니다. 상태 관리가 내장되어 있어 탭 선택 및 패널 표시 로직을 직접 구현할 필요 없이 간편하게 사용할 수 있습니다. 기본 사용법 먼저, 라이브러리를 설치합...

2025년 6월 17일173

Next.js 환경 변수 NEXT_PUBLIC 접두사 역할

NEXT_PUBLIC 접두사를 붙이면 변수의 접근 범위가 완전히 달라집니다. 이 차이점을 이해하는 것이 안전하고 효율적인 Next.js 애플리케이션을 구축하는 데 중요합니다. NEXT_PUBLIC 접두사가 없는 환경 변수 (서버 전용) NEXT_PUBLIC 접두사 없이...

2025년 6월 13일156