[Node.js] Node.js

Bam·2022년 3월 7일
0

Node.js

목록 보기
1/19
post-thumbnail

Node.js

Node.js(이하 노드)는 Chrome V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다. 종종 어떤 사람들은 프레임워크라고 보기도 하지만 공식문서에서는 런타임이라고 이야기 합니다.

런타임(runtime)이란 특정 언어로 짜여진 프로그램들을 실행할 수 있는 환경을 의미합니다. 자바스크립트 런타임 이라는 것은 자바스크립트로 짜여진 프로그램을 실행할 수 있는 환경이라는 의미가 됩니다.

노드는 런타임이기때문에 자바스크립트 프로그램을 실행할 수도 있고, 단순히 서버를 실행시켜버릴 수도 있습니다. 또는 우리가 익히 알고있는 웹 프레임워크도 노드를 기반으로 돌아가기도 합니다. 서버도 간단히 이야기 하고 넘어가자면 서버는 네트워크 통신으로 클라이언트에 서비스를 제공하는 것을 의미합니다. 서버는 컴퓨터가 될 수도 있고 프로그램이 될 수도 있습니다. 동작은 클라이언트가 요청을 하면 서버가 응답을 하는 식으로 동작합니다.

노드가 빠르고 강력하게 동작하도록 해주는 원리는 노드의 내부구조에 들어있습니다. 노드가 V8 자바스크립트 엔진을 이용한다고 했는데 그외에도 libuv, llhttp 등의 라이브러리를 참조하고 있습니다. 각 참조 라이브러리와 도구에 대해서는 참조 링크의 의존성 항목에 자세히 나와있습니다.

그럼 노드가 뭔지 소개를 했으니 노드의 특성들을 알아보겠습니다.

Node.js의 특성

이벤트 기반 동작 Event driven

이벤트 기반 동작은 이벤트 발생 시 해당 이벤트에 미리 설정한 작업을 수행하는 작업 방식입니다. 이벤트는 웹 브라우저 상에서 일어나는 모든 일들을 의미합니다. 클릭, 드래그, 키다운, 새로고침 등 페이지 상에서 할 수 있는 모든 행동들이 이벤트가 됩니다.

이벤트 기반 동작을 하기 때문에 프로그래머는 이벤트에 따른 작업을 미리 지정해놔야 합니다. 이때 이벤트 리스너에 함수를 등록하게 되는데 이 함수를 콜백 함수라고 합니다. 이렇게 지정을 했다면 사용자가 브라우저 상에서 특정 이벤트를 발생시키면, 해당 이벤트에 등록되어있는 콜백 함수가 실행됨으로써 이벤트에 대한 작업을 수행하게 되고, 이것을 이벤트 기반 동작이라고 합니다. 이 과정들을 정리해보면 다음과 같습니다.

  1. 프로그래머가 이벤트 리스너에 콜백 함수를 등록한다.
  2. 클라이언트로 부터 이벤트가 발생한다.
  3. 이벤트에 등록된 콜백함수를 호출해서 작업을 실행한다.

이벤트 루프 Event Loop

노드에서 이런 이벤트들을 관리하고 실행하기 위해 이벤트 루프(Event Loop)개념을 이용합니다. 이벤트 루프는 한 번에 여러개의 이벤트가 발생했을 때 이벤트에 대한 콜백 함수 호출 순서를 판단하는 역할을 합니다. 이는 노드의 시작부터 종료까지 이벤트 처리를 위해 동작을 계속해서 반복하기에 루프라는 이름이 붙게 되었습니다.

한가지 예시로 이벤트 루프와 일련의 동작들에 대해서 소개를 해보겠습니다. 아래의 코드를 Call Stack으로 나타내보면 다음과 같습니다.

function a() {
  b();
  console.log('a');
};

function b() {
  console.log('b');
};

a();

