Node.js란
구글의 크롬 V8 자바스크립트 엔진으로 빌드 된 이벤트 기반 자바스크립트 런타임이다.
Single Thread 기반의 Event Loop를 통한 File, Network 등에 대해서 Non-blocking I/O 를 지원한다.
위의 Bold Text는 Node.js를 개발한다면 굉장히 중요한 개념이므로 앞으로 계속해서 포스팅할 예정이다.
Node.js의 장점
Node.js의 등장 이전에는 javascript는 클라이언트 언어로 인식되어 왔다.
하지만 Node.js의 등장으로 서버 사이드 개발이 가능해지게 됐다.
Node.js는 Spring과 다르게 Single Thread를 사용하고 있다.
Single Thread를 쓰는데도 불구하고 요청을 빠르게 처리할 수 있었던 방법은 이벤트 루프 기반 Non-blocking I/O 방식이다.
하나의 Thread가 요청을 받으면 처리하고 File I/O, Network I/O 등이 있을 경우에 비동기적으로 요청을 보내 놓고
다른 작업을 처리하다가 I/O 작업이 끝나면 이벤트를 받아서 처리하는 이벤트 방식을 사용한다.
이와 같은 이유로 Single Thread지만 CPU가 I/O 응답을 기다릴 필요 없이 다른 작업에 사용되기 때문에 높은 성능을 발휘할 수 있다.
하지만 CPU에 intensive 한 작업이 많은 경우에는 성능을 기대하기 힘들다.
비교적 CPU에 intensive한 작업이 없고 많은 요청을 동시에 처리한다면 높은 성능을 발휘할 수 있다.
쓰레드 기반 동기방식(Blocking I/O)
- 하나의 쓰레드가 request를 받으면 모든 처리가 완료될때까지 기다리다가 처리결과가 완료되면 다시 응답을 보낸다.
- 기존 업무 처리가 완료되기 전에 또다른 request가 있으면 새로운 쓰레드가 업무를 처리한다.
- 동시에 요청이 많은 경우 많은 쓰레드가 필요하게 되어 서버 성능이 떨어지게 된다.
단일쓰레드 이벤트 루프 기반 비동기방식( Non-Blocking I/O)
- 쓰레드가 요청을 받으면 바로 다음 처리에 요청을 보내놓고 다른 작업을 처리하다가 먼저 요청한 작업이 끝나면 이벤트를 받아서 응답을 보낸다.
- 동시에 요청이 오더라도 처리가 완료될때까지 기다리지 않아도 되기 때문에 서버 부하가 적어진다.
Node.js의 단점
Node.js는 Single Thread이기 때문에 하나의 작업에 대해서 시간이 오래 걸리게 된다면 전체적인 성능이 떨어지게 된다.
이 과정에서 만약 예외 처리를 하지 못한 에러가 발생한다면 프로세스 자체가 내려가게 된다.
하나의 쓰레드는 하나의 물리적인 코어밖에 사용하지 못하기 때문에 코어가 많은 시스템이라 해도 성능이 올라가지 않는다.
이러한 단점을 보완하기 위해 cluster를 사용하여 여러 개의 노드 프로세스를 사용할 수 있다.
Node.js는 V8 엔진 기반으로 되어있는데 V8 엔진은 Garbage Collection 기반의 메모리를 관리하기 때문에 GC시 CPU 사용률이 높아지면서 순간적으로 서버를 멈추게 할 수 있다.
Node.js는 event를 Call back 함수를 통해 받는데 이러한 call back 함수가 중첩될 경우 코드의 가독성을 떨어지게 되고
유지보수가 힘들어지게 되며 call back hell(콜백 지옥)이라고 부른다.
이러한 callback hell을 해결하기 위해 promise, promise기반의 async await을 사용하여 보완할 수 있다.
참고 자료
[조대협님 블로그] https://bcho.tistory.com/876