본문 바로가기

STUDY/# Node.js

Back-End API 서버 구현을 위한 Node.JS 선택의 이점과 단점 # 3

반응형

by commin

Back-End API 서버 구현을 위한 Node.JS 선택의 이점과 단점

요 약

해당 문서에서는 Node.js의 만들어진 배경에 대해서 먼저 조사하고, Node.js를 알기 위한 기본 구조 및 주요 개념들에 대해 서술합니다. 또한 장점과 단점을 정리하고 Spring Framework와 비교를 통해 앞으로 Back-End 프레임워크 선택 시 도움이 되고자 합니다.

목차
#1 --------------------------- 1  Introduction
#2 --------------------------- 2  Node.js Main Concept
#2 --------------------------- 2.1   Single Thread로 동작하는데 어떻게 동시성을 가질 수 있을까? (이벤트 기반 비동기 방식)
#2 --------------------------- 2.2   Libuv.
#2 --------------------------- 2.3   Event Loop.
#2 --------------------------- 2.4   이벤트루프 실행단계
#2 --------------------------- 2.5   Nonblocking I/O
#3 --------------------------- 3  Advantages and Disadvantages Node.js
#3 --------------------------- 3.1   Node.js 의 장점
#3 --------------------------- 3.2   Node.js 의 단점
#3 --------------------------- 4  Spring과  Node.js 비교
#3 --------------------------- 4.1   Spring vs Node.js
#3 --------------------------- 5  Conclusion.

 

3      Advantages and Disadvantages Node.js

3.1       Node.js 의 장점

-      싱글 스레드 기반 비동기 I/O 처리로 매우 빠른 고성능 서버입니다.

-      개발에 소요되는 시간이 짧습니다.

-      낮은 Learning Curve를 가집니다.

-      프론트엔드와 백엔드 기술의 통합으로 의사소통 비용을 줄일 수 있습니다.

-      아파치 등 별도의 웹서버가 필요 없도록 자체적으로 HTTP 서버 라이브러리를 포함하여 웹 서버 동작이 가능합니다.

-      Restart 시간이 짧아서 빠르게 재시작 할 수 있고 빠른 배포나 업그레이드 작업이 용이합니다.

3.2       Node.js 의 단점

-      코드의 가독성이 자바 언어에 비해 낮아서 유지 보수가 어려워질 수 있습니다. (Typeless language이며 callback 함수의 중첩사용으로 인해서)

-      스크립트 언어의 특성상 수행단계에서 에러를 확인할 수 있기 때문에 에러를 찾아내기 어렵고 동작 중 에러가 나면 쉽게 프로세스가 죽습니다.

-      노드 전용 모듈을 사용해야 하는데 고급 기능이 상대적으로 적으므로 세밀한 구현이 어렵습니다.

-      프로그램이 CPU Intensive job을 수행하게 될 경우 node.js에서 처리 가능한 request 양이 급격히 줄어 들 수밖에 없습니다.

4   No Blocking I/O 모델로 구현된 프레임워크와 Node.js 비교  

4.1       Spring vs Node.js

Spring에서는 요청 당 하나의 스레드가 생성이 되고 생성된 스레드에서 요청에 대한 응답을 하는데 반해 Node.js는 하나의 메인 쓰레드에서 이벤트 루프를 통한 비동기 Non-Blocking I/O로 요청을 이벤트 기반으로 처리합니다.

SpringMulti-Thread 방식에서는 I/O작업이 수반되었을 때, Thread가 수행하는 요청과 응답에 대한 일처리에 비하여 I/O작업은 훨씬 긴 작업시간을 가지고 있고 이러한 시간동안 Thread들이 블로킹 되는 현상이 발생합니다. Thread의 개수가 증가할 때마다 컨텍스트 스위칭이 빈번하게 일어나게 될 것이고 이러한 점 역시 성능저하로 이어집니다.

Node.js에서는 상대적으로 긴 시간의 I/O작업을 기다리지 않고(Async Non-Blocking I/O) client의 요청과 응답만을 담당하기 때문에 더 적은 자원으로 높은 성능을 기대할 수 있습니다. 또 하나의 쓰레드만 운용하기 때문에 Multi-Thread 방식의 동기화 문제에서 자유롭습니다.

5      Conclusion

‘Node.jsSpring보다 더 낫다라고 말할 수 있는 조건은 아래와 같은 전제사항들이 충족되었을 때입니다.

1.     많은 I/O 작업을 수행한다.

2.     단순한 CPU 작업만을 진행한다.

이러한 전제사항들이 충족되지 않았을 때, node.js 를 사용함에 있어서 신중해야 할 것 같습니다. I/O작업이 많지 않으면 Spring과의 성능차이가 별로 없을 뿐 아니라 강도높은 CPU 연산이 높을 경우에는(CPU Intensive) 하나의 쓰레드를 사용하는 Node.js에서는 큰 성능저하가 일어납니다.

최근에는 Spring WebFlux 같은 Java에서도 이벤트기반의 완전한 Non-Blocking I/O 방식을 채택한 프레임워크도 개발되었다고 합니다. (다른 점이라면 Single Thread 방식이 아닌 Multi-Thread라는 점)

가볍고 강력한 동시성을 가진 Node.js Web Application에서 분명히 매력적이고 좋은 프레임워크입니다. 그렇지만 (다른 프레임워크도 그렇지만) 약점이 분명히 존재하므로 개발함에 있어서 정확히 알고 사용하면 더 효율적으로 개발할 수 있을거라고 생각됩니다.

 

-    [Node.js vs Spring boot :: 아는개발자] (https://syundev.tistory.com/229)

-    [Java Spring 과 Node.js 비교](https://selfish-developer.com/entry/Nodejs-vs-Spring-Boot)

-    [블로킹 vs 논블로킹](https://ju3un.github.io/network-basic-1/)

-    [NodeJS는 Single-Thread가 아니다](https://medium.com/@rpf5573/nodejs-nodejs%EB%8A%94-single-thread%EA%B0%80-%EC%95%84%EB%8B%88%EB%8B%A4-f02b0278c390)

-    [Blocking vs Nonblocking](https://medium.com/@rpf5573/nodejs-blocking-vs-non-blocking-8f92f2b522a7)

-    [Node.js는 싱글 스레드?](https://velog.io/@daeseongkim/Node.js-Node.js%EB%8A%94-%EC%8B%B1%EA%B8%80-%EC%8A%A4%EB%A0%88%EB%93%9C)

참고문헌

-    위키백과

-      Node.js를 활용한 웹 서버 성능 분석 (광운대학교 정보콘텐츠대학원 이형근)

-      모바일 웹 어플리케이션을 구현하기 위한 Node.js 파일에 대한 조사 (동의대학교 장종욱)

반응형