본문 바로가기

Node.js

Node.js (1) 핵심 개념 이해하기

Node.js란

Node.js는 간단히 말해 '자바스크립트 런타임' 입니다. 즉, 자바스크립트를 실행할 수 있도록 해주는 환경이라고 볼 수 있습니다. Node.js 덕분에 우리는 브라우저에서만 실행가능했던 자바스크립트라는 언어를 컴퓨터에서 실행할 수 있게 되었고, 서버, 웹, 모바일, 데스크톱 애플리케이션 개발을 위해서 사용할 수 있게 되었습니다. 

Node.js의 특징

Node.js를 설명하는 특징은 크게 3가지가 있는데, 이 3가지 특징들은 서로 연관되어 있습니다. 이번 글에서는 이 특징들에 대해 알아보겠습니다.

1. 싱글 스레드

흔히 Node.js는 싱글 스레드로 작동한다는 것을 많이 들어보셨을 겁니다. 싱글 스레드란 말 그대로 스레드가 하나뿐이며, 따라서 실행 흐름이 오직 하나만 있다는 것입니다. Node.js는 싱글스레드이지만, 엄밀히 보자면 싱글 스레드로만 동작하지는 않습니다. 정확히 말하자면, 자바스크립트 코드가 하나의 스레드에서만 실행된다는 것입니다. 그 외에 I/O 등의 작업들에 대해서는 별개의 스레드로 작업들을 위임하여 처리합니다. 이러한 특징 덕분에 Node.js는 논 블로킹으로 일을 처리할 수 있습니다.

2. 이벤트 기반

Node.js는 이벤트 기반(event-driven)입니다. 이벤트 기반이란 프로그램의 흐름이 이벤트의 발생으로 인해 정해지는 것을 말합니다. 즉 이벤트가 발생하면 해당 이벤트에 등록된 콜백이 실행되는 방식입니다. Node.js에서는 이벤트에 대한 작업을 콜백 함수 형식으로 등록하고, 해당 이벤트가 발생했을 때 등록된 콜백 함수들을 실행시키는 방식으로 동작합니다. 이를 위해 Node.js는 이벤트 루프(event loop)라는 것을 사용합니다. 

3. 논 블로킹 

논 블로킹이란 어떤 작업을 실행할 때, 해당 작업이 완료될때까지 대기하지 않고, 즉시 다음 작업을 수행하는 것을 의미합니다. 즉, 여러 큰 작업들이 있을때 하나 하나 작업이 끝날때까지 다른 작업들을 미뤄두는 것이 아니라, 작업을 백그라운드로 넘겨 백그라운드에서 실행하게 하고, 메인 스레드에서는 다음 작업 처리를 시작한다는 것입니다.  

 

이벤트 루프(event loop)

앞서 설명한 3가지 특징들이 가능하게 해주는 것은 바로 이벤트 루프라는 것입니다. 이벤트 루프란 비동기 작업들을 효율적으로, 논 블로킹 방식으로 처리할 수 있게 도와주는 메커니즘으로, Node.js가 싱글 스레드, 이벤트 기반으로 훌륭하게 작업들을 처리할 수 있게 해주는 핵심적인 요소입니다. 이벤트 루프는 반복적으로 이벤트가 발생하였는지를 확인하고 등록된 콜백함수들을 정해진 규칙에 따라 호출스택으로 불러와 실행합니다. 이벤트 루프에 동작 순서에 대해서 간단히 알아보겠습니다.

 

  1. 비동기 작업이 호출 스택에 쌓입니다.
  2. 비동기 작업에 대한 콜백 함수를 콜백 큐(이벤트 큐)에 넣습니다.
  3. 비동기 작업이 완료(이벤트가 발생)되면, 콜백 함수를 태스크 큐로 가져옵니다.
  4. 호출 스택이 비어 더 이상 실행할 컨텍스트가 없다면 정해진 규칙에 따라 태스크 큐에서 콜백 함수들을 가져와 호출 스택으로 넣습니다.
  5. 호출 스택에서 해당 콜백함수가 실행되고 제거됩니다.
  6. 이벤트 루프는 태스크에 콜백이 들어올대까지 대기합니다.

즉 이벤트 루프는 Node.js 어플리케이션의 흐름을 관리하며, 비동기 작업들을 처리합니다. 이벤트 루프 덕분에 Node.js는 싱글 스레드임에도 작업들을 동시적으로, 논 블로킹 방식으로 처리할 수 있습니다.

 

마치며

이번 글에서는 Node.js의 핵심적인 특징인 이벤트기반, 논 블로킹, 싱글 스레드에 대해서 알아보았습니다. 다음 글에서는 Node.js의 이벤트 루프에 대해서 더 자세히 알아보도록 하겠습니다.