TIL/Node.js

Node.js 란 무엇인가?

Art Rudy
반응형

I. Node.js 란?

Node.js는 위키백과에 아래와 같이 정의되어 있다. 

Node.js는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용하며 Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다. 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도의 소프트웨어 없이 동작하는 것이 가능하며 이를 통해 웹 서버의 동작에 있어 더 많은 통제를 가능케 한다.

 

II. Node.js의 특징

단일 쓰레드 기반 비동기 방식

Node.js는 단일 쓰레드 기반 비동기 방식으로 동작하기 때문에 Java나 C# 에서 하던 방식대로 로직을 설계하면 안된다. 간단하게 설명하자면, 일반적으로 코드가 위에서 아래로 실행된다고 생각하고 순서대로 작성해서 처리하면 된다고 생각할 수 있지만 단을 쓰레드라는 점을 간과하고 로직을 설계할 경우 예상대로 동작하지 않을 수 있다.

 

쓰레드 기반 동기방식(Blocking I/O)

  • 하나의 쓰레드가 request를 받으면 모든 처리가 완료될 때까지 기다리다가 처리 결과가 완료되면 다시 응답을 보냄
  • 기존 업무 처리가 완료되기 전에 또 다른 request가 있으면 새로운 쓰레드가 업무를 처리함.
  • 동시 request가 많은 경우 많은 쓰레드가 필요하게 되어 서버 과부하

 

단일 쓰레드 이벤트 루프 기반 비동기 방식( Non-Blocking I/O)

  • 하나의 쓰레드가 request를 받으면 바로 다음 처리에 요청을 보내 놓고 다른 작업을 처리하다가 먼저 요청한 작업이 끝나면 이벤트를 받아서 응답을 보낸다.
  • 동시 request가 오더라도 처리가 완료될 때까지 기다리지 않아도 되기 때문에 서버 부하가 적다.

 

III. Node.js의 장단점

장점

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

 

단점

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

 

IV. Node.js의 사용

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

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

 

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

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

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

Express  (0) 2021.07.21
Module  (0) 2021.07.21
Event  (0) 2021.07.21
Nodemon  (0) 2021.07.20
NPM(Nodejs Package Manager)  (0) 2021.07.13