하지만 이상태에서 setTimeout과 같은 비동기코드가 들어오면 어떻게 할까요? 기다렸다가 실행하게 될까요? 호출스택만으로는 모든 것을 설명하기 어렵습니다. 그래서 우리는 이벤트 큐와 호출 스택 그리고 백그라운드를 이용해서 설명을 하게 됩니다.


  1. 콜백이 들어오면 Call Stack에 push한 다음 실행할 차례가 되면 스택에서 pop합니다. 그리고
  2. 그 안에 담긴 내용을 백그라운드에서 수행시킵니다.
  3. 수행된 작업은 태스크 큐로 enQueue됩니다.
  4. 이벤트 루프가 콜스택이 비었는지 아닌지 확인하고, 비었다면 태스크 큐의 작업을 콜스택으로 보내고 그렇지 않으면 대기시키는 역할을 하게 됩니다.

이것이 이벤트 루프와 그 일련의 동작과정들 입니다. 그래서 setTimeout()같은 경우 실행해보고 실제로 초를 시간을 측정해본다면 지정한 시간에 맞출 수도 있고, 그보다 느릴 수도 있는 경우가 발생합니다.

논 블로킹 입출력 모델

입출력은 정보를 입력하고 보내는 것 들을 통칭합니다. 파일 시스템이나 네트워크 요청 등도 모두 입출력이라고 할 수 있습니다. 그리고 노드에서 입출력 작업은 다른 작업과 동시에 실행이 될 수 있습니다. 그래서 우리는 노드의 이런 동작을 논 블로킹 입출력 모델이라고 부릅니다.

블로킹과 논 블로킹을 설명하자면, 블로킹 모델은 한 작업이 시작되면 그 작업이 끝날 때 까지 다른 요청은 작업을 수행하지 못하고 기다려야하는 방식입니다. 논 블로킹은 이전 작업의 끝을 기다릴 필요없이 요청이 오는대로 수행을 시작하는 것을 의미합니다. 당연히 우리는 논 블로킹 모델을 이용하는 것이 빠르게 작업을 수행할 수 있음을 알 수 있습니다.

노드논 블로킹 입출력 모델을 채택했기 때문에 코드를 작성할 때 논 블로킹 방식을 최대한 활용하게끔 만들어주어야합니다. (채택을 했을 뿐 컴퓨터는 명령을 내리지 않으면 당연히 모릅니다.) 그래서 이때 자주 이용하게 되는 기술이 setTimeout(콜백, 0), setImmediate(콜백) 등과 같은 내장 객체들을 이용해서 논 블로킹을 활용하도록 합니다.

제어가능한 스레드는 하나

우선 스레드란 프로세스 내부에서 실행되는 흐름의 단위입니다. 프로세스는 OS로 부터 받는 작업의 단위입니다. 더 쉽게 이야기하자면, 프로세스가 하나의 일이면 스레드는 그 일에 할당된 일꾼들이라고 이해하도록 합시다.

프로세스는 스레드를 여러개 만들 수 있기에 하나의 작업을 받으면 여러 스레드가 일을 처리하도록 합니다. 노드는 하나의 프로세스를 만들고 그 밑에 여러 개의 스레드를 생성합니다. 우리가 이 스레드들을 모두 관리하면 좋겠지만 아쉽게도 노드에서는 하나의 스레드만 직접 제어가 가능합니다. 그렇기 때문에 노드가 싱글 스레드 같다라는 표현을 어디선가 종종 볼 수 있는 것입니다. 노드를 이용할 때는 여러개의 프로세스를 만드는 방식으로 이용하게 됩니다.

Node.js 시작하기

그럼 이제 노드를 시작해볼까요?

노드공식 홈페이지에서 다운로드가 가능합니다.두 가지가 있는데 당장은 최신 버전보다는 안정적인 LTS 버전을 추천합니다.

그리고 선택이자 권장 사항으로 노드 패키지 매니저 npm을 업데이트 해주면 노드를 시작할 준비는 마쳐졌습니다. 노드를 배울 정도면 이미 자바스크립트를 어느정도 알고있다는 가정하이므로, IDE나 에디터에 대한 이야기는 하지 않겠습니다.

npm install -g npm

추가적으로 자바스크립트 웹 프레임워크나 플랫폼, 라이브러리들이 대부분 ES6 이후의 문법들을 많이 사용하기 때문에 ES6 이후의 문법들을 어느정도 이해하시고 시작하시는 것을 권장드립니다.

0개의 댓글