프로그래밍/Node.js

Node.js 1장 노드 시작하기

p-a-r-k 2019. 1. 2. 13:20
반응형

* 해당 글은 (주)길벗 `Node.js교과서` 내용을 바탕으로 복습 차 정리중입니다.


1.1 노드의 핵심 개념

노드의 공식사이트 에서는 노드를 다음과 같이 설명하고 있습니다.

Node.js란

Node.js는 크롬 V8자바스크립트 엔진으로 빌드 된 자바스크립트 런타임입니다..

이벤트기반, 논블로킹 I/O모델을 사용해 가볍고 효율적입니다.

Node.js의 패키지 생태계인 npm은 세계에서 가장 큰 오픈소스 라이브러리 생태계 이기도 합니다.


1.1.1 서버

노드는 서버로만 사용되는것은 아니지만 서버 애플리케이션을 실행 하는데 제일 많이 사용됩니다.

서버는 클라이언트의 요청에 대해 응답을 합니다.

응답으로 YES를 할 수도 NO를 할 수도 있습니다.

노드는 자바스크립트 애플리케이션이 서버로서 기능하기위한 도구를 제공하므로, 서버 역할을 수행할 수 있습니다.


1.1.2 자바스크립트 런타임

노드는 자바스크립트 런타임입니다.

런타임은 특정언어로 만든 프로그램들을 실행할 수 있는 환경이며, 노드는 자바스크립트 프로그램을 컴퓨터에서 실행하게끔 해줍니다.

2008년 구글의 V8엔진을 사용한 크롬 출시로 오픈 소스도 공개되면서 2009년 V8엔진 기반의 노드 프로젝트가 시작되었습니다.

노드는 V8과 더불어 libuv라는 라이브러리를 사용합니다.

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


1.1.3 이벤트 기반

이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다. (클릭.. 네트워크 요청 등..)

이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해둬야 합니다.

이것을 이벤트 리스너에 콜백함수를 등록한다고 표현 합니다. 

이벤트 기반 모델에서는 이벤트 루프라는 개념이 등장합니다.

  • 이벤트 루프
    • 이벤트 발생 시 호출할 콜백함수들을 관리하고, 호출 된 콜백함수의 실행 순서를 결정하는 역할.
    • 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 불림.
  • 태스크 큐
    • 이벤트 발생 후 호출되어야 할 콜백함수들이 대기하는 공간.
    • 콜백들이 이벤트 루프가 정한 순서대로 줄을 서 있으므로 콜백 큐라고도 부름.
  • 백그라운드
    • 타이머나 I/O작업 콜백 또는 이벤트 리스너들이 대기하는 곳.


1.1.4 논블로킹 I/O

이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있습니다.

오래걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 그 함수가 다시 태스크 큐를 거쳐서

호출스택으로 올라오기를 기다리는 방식입니다. 이방식이 논블로킹 방식입니다.

이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 뜻합니다.



위 그림을 보면 블로킹보다 논블로킹이 같은작업을 짧은 시간동안 처리할 수 있음을 알 수 있습니다.

하지만 '싱글 스레드'라는 한계 때문에 모든 코드가 이 방식으로 시간적 이득을 볼 수 있는 것은 아닙니다.

노드 프로세스 외의 다른 컴퓨팅 자원을 사용할 수 있는 I/O작업이 주로 시간적 이득을 많이 봅니다.


I/O는 입력/출력을 의미하며, 파일 시스템 접근(파일 읽기, 쓰기, 폴더만들기 등)이나 네트워크 요청 같은 작업이 I/O의 일종입니다.

이러한 작업들을 할 때 노드는 논블로킹 방식으로 동작합니다.


1.1.5 싱글 스레드

노드는 싱글 스레드이므로 주어진 작업을 혼자서 처리해야 합니다.

반대로 멀티스레드인 시스템에서는 여러 개의 스레드가 일을 나눠서 처리할 수 있습니다.

자바스크립트와 노드에서 논블로킹이 주용한 이유는.. 바로 싱글 스레드이기 때문입니다.

