프로그래밍(Basic)/Javascript(TS,Node)

[바미] Node 그리고 장, 단점.

Bami 2023. 1. 8. 17:40
728x90
반응형

Node.js 란?

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

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

 

Node.js와 관련된 핵심키워드는 아래와 같습니다. 

  • 구글 V8 자바스크립트 엔진
  • 고성능 네트워크 서버
  • 단일 쓰레드(Single Thread) 이벤트 루프(Event Loop) 기반
  • 비동기 I/O 처리(Non-Blocking I/O)
  • 자바스크립트
  • 개발 생산성 향상
  • 방대한 모듈 제공(NPM)

 

가장 중요한 특징

Node.js는 단일쓰레드 기반 비동기방식으로 구성되어 있습니다.

 

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

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

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

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

 

Node js 의 장점과 단점

장점

성능 관점

  • 싱글 스레드 기반 비동기 IO처리로 매우 빠른 고성능 서버이다.
  • CPU intensive하지 않고, 많은 Connection을 동시에 처리해야 하는 상황에서 nodejs의 성능이 좋다.
  • 브라우저 외 다른 용도의 서버로도 사용 가능하다.
  • restart 시간이 1초 미안이기 때문에 프로세스가 종료되어도 빠르게 다시 시작할 수 있고, 빠른 배포나 업그레이드 작업이 가능하다.

생산성 관점

  • JS는 자바와 같은 프로그래밍 언어보다 생산성이 좋다. 같은 서버 코드를 짜는데 걸리는 시간이 적다.
  • 낮은 learning curve
  • 프론트엔드와 백엔드 기술의 통합 : 프론트엔드 개발자들도 js 기술을 가지고 서버 백엔드를 개발할 수 있게 된다. 따라서 의사 소통 비용을 줄일 수 있다.
  • 싱글 스레드기 때문에 스레드간의 동기화 처리 등의 복잡한 과정을 생략할 수 있다.

개발과 운영 도구

  • 아파치 등 별도의 소프트웨어 없이 http 서버 라이브러리를 포함하여 웹 서버 동작이 가능하다.
  • socket.io API만 이용하면 싱글 스레드 기반 멀티 플랙싱을 기반으로 대용량 사용자에 대한 푸쉬 처리를 가능하게 한다. (WAS는 쓰레드 수 만큼 밖에 동시 connection처리를 할 수 없다 )
  • 서버 플랫폼으로서 높은 인기를 가지고 있어 개발자 커뮤니티가 활성화 되어있고, npm을 통해 왠만한 기능은 이미 다른 개발자가 모듈로 구현해 두었다.

단점

  • 싱글 스레드 모델이기 때문에, 하나의 작업이 시간이 많이 걸리면 전체 시스템의 성능이 급격하게 떨어진다.
  • 코드의 가독성이 자바 언어에 비해 낮아 유지 보수가 어려워질 수 있다. (예: call back 중첩)
  • 스크립트 언어의 특성 상 해당 언어가 수행되어야 에러가 나는지 확인할 수 있고, 에러가 날 경우 프로세스가 종료된다. = 잘 죽는다
  • 멀티 코어 머신에서 CPU 사용을 최적화 할 수 없다. 따라서 설계시 클러스터 모듈 등을 이용해 하나의 서버에서 여러 노드 프로세스를 사용하는 모델을 지녀야 한다.
  • 세션 등을 공유할 경우 redis와 같은 추가 인프라가 필요하다.
  • V8엔진은 gc기반 메모리 관리를 하여, Gc시 cpu사용률이 급격히 올라 서버를 멈추게 할 수 있다.
  • 노드 전용 모듈을 사용해야 하는데, 고급 기능이 적어 세밀한 가용성 구현이 어렵다.
  • 이벤트 기반 프로그래밍으로 전환하는 데에 시간이 걸린다.

정리

개발은 빠르고 쉽다는 장점이 있으나, 운영 관점에서 테스트, 장애 대응, 디버깅 등이 약점입니다.

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

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

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

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

 

실제 Node.js를 사용한 회사

Netflix, Linkedin, Paypal, Uber, Facebook 같은 회사들 역시 자신의 서비스에 적극적으로 Node.js를 사용하였습니다.

 

참고

https://jeongupark-study-house.tistory.com/80

https://bcho.tistory.com/876

https://d2.naver.com/helloworld/4994500

728x90
반응형