프로그래밍(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를 사용하였습니다.
참고
728x90
반응형