index.js 안에 적은 코드들은 event-loop가 돌기 전에 실행됩니까?

조회수 736회

예를들어서, 제가 index.js안에 console.log( "Hello" ); 라는 딱 한줄의 코드를 쓰고, Terminal에서 node index.js 라고 쳤을때, 1) global module을 불러온다(timer, console .. 등등) 2) 제 index.js안에 있는 코드를 실행한다 3) event-loop를 돌리면서, event-queue안에있는 callback function들을 하나하나 가져와서 실행한다.

이런 순서로 진행되는게 맞나요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 순서는 맞습니다.

    https://developer.mozilla.org/ko/docs/Web/JavaScript/EventLoop

    이벤트 큐는 특정 비동기 이벤트로 발생되는 로직이 구현되어 있는 핸들러(함수)가 들어가는 자료구조로, 질문하신 경우에는 이벤트 큐에 들어가는 것이 없기 때문에 실제로 가져와서 실행하는 것은 없을 거에요.

    (추가)그러고 보니 원래 질문에 답을 안 했군요;;

    코드의 진입점인 index.js 에서 뭐라도 해야만 이벤트 큐에 들어갈 거고 이벤트 루프가 큐에 작업이 있는지 확인 후 있으면 실행하게 되는 구조니까 진입점의 코드가 항상 먼저 실행 될 겁니다.

    게다가 진입점의 코드가 콜스택에 먼저 들어가 쌓였을텐데... 이벤트 루프는 콜스택이 비어 있는지를 확인하고 없을 때 이벤트 큐의 가장 오래된 작업을 실행하므로, 그리고 메인은 싱글쓰레드 이므로 이벤트 큐에 있는 작업이 먼저 실행 되지 않을거라 예상합니다.


    Node.js의 동작 원리를 잘 눌러담은 유명한 말이 있죠.

    In Node.js everything runs in parallel, except your code.

    Node.js에서는 모든 것이 병렬로 동작한다. 네 코드만 빼고.

    실제 Node.js에서 작업 처리는 CPU-bound와 I/O-bound 방식이 존재합니다. I/O-bound는 네트워킹, 파일 시스템, DB 접근 등등, 메인 쓰레드에서 완료를 기다려야 하는 작업을 말하는데요. 실제로 Node.js는 I/O가 완료되기까지 메인 쓰레드가 기다리지 않고 Call Stack 상의 Operation을 처리합니다. I/O가 완료되면 그 콜백이 이벤트 큐에 들어가고 Call Stack 상에 작업이 없으면 하나씩 꺼내어 실행시킵니다.

    이것이 노드가 싱글 쓰레드라고 하지만(엄밀히 말하면... 아닐 수도...) 여러 작업을 blocking 없이 소화해 내는 방식이죠. (동시성 프로그래밍)

    @Rebero 님의 설명을 기준으로 봤을 때,

    • 2번 단계에서 Call Stack과 Heap에 대한 설명
    • CPU, I/O bound에 대한 설명과 Event Queue의 구체적인 동작
    • Thread(Worker) Pool

    이것들만 추가적으로 설명할 수 있다면 Node.js의 동작 방식에 대한 좋은 답변이 될 수 있을 것 같네요.

    영어이긴 하지만 이 포스팅에 있는 그림만 봐도 이해에 도움이 되실 겁니다.

    이 건 제가 Node.js 구조에 대해 처음 접한 포스트입니다.

    • 친절한 답변 감사드립니다. 제가 다음에 NodeJS Event-Loop관련해서 글을 쓰려고 하는데, 혹시 읽어주실 수 있나요? (메일을 남겨주시면 감사하겠습니다) 알 수 없는 사용자 2018.9.13 14:58
    • 저도 그냥 현업에서 필요한 정도까지만 아는 수준이라... 도움이 될 지는 모르겠습니다만 메일은 남겨볼게요. :) doodozik@gmail.com doodoji 2018.9.13 18:40
    • @odoji 감사합니다. 알 수 없는 사용자 2018.9.13 19:59

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)