한번에 한 가지 일밖에 처리하지 못하므로 어떠한 작업에서 '블로킹'이 발생하면 다음 일을 처리하지 못합니다.

사실 노드프로세스도 내부적으로는 스레드를 여러개 가지고 있지만, 직접 제어할 수 있는 스레드는 하나뿐이므로 흔히 싱글스레드라 부릅니다.

노드는 스레드를 늘리는 대신, 프로세스 자체를 복사해 여러작업을 동시에 처리하는 멀티 프로세싱 방식을 택했습니다.

자바스크립트 언어자체가 싱글 스레드 특성을 띄고있기 때문입니다. (cluster모듈과 pm2패키지로 멀티프로세싱이 가능합니다.)



1.2 서버로서의 노드

노드서버는 I/O가 많은 작업에 적합합니다. libuv라이브러리를 사용하여 I/O작업을 논블로킹 방식으로 처리해줍니다.

따라서 스레드 하나가 많은수의 I/O를 혼자서도 감당할 수 있습니다. (CPU부하가 큰 작업에는 적합하지 않습니다.)

싱글스레드 방식의 프로그래밍은 멀티 스레드보다 상대적으로 쉽습니다. 서버 프로그래밍에 익숙하지 않은사람도 쉽게 입문할 수 있습니다.

하지만 싱글스레드이다보니 하나뿐인 스레드가 에러로인해 멈추지 않도록 잘 관리해야합니다. 에러를 제대로 처리하지 못하면 서버 전체가 멈추기 때문입니다.


또한, 웹 서버가 내장되어 있어 입문자가 쉽게 접근할 수 있습니다. 하지만 나중에 규모가 커지면 결국 nginx등의 웹서버를 노드서버와 연결해야 합니다.

장점
단점
멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용함싱글 스레드라서 CPU코어를 하나만 사용함
I/O작업이 많은 서버로 적합CPU 작업이 많은 서버로는 부적합
멀티 스레드 방식보다 쉬움하나뿐인 스레드가 멈추지 않도록 관리해야 함
웹 서버가 내장되어 있음서버 규모가 커졌을 때 서버를 관리하기 어려움
자바스크립트를 사용함어중간한 성능
JSON 형식과 호환하기 쉬움


위와같은 특성을 활용하려면 노드는 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는데 적합합니다.

네트워크나 데이터베이스, 디스크 작업 같은 I/O에 특화되어 있기 때문입니다.

실시간 채팅 애플리케이션이나 주식차트, JSON데이트를 제공하는 API서버가 노드를 많이 사용합니다.

이미지나 비디오처리, 대규모 데이터 처리 같이 CPU를 많이 사용하는 작업을 위한 서버로는 권장하지 않습니다.

NASA, 에어비앤비, 우버, 넷플릭스, 페이팔, 이베이등에서 노드를 사용하고 있습니다.


1.3 서버 외의 노드

처음에는 대부분 노드를 서버로 사용했지만, 자바스크립트 런타임이기 때문에 용도가 서버에만 한정된 것은 아닙니다.

사용범위가 점점 늘어나 웹, 모바일, 데스크톱 애플리케이션 개발에도 사용되기 시작했습니다.

노드기반으로 돌아가는 대표적인 웹 프레임워크로는 angular, react, vue, meteor등이 있으며, 

데스크톱 개발 도구로는 electron이 대표적입니다.

electron으로 만들어진 프로그램으로는 atom, slack, discord, vscode 등이 있습니다.


1.4 개발 환경 설정하기


https://nodejs.org/en/ 접속 후 '짝수'버전으로 설치합니다.

LTS: 기업을위해 3년간 지원하는 버전입니다. 짝수 버전만 LTS버전이 될 수 있습니다.

CURRENT: 최신기능을 담고있는 버전입니다. 짝수가 CURRENT이면 사용하는것을 고려해볼 만합니다.

홀수버전 : 노드는 6개월마다 버전을 1씩 올립니다. 홀수는 LTS버전을 지원하지않습니다.


설치를하여 터미널에서 node -v와 npm -v를 실행했을때 버전이 표시되면 정상입니다.


반응형