IT

Node.js 개념 이해

유아마루 2020. 11. 17. 10:45
반응형

Node.js

Node.js는 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임입니다. 노드가 무엇인지 알기 위해 노드 공식 사이트에 게시된 설명을 인용하였습니다. 노드를 통해 다양한 자바스크립트 애플리케이션을 실행할 수 있지만, 노드는 서버 애플리케이션을 실행하는 데 가장 많이 사용합니다. 노드는 자바스크립트 프로그램이 서버로서 기능하기 위한 도구를 제공하므로 서버 역할을 수행할 수 있습니다. 트위스티드, 펄로 만든 객체 환경 및 루비로 만든 이벤트 머신과 비슷하게 사용됩니다. 일부 CommonJS 사양이 구현되고 대화형 테스트를 위한 REPL 환경이 포함됩니다.

Node.js

노드는 자바스크립트 런타임입니다. 런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 의미하므로 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있습니다. 노드를 자바스크립트 실행기라고 이해해도 무방합니다. 

기존에는 자바스크립트 프로그램을 웹 브라우저 위에서만 실행할 수 있었습니다. 브라우저는 자바스크립트 런타임을 내장하고 있으므로 자바스크립트 코드를 실행가능합니다. 브라우저가 아닌 다른 환경에서 자바스크립트를 실행하기 위한 여러 시도가 있었지만, 자바스크립트의 실행 속도 문제로 인해 해결되지 않았습니다.

하지만 2008년에 구글이 V8 엔진을 사용하여 크롬을 출시하였고 당시 V8 엔진은 다른 자바스크립트 엔진과 달리 매우 빠르며 오픈 소스로 코드를 공개했습니다. 속도 문제가 해결되어 2009년 V8 엔진 기반의 노드 프로젝트가 시작되었습니다.

 

  구조

노드는 V8과 더불어 libuv라는 라이브러리를 사용합니다. V8과 libuy는 C와 C++로 구현되어 있습니다. 자바스크립트 코드는 노드가 V8과 libuv에 연결해줍니다.

libuy 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있습니다.

Node.js 구조

 

 

 

  특징

- 이벤트 기반(Event-driven)

이벤트 기반(event-driven)이란 이벤트가 발생할 때 미리 지정한 작업을 수행하는 것입니다. 클릭이나 네트워크 요청 등이 이벤트에 해당합니다. 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록합니다. 이것을 이벤트 리스너(event listener)에 콜백(callback) 함수를 등록한다고 표현합니다. 리스너란 말 그대로 '듣고 있는 것'으로, 이벤트가 발생되는 것을 기다리는 것이라고 생각하면 됩니다. 또한 콜백이란 말 그대로 '부르고 난 뒤'로, 이벤트가 발생한 다음 수행되는 동작을 의미합니다.

버튼을 클릭할 때 알림창을 띄우도록 설정하는 것을 예로 들면 클릭 이벤트 리스너에 알림창을 띄우는 콜백 함수를 등록해두면 클릭 이벤트가 발생할 때마다 콜백 함수가 실행되어 알림창이 뜨는 것입니다. 노드도 이벤트 기반 방식으로 동작하므로, 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출합니다. 발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면, 노드는 다시 다음 이벤트가 발생할 때까지 대기합니다.

이벤트 기반 시스템에서는 이벤트 루프(event loop)라는 것이 존재합니다. 여러 이벤트가 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 이벤트 루프가 판단합니다. 노드는 자바스크립트 코드의 맨 위부터 한 줄씩 실행합니다. 함수 호출 부분을 발견하면 호출한 함수를 호출 스택(call stack)에 넣고 다음 코드를 확인하여 호출 스택을 쌓아갑니다. 함수는 실행되는 동안 호출 스택에 머물러 있고 실행이 완료되면 호출 스택에서 지워집니다. 컨텍스트(global context)까지 모두 실행이 완료되면 호출 스택은 비워지게 됩니다. 컨텍스트는 함수가 호출되었을 때 생성되는 환경을 의미합니다. 자바스크립트 코드가 실행되면 기본적으로 글로벌 컨텍스트 안에서 수행된다고 보면 됩니다.

 

▶ 이벤트 루프(event-loop)

- 이벤트 발생 시 호출할 콜백 함수들을 관리

- 호출된 콜백 함수의 실행 순서를 결정

- 노드가 실행 종료될 때까지 이벤트 처리를 위한 작업을 반복(loop)

 

- 논 블로킹 I/O 모델(Non Blocking I/O model)

이벤트 루프를 활용하면 작업 시간이 긴 것도 효율적으로 처리할 수 있는데, 작업에는 동시에 실행가능 한 작업과 드렇지 않은 작업이 있습니다. 기본적으로 자바스크립트 상에서 돌아가는 것은 동시에 실행될 수 없지만 I/O 작업은 동시에 처리가 가능합니다.  I/O란 입력(Input)과 출력(Output)을 의미합니다. 파일 읽기, 쓰기, 폴더 생성이나 네트워크 요청 등이 I/O의 대표적인 예시입니다. 이 때, 논 블로킹 방식으로 처리하는 것이 노드입니다. 

논 블로킹이란 이전 작업이 완료될 때까지 대기하는 것이 아니라 다음 작업을 바로 수행하는 것입니다. 반대로 블로킹이란 이전 작업이 반드시 끝나야 다음 작업을 수행하는 것을 의미합니다. 논 블로킹으로 수행하기 위해서는 작업들이 모두 동시에 처리될 수 있는 작업이어야 합니다. 노드는 이러한 I/O 작업들을 백그라운드에서 동시에 처리하여 시간을 절약합니다. 이러한 작업 순서는 성능을 크게 좌우합니다. 

 

- 싱글 스레드(Single-thread)

싱글 스레드란 스레드가 하나뿐이라는 것을 의미합니다. 스레드는 프로세스 내에서 실행되는 흐름의 한 단위이고 프로세스는 스레드를 여러 개 생성하여 여러 작업들을 동시에 처리합니다. 스레드는 부모 프로세스의 자원을 공유하고 같은 주소의 메모리에 접근이 가능하여 데이터를 공유할 수 있습니다. 

노드를 실행하면 프로세스가 하나 생성되는데 그 프로세스에서 스레드를 생성할 때 내부적으로는 스레드를 여러 개 생성합니다. 하지만 직접 제어가 가능한 것은 스레드 하나뿐이기 때문에 노드가 싱글 스레드라고 하는 것입니다. 하나의 스레드만 제어가 가능하므로 많은 요청이 오면 하나씩 처리하고 논 블로킹 방식을 이용하여 대기 시간을 줄입니다.

 

 

  노드가 싱글 스레드로 동작하지 않는 경우 

  • 스레드풀(Thread Pool) : 노드가 암호화, 파일 입출력, 압축 등 특정 동작 수행 시 스스로 멀티 스레드를 사용.
  • 워커 스레드(Worker Thread) : 노드에서 멀티 스레드를 사용할 수 있게 된 기능으로 직접 다수의 스레드를 제어 가능. CPU 작업이 많은 경우 워커 스레드를 사용하며 노드 12 버전에서 안정화된 기능.
반응형