NodeJS

[JS/Node/BackEnd] NodeJS에 대한 소개

Node JS

공식 홈페이지의 말을 빌려오겠습니다. 무려 Offical이니까요!

Node JS는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다.

음, 모르겠습니다. 런타임.. 우리나라 말로 실행? 뭔가 애매합니다. 

Node JS의 실체

Node JS는 V8 엔진을 똑 떼와서, 어떤 플랫폼이든 JavaScript를 이용해서 프로그래밍 할 수 있게 만든 "개발환경"이라고 생각하면 될 것 같습니다.(운영체제와 같은) 주로 , 웹 서버에 이용되어집니다. 사실, Backend를 JavaScript로 하고 싶어서 만든 것도 , 틀린 말은 아닙니다. 왜냐하면 공식 홈페이지도 아래와 같이 자세하게 안내하고 있습니다.  

비동기 이벤트 주도 JavaScript 런타임으로써 Node.js 는 확장성 있는 네트워크 애플리케이션을 만들 수 있도록 설계되었습니다.

NodeJS의 장점

비동기 API를 사용과 싱글 스레드의 뛰어난 확장성

 

대부분의 OS나 서버는 멀티 스레드를 이용하게 됩니다. 왜냐하면, 멀티코어 환경에서 CPU를 idle하게 냅두는건 자원(Resoure)의 낭비이기 때문입니다. 하지만, I/O 작업은 어쩔 수 없이 병목구간이 생기기 때문에"병렬적"으로 처리하게 됩니다. (무언가를 저장하거나 , 네트워크 통신을 하는데 다른 시스템의 간섭을 받으면 그건 치명적인 오류사항 입니다

 

I/O (Input,Output)

서버나 OS에서의 I/O는 Disk/DB에 접근하거나 , Network Access를 위한 작업을 하는걸 I/O라고 합니다.
 보통 떠올리는건 , Desktop에서 모니터,키보드,마우스 까지 떠올리기 쉽지만, Network, 파일 저장 또한 I/O 작업 입니다. 

멀티스레드(MultiThread)

멀티 스레드는 굉장히 어려운 개념이고, 중요한 개념 입니다.
Node는 싱글 스레드 환경이기 때문에, 여기서는 멀티스레드의 단점을 짚고 넘어가겠습니다.
멀티 스레드는 어떻게 보면 굉장히 "이상적"으로 보이는 해결책입니다. 멀티 스레드 환경의 서버는 , 접속자의 수만큼 Thread를 생성하게 됩니다. 하지만, 쓰레드를 생성하는 건 메모리를 소모하는 일이고, 서버의 메모리는 물리적인 한계가 분명히 있게 됩니다. 따라서, 제한된 자원을 가진 서버는 일정 수 이상의 스레드를 생성할 수 없고, 로드 밸런싱 등의 방법으로 분산처리를 하게 됩니다.
또한 , 멀티 쓰레드는 프로그래밍 하기가 어렵습니다. 공유자원을 위한 Lock 정책을 고려해야하고, Thread의 흐름을 잘 제어하여 , 프로그래머가 의도한 대로 Thread가 흐르게 해야합니다.
Node는 JavaScript가 기반이기 때문에, 우선 Single Thread에 최적화 되어있고, 개발자 입장에서는 "개발하기 쉽다"라는 큰 장점이 있습니다. 개발하기 쉽다는건 곧, 에러가 발생할 확률이 적다는 것이고 서버의 입장에서는 "큰 장점"중 하나입니다.

비동기 API

 

스레드를 처리하는 방식을 비동기/동기로 나눌 수 있습니다. "동기(sync)"방식입력이 들어오는대로 처리가 되어져야하는 방식입니다. 즉, 요청한 순서대로  끝나야하는 것이죠. 즉, 첫번째 요청이 끝나지 않으면 2,3은 작업을 할 기회조차 받지 못하는 겁니다.

"비동기 방식(aysnc)"은 어떠한 요청이 먼저 올지 모른다면 "비동기"방식입니다. Node JS에서는 요청이 들어와도, "콜백 수(호출) 제한"을 걸어서, 일정 콜백을 처리하면 다음 단계로 넘어가게 됩니다. 즉, 요청한 순서가 보장되지 않는거죠 .

 

Blocking , Non Blocking

 

Node는 Single Thread이면서 Non Blocking입니다. 하지만, MultiThread는 사용합니다.

Node의 libuv library를 Call해서 , Worker Pool이라는 곳에서 I/O,regix,encrytion 등 CPU 연산(Cpu Brust)이 많이 드는건 따로 처리를 해주고 , I/O요청이 와도 Blocking되지 않고 계속  다른 클라이언트의 요청을 처리하게 됩니다.

 

확장성

어디까지나 Node의 메인 thread인 EventLoop는 싱글 스레드이므로, 유연한 확장성을 갖게 됩니다. 왜냐하면, 서비스가 확장이 되어도 Worker  Pool만 제어하고, 메인 Thread는 오직 1개이기 때문입니다. 

 

V8 엔진의 빠른 속도 

 

V8 엔진은 아주 빠른 엔진입니다. 이건 반박 불가입니다.

 

npm의 존재

 

전세계 최대 패키지인 npm을 이용합니다. 수많은 패키지들이 준비되어 있어,  다양한 모듈들을 npm 명령어 단 하나만으로 접근이 가능하게 됩니다.

 

 

그래서 Node는 어떤 서비스에 어울릴까?

장점으로 유추할 수 있습니다. 비동기 방식이기 때문에, 반응성이 좋습니다.

즉, 실시간 반응이 중요한 시스템이나 간단한 I/O의 요청이 많은 게시판 같은 곳에 Node JS를 이용할 수 있습니다.

 

Node의 단점

 

단점은 장점을 반대로 생각해보면 되겠군요! 싱글 쓰레드이기 때문에, 단일처리가 오래걸리는 친구인 경우에는 어쩔 수 없이 느려지게 될거고, 이벤트 루프가 기반이니까 "서버로직"자체가 복잡한 경우에는 콜백이 중첩되고 중첩되어서, 유지보수가 어려워질 수 있겠군요.. 사실 이건 사용해보면서 느껴봐야겠습니다 :)

'NodeJS' 카테고리의 다른 글

[REST/API/WEB] REST API에 대해서  (0) 2022.10.11
[REST/WEB/구조] Rest구조에 대해서  (1) 2022.10.11