이벤트 루프

2026. 1. 14. 20:40·Stack/JavaScript
반응형

"이벤트 루프가 뭐예요?" 누군가 나에게 이렇게 묻다면 나는 자신 있게 답을 할 수 있을까? 솔직히 현재의 나는 명쾌하게 대답할 자신이 없다. 그래서 이 글은 미래의 나를 위해, 그리고 이 질문에 답하기 위해 작성하는 정리 노트다.

 

1. 자바스크립트는 싱글 스레드인데 어떻게 멀티태스킹을 할까?

이벤트 루프를 논하기 전에 먼저 해결해야 할 의문이 있다. "자바스크립트는 싱글 스레드(Single Thread) 언어다." 이 말은 한 번에 하나의 작업만 할 수 있다는 뜻인데, 실제 우리가 쓰는 웹 사이트는 파일도 다운로드하고, 애니메이션도 보여주고, 서버 요청도 동시에 처리하는 것처럼 보인다. 이게 어떻게 가능한 걸까?

 

. 자바스크립트 엔진은 '요청'만 보내고, 실제로 시간이 오래 걸리는 작업(네트워크, 타이머 등)은 브라우저가 제공하는 Web APIs 영역에서 수행된다.

 

즉, 비동기 + 논블로킹(Async + Non-blocking) 방식이다.

비동기 + 논블로킹이란? 메인 스레드가 작업을 직접 붙들고 있는 게 아니라, 다른 곳(Web APIs)에 "이거 해줘"라고 위임하고 바로 다음 일을 처리하는 방식이다. 위임된 작업이 끝나면 결과만 나중에(Callback) 받아 처리한다.

이 과정에서 동작의 타이밍을 제어하고 조율하는 관리자가 바로 이벤트 루프(Event Loop)다.

 

2. 이벤트 루프(Event Loop)의 정의

이벤트 루프는 브라우저 내부에서 두 가지를 끊임없이 확인하고 중재하는 역할을 한다.

  1. 호출 스택(Call Stack)에 현재 실행 중인 코드가 있는가?
  2. 태스크 큐(Task Queue)에 대기 중인 작업이 있는가?

호출 스택이 텅 비어있다면, 태스크 큐에 대기 중인 작업을 꺼내와 실행시킨다. 이 단순한 반복 작업이 자바스크립트 비동기의 핵심이다.

 

3. 주요 구성 요소 뜯어보기

이벤트 루프를 이해하기 위해선 다음 세 가지 친구들을 알아야 한다.

① 호출 스택 (Call Stack)

호출 스택은 자바스크립트 엔진이 코드를 실행하는 공간이다.

  • LIFO (Last In, First Out): 나중에 들어온 녀석이 먼저 나가는 '스택' 구조다.
  • 함수가 실행되면 스택에 쌓이고(Push), 실행이 끝나면 스택에서 제거된다(Pop).

핵심: 자바스크립트는 싱글 스레드이므로 호출 스택이 딱 하나다. 한 번에 하나의 함수만 실행할 수 있다는 뜻이다. 만약 여기서 무거운 작업을 돌리면 브라우저는 멈춰버린다(Blocking).

② Web APIs:

브라우저가 제공하는 멀티 스레드 공간이다.

  • setTimeout, fetch, DOM Event 등이 여기서 처리된다.
  • 자바스크립트 엔진이 복잡하고 어려운 작업을 Web APIs에 요청하여 백그라운드에서 열심히 일을 처리한다. 일이 끝나면 결과물(콜백 함수)을 태스크 큐로 넘겨준다.

③ 태스크 큐 (Task Queue)

Web APIs에서 처리가 끝난 콜백 함수들이 실행되기 위해 기다리는 대기실이다.

  • FIFO (First In, First Out): 먼저 들어온 녀석이 먼저 나간다.
  • 이벤트 루프는 호출 스택이 비었을 때만 여기서 콜백을 꺼내간다.

4. 심화: 마이크로 태스크 vs 매크로 태스크

마이크로 태스크 큐 (Micro Task Queue)

  • 대상: Promise (.then/catch/finally), async/await, MutationObserver 등
  • 특징: 우선순위가 가장 높다.
  • 호출 스택이 비면, 이벤트 루프는 매크로 태스크보다 마이크로 태스크 큐를 먼저 확인한다.
  • 주의: 마이크로 태스크 큐에 있는 작업은 큐가 완전히 빌 때까지 계속해서 실행된다. 만약 마이크로 태스크가 계속 추가되면(무한 루프 등), 매크로 태스크는 실행 기회를 못 얻고 화면 갱신(렌더링)도 차단되어 브라우저가 먹통이 될 수 있다.

매크로 태스크 큐 (Macro Task Queue)

  • 대상: setTimeout, setInterval, fetch, DOM 이벤트 등 일반적인 비동기 작업
  • 특징: 마이크로 태스크 큐가 텅 비어야 실행된다.
  • 일반적으로 매크로 태스크 하나를 실행한 후에는 브라우저가 화면을 다시 그릴(Render) 기회를 가질 수 있다.

5. 결론 

이벤트 루프는 호출 스택이 비어 있는지를 지속적으로 확인하고,비어 있을 경우 태스크 큐에 대기 중인 작업을 호출 스택으로 옮겨 실행을 관리하는 메커니즘이다.

 

 

출처 및 참고 자료

https://inpa.tistory.com/entry/🔄-자바스크립트-이벤트-루프-구조-동작-원리

https://www.youtube.com/watch?v=8aGhZQkoFbQ

반응형

'Stack > JavaScript' 카테고리의 다른 글

Object.assign vs Spread Syntax (...)  (2) 2024.11.20
자바스크립트 javascript 2진수 8진수 16진수 변환  (1) 2021.10.08
'Stack/JavaScript' 카테고리의 다른 글
  • Object.assign vs Spread Syntax (...)
  • 자바스크립트 javascript 2진수 8진수 16진수 변환
WHITE_FROST
WHITE_FROST
개발공부리뷰블로그
    반응형
  • WHITE_FROST
    하얀하얀IT
    WHITE_FROST
  • 전체
    오늘
    어제
    • 분류 전체보기 (127) N
      • Stack (46)
        • Next.js (8)
        • React (13)
        • React-Native (15)
        • TypeScript (0)
        • Python (2)
        • JavaScript (3)
        • Android (1)
        • DB (2)
        • JAVA (1)
      • Design Pattern (1)
      • AI (4) N
      • Obsidian (1)
      • Error (7)
      • 알고리즘 정리 (6)
      • 알고리즘 문제풀이 (46)
      • 공부일상 (6)
      • 기타 (6)
      • Tip (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    D2
    React Hooks
    react-native-maps
    d1
    react
    오블완
    boj
    SWEA
    javascript
    error
    백준
    reactnative
    코딩테스트
    티스토리챌린지
    프로그래머스
    mongoDB Atlas
    java
    react-native
    React-Native cli
    ios
    hooks
    Expo
    ReactHook
    코테
    Python
    Next.js
    리액트네이티브
    mongodb cloud
    Ai
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
WHITE_FROST
이벤트 루프
상단으로

티스토리툴바