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사용률이 급격히 올라 서버를 멈추게 할 수 있다.
- 노드 전용 모듈을 사용해야 하는데, 고급 기능이 적어 세밀한 가용성 구현이 어렵다.
- 이벤트 기반 프로그래밍으로 전환하는 데에 시간이 걸린다.
정리
개발은 빠르고 쉽다는 장점이 있으나, 운영 관점에서 테스트, 장애 대응, 디버깅 등이 약점이다.
참고문서