ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이벤트 기반 (Event-Driven)
    JavaScript/Node.js 2019. 5. 25. 15:03

    이벤트 기반이란 이벤트가 발생할 때 미리 지정해 둔 작업을 수행하는 것을 의미한다.

     

    이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 어떤 작업을 수행할 것인지 미리 등록해야한다.

    예를 들어 어떠한 버튼을 클릭했을 때 경고 메시지를 띄우는 행위가 있다고 하자.

    이것을 이벤트 리스너(Event-Listener)에 콜백(Callback) 함수를 등록한다고 표현한다.

     

    1-1. 이벤트 기반 흐름도

    이벤트 기반 모델에선 '이벤트 루프'라는 개념이 등장한다.

    여러 이벤트가 동시에 발생했을 때, 어떤 순서로 콜백 함수를 호출할 지를 '이벤트 루프'가 판단한다.

     

     

    Node.js는 자바스크립트와 마찬가지로 함수 호출 부분을 발견하면 호출한 함수를 '호출 스택'에 담는다.

    아래의 코드를 보자.

    function first() {
    	second();
    	console.log('first 함수 호출');
    }
    
    function second() {
    	third();
    	console.log('second 함수 호출');
    }
    
    function third() {
    	console.log('third 함수 호출');
    }
    
    first();

    자바스크립트를 이미 아는 사람이라면 위의 결과를 알고 있을 것이다.

    전역 컨텍스트에 호출한 first()가 가장 먼저 호출이 되고, 이후 second()가 호출되고, third()가 호출된다.

    콘솔의 결과는 third(), second(), first() 순으로 찍히게 된다.

     

    1-2 호출 스택 흐름도

    main() 함수는 전역 컨텍스트를 의미한다.

    함수의 실행이 완료되면 해당 함수는 '호출 스택'에서 지워진다.

     

     

    여기서  setTimeout()의 개념이 추가되면 호출 스택만으로는 이해하기 어려운 상황이 발생한다.

    다음과 같은 코드가 있다고 해보자.

    function run() {
    	console.log('5초 후 실행되었습니다.');
    }
    
    console.log('시작');
    setTimeout(run, 5000);
    console.log('종료');

    위의 코드는 5초 후에 run()을 실행시키는 코드다.

    결과는 예측하기 쉽지만 run()이 호출 스택에 언제 들어가는지 알기 어렵기 때문에 이를 호출 스택으로 설명하기 어렵다.

    이를 이해하려면 이벤트 루프, 태스크 큐, 백그라운드를 알아야 한다.

    • 이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정한다. 노드가 종료될 때까지 작업을 반복한다.
    • 태스크 큐 : 이벤트 발생 후 호출될 콜백 함수들을 쌓아두는 곳이다. 콜백들은 이벤트 루프가 정한 순서대로 쌓인다.
    • 백그라운드 : 타이머나 I/O 작업 콜백, 이벤트 리스너들을 쌓아두는 곳이다.

     

    1-3 이벤트 루프 흐름도

    태스크 큐는 그림 상으로 하나로 표현했지만 실제 태슼 큐는 여러 개의 큐로 구성되어 있다.

    전역 컨텍스트인 main() 함수가 호출 스택에 들어간다. 이후에 setTimeout이 호출 스택에 들어간다.

    setTimeout()이 실행되면, 타이머와 함께 run() 콜백을 백그라운드로 보내고 호출 스택에서 제거되고, main() 함수가 호출 스택에서 제거된다.

    백그라운드에서 5초 후 run() 함수를 태스크 큐로 보낸다.

    이벤트 루프는 정해진 규칙에 따라서 콜백 함수들을 호출 스택으로 부른다.

     

     

     

    이 글은 다음과 같은 내용을 참고하여 공부한 챕터를 정리한 내용입니다.

    Node.js 교과서 - 길벗 출판사

    'JavaScript > Node.js' 카테고리의 다른 글

    싱글 스레드  (0) 2019.05.26
    논블로킹 I/O  (0) 2019.05.26
    자바스크립트 런타임  (0) 2019.02.24
    Node.js란  (0) 2019.02.12
    모듈화  (0) 2018.12.10
Designed by Tistory.