본문 바로가기

Javascript/Node.js

Node.js의 특징 및 장단점 ?

Node.js의 특징

  • Node.js는 Single-Thread의 이벤트 루프 기반 비동식 방식으로 작동한다.
  • non-blocking I/O
  • 언어 하나로 프론트, 백엔드 전부 커버가 가능하다.
  • JavaScript 엔진(V8 Engine)으로 빌드 된 JavaScript 런타임이다.
  • 따라서, 사용자의 요청은 한 곳에서 받지만 작업은 실질적으로 멀티쓰레드로 운영하여 결과를 구현한다.

V8 엔진

크롬V8 또는 V8이라고 불리는 친구인데, 웹 브라우저를 만드는데 기반을 제공하는 오픈 소스 자바스크립트 엔진으로 구글이 제공하고 있다.
V8 자바스크립트 엔진은 기존 다른 웹 브라우저보다 자바스크립트 처리가 월등히 빠름
왜냐면 JIT(Just In Time)컴파일 방식을 사용하기 때문이다.

이 방식은 자바스크립트를 인터 프리트 하지 않고 즉시 기계어로 컴파일 함. (속도개선)

 

 


싱글 쓰레드의 이벤트 루프 기반 논 블로킹 I/O

싱글쓰레드를 가진 노드는 I/O 작업이 시작되면 처리 완료에 대한 응답을 기다리지 않고 바로 다음 작업을 실행한다.

작업이 끝날 때까지 기다리지 않아도 됨

대신 이벤트를 통해 수행하여야 하는 작업을 등록해놓고, I/O 작업이 종료되면 이벤트를 감지하여 등록된 작업을 실행하게 된다.

이런 방식으로 싱글 쓰레드와 논 블로킹 모델로 가볍고 효율적으로 자원을 사용할 수 있다.

 

다만 싱글 쓰레드의 경우 오류가 발새아면 처리를 해줄 사람이 없으므로 큰 문제가 발생할 수 있고

CPU 코어를 모두 활용하지 못한다는 단점이 있음.

 


이벤트 기반

자바스크립트 엔진은 비동기 처리를 할 수 없다.

그렇기 때문에 비동기로 처리되는 코드를 만날 경우 libuv 라이브러리를 이용해 비동기를 처리하게 됨

libuv는 이벤트 기반으로 비동기를 처리하는데 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.

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

이벤트 기반 모델에서는 이벤트 루프라는 개념이 등장하는데, 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 이벤트 루프가 판단한다.

  • Node.js는 Chrome V8 엔진과 libuv library로 이루어져 있으며 libuv에서 비동기를 처리한다.
  • libuv는 이벤트 기반으로 비동기를 처리한다.
  • 여러 이벤트가 동시에 발생했을 때 순서는 이벤트 루프가 판단한다.

 

 


Node.js 장점

  • 자바스크립트를 동일하게 사용해서 서버단 로직을 처리할 수 있다.
    새로운 언어를 습득하지 않고도 자바스크립트를 활용해 서버기술을 빨리 개발/응용할 수 있습니다.
  • 개발이 빠르고 쉽다. 서버 설치부터 화면 띄우는 것까지 금방 처리 됩니다.
  • Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능
  • 로컬에서 서버만 켜봐도 얼마나 가볍게 돌아가는지 알 수 있다.
  • 이벤트 기반 비동기방식이라 서버 무리가 적다.
  • java(jsp)는 쓰레드에 의한 동기방식이라 요청이 오면 반드시 결과를 받은 후에 다음 로직이 처리될 수 있다.
  • npm(node package manager)을 통한 다양한 모듈(패키지) 제공
    npm을 이용해 자신이 필요한 라이브러리와 패키지를 검색해서 설치하고 사용할 수 있기 떄문에 개발속도와 효율성이 크게 향상된다.

 

Node.js 단점

  • 이벤트 기반 비동기방식이라 서버단 로직이 복잡한 경우 콜백함수의 늪에 빠질 수 있다.
    예를 들어, 한번의 요청에 대해 DB에서 조회한 결과값에 따라 다른 로직을 처리해야 하며, 이런 로직이 여러개인 경우 콜백함수 늪 (Callback Hell) 에 빠진다.
  • 코드를 순차적으로 실행하는 것이 아니라 비동기 방식으로 이벤트를 보내고, 응답(이벤트)이 오면 처리하는 방식이기 때문에 java 개발을 했던 방식으로 설계하고 프로그래밍하면 큰 문제가 발생한다. 
  • 단일 쓰레드(Single Thread)이기 때문에 하나의 작업 자체가 많이 걸리는 웹서비스에는 어울리지 않다. 
    게시판형태와 같이 가벼운 I/O가 많은 웹서비스에 어울린다. 
  • 코드가 수행되어야 코드에 에러가 있는지 알 수 있으며, 에러가 날 경우 프로세스가 내려가기 때문에 테스트가 엄청 중요하다. 반드시 모든 케이스에 대해 소스코드를 검증해야 한다.

Node.js 가 어울리는 웹서비스

  • 간단한 로직. 
  • 대용량(동시에 여러 request를 처리)
  • 빠른 응답시간 요구
  • 빠른 개발 요구
  • 비동기방식에 어울리는 서비스(네트워크 스트리밍 서비스, 채팅 서비스 등)

 

Node.js 가 어울리지 않는 웹서비스

  • 단일 처리가 오래 걸리는 경우 : 싱글 쓰레드이기 때문
  • 서버 체크로직이 많은 경우 : 비동기방식이기 때문에 CallBack Hell에 빠지지 않기 위해
  • 업무 복잡도/난이도가 높은 경우 : 에러가 나면 서버가 죽기 때문에 코드 품질 중요

 

 

참고한 블로그 !

https://junspapa-itdev.tistory.com/3

https://node-js.tistory.com/27

'Javascript > Node.js' 카테고리의 다른 글

블로킹/논블로킹 , 동기/비동기 이해하기  (0) 2022.06.14
npm / yarn 서로 차이점  (0) 2022.06.10
Restful API, package.json (Node.js)  (0) 2022.03.27