Node.js와 이벤트루프

지드루·2022년 5월 28일
0

Javascript

목록 보기
4/5

Node.js란?

Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다.

공식 홈페이지에서는 위와 같이 Node.js를 소개하고 있다. 어떤것을 의미하는 말일까?

런타임이란 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 의미한다. 즉 위 문구를 다시해석하면 이렇게 되겠다.

Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript를 실행할 수 있는 환경입니다.

Javascript는 스크립트 언어이다. 즉 독립되어 작동하는 언어가 아닌, 다른 응요 프로그램 안에 삽입되어 해석되는 것을 설계 기반으로 하고있다. 다양한 스크립트 언어들이 있지만, Javascript는 표준 HTML 문서 내에 삽입되어 사용되는 것을 그 전제로 하고있다. 때문에 Javascript는 기본적으로 웹 브라우저를 통해서 실행을 해야 하는 것이다.

하지만 바로 여기서 Node.js가 나오게 된다. Node.js를 사용하게 되면 브라우저 없이 바로 실행할 수 있게 되는 것이다. 이를테면 terminal을 통해서 브라우저 없이 Javascript코드를 실행할 수 있게된다.

이벤트

고수준에서 이벤트 처리 프로그래밍은 시스템이 이벤트들에 대한 관심을 표현할 때, 이벤트가 발생했다는 것을 알려주는 방법을 제공하고 콜백을 사용하여 그것에 응답하는 것이다. 이벤트란 무엇일까? 이벤트란 시스템의 상태에 일어난 변화를 의미하며, 콜백이란 Javascript의 경우에는 이벤트가 발생하면 실행되는 함수를 의미한다.

Node.js는 내부적으로 이벤트의 콜백을 처리하기 위해 libuv라는 비동기 이벤트 처리 라이브러리를 사용한다. 이를 위해 libuv와 같은 라이브러리와 프레임워크들은 이벤트루프를 가지는데, 이벤트 루프란 기본적으로 보통 영원히 실행되는 이벤트를 처리하기 위한 루프를 의미한다.

(이벤트루프)

이벤트루프에 대해 쉽게 알 수 있게 해주는 재밌는 예시가 있다. 우리가 지금 패스트푸드점에 가고있다고 상상해보자. 가게에 도착한 당신은 먹고싶은 메뉴를 고심해서 고르고, 이를 접수원에게 알려줄 것이다.(요즈음에는 키오스크를 쓰지만, 키오스크를 접수원이라고 생각해도 좋다.) 접수원은 이를 주방에 알리고, 음식이 나오게되면 알림모니터를 통해 당신에게 음식이 나왔음을 알리게 된다. 바로 이것이 이벤트 루프인것이다.

만약 주문을 받은 접수원이 그대로 음식준비에 들어가게 된다면, 다음으로 음식을 주문하려는 사람은 음식을 주문하기 위해 매우 오랫동안 기다려야만 할 것이다. 이를 그대로 대입하자면, 우리가 시간이 오래걸리는 작업을 하게되면, 우선 이를 queue에 넣고 비동기적으로 처리하는 것이다. 작업이 완료가 되면 사전에 넣어둔 콜백함수를 실행하게 된다.

Blocking 과 Non-Blocking, 그리고 동기와 비동기

Node.js의 이러한 이벤트처리방식은 비동기-논블로킹 방식이다. 그렇다면 이 용어들은 무엇을 의미하는 것일까?

Blocking과 Non-Blocking

우선 블로킹은 다음그림과 같이 동작한다.

정확하게는 sync blocking 모델이다.

그림에서 보이듯 A함수가 B함수를 호출하면, B함수가 제어권을 가져가게 된다. 그리고 제어권이 없는 A함수는 그 시점에서 실행이 멈춘다. 이어서 제어권을 받게된 B함수가 함수를 실행하게 되고, 함수실행이 완료되면 제어권을 다시 A함수에 반환하게 된다. 그리고 A함수는 제어권을 받은 이후 다시 함수를 마저 실행하게 된다.

이것도 간단한 실생활의 예시로 쉽게 이해할 수 있다. 카운터 직원이 주문을 접수한 후, 음식이 나올때 까지 아무것도 하지 않는 것을 상상하면 좋을 것이다.

 
논블로킹은 다음그림과 같이 동작한다.

정확하게는 async non-blocking 모델이다.

논블로킹 방식은, A함수에서 B함수를 호출하더라도 제어권은 A함수가 가지고 있는다. 때문에 B함수를 호출하더라도 계속해서 나머지 코드를 실행하게 된다.

이는 주문받은 음식이 아직 나오지 않았더라도 계속해서 주문을 받는 일을 하는 종업원을 생각하면 알기 쉽다.

동기와 비동기

동기방식은 다음과 같이 말할 수 있다. 요청을 보낸 후, 응답을 받아야 다음 동작이 이루어지는 방식이다. 때문에 시간이 매우 오래걸리는 작업을 진행하게 되면 이후의 작업이 지연되게 된다. 그럼에도 순서는 반드시 보장받게 된다.

비동기방식은 다음과 같다. 동기와는 다르게 요청을 보낸 후, 응답을 바로 받지 않더라도 이후의 작업을 그대로 진행하는 방식이다. 즉, 호출하는 요청에 대한 응답은 신경쓰지 않는다.

이제 Node.js의 방식이 비동기-논블로킹 방식이라는 것이 어떤것을 의미하는지 알 것이라고 생각한다.

0개의 댓글