본문 바로가기
개발 이야기/NodeJS

NodeJS 동작 방식과 개념 정리

by 농개 2019. 3. 2.
반응형

01. NodeJS 란?

NodeJS란 싱글 스레드 기반으로 동작하는 고성능 비동기 네트워크 서버이다.

기반언어는 자바스크립트이다. NodeJS가 자바스크립트로 만들어졌다는게 아니라, 자바스크립트로 프로그램을 작성한다는 의미이다. NodeJS는 C++로 만들어졌으며, 비교하자면 JVM과 같은 런타임이다.(JVM의 특징과는 많은 차이가 있다.)





02. 웹브라우저 엔진(V8)과 NodeJS

자바스크립트는 웹브라우저에서 동작하는 언어이다. 
NodeJS는 웹브라우저에서 사용하는 자바스크립트 엔진을 따로 구성시켜 자바스크립트로 프로그램을 돌린다는 것이다.
NodeJS의 엔진구조를 검색해보면 다양한 이미지들이 나온다. 






03. 싱글스레드와 비동기

JVM에서 구동하는 애플리케이션은 스레드나 프로세스를 만들어 동작하는 방식이다.
클라이언트가 서버에 요청을 보내면 서버의 스레드풀에 이미 만들어진 스레드를 할당해서 클라이언트 1명이 하나의 스레드를 점유하며 사용하게 된다. 만약 특정 서버에 동시 접속자 수가 많다면 그만큼 스레드풀의 size를 늘려서 스레드 수를 늘려야 할것이다. 하지만 이는 분명 한계가 있고, 엄청난 트래픽을 감당하기에는 부적합 할 수 있다.


NodeJS는 이벤트 루핑이라는 스레드가 하나만 존재한다. 내부적으로 I/O처리를 위한 스레드 풀이 존재하기도 한다.(파일 읽기와 같은 동작을 처리하기 위해)

하지만 기본적으로 이벤트 루프를 활용한 싱글 스레드 컨셉이 특징이다.



NodeJS는 파일읽기와 같은 블록킹 연산도 비동기적으로 수행된다. 

싱글스레드가 블록킹 연산을 수행하면 이벤트 루프가 멈추기 때문에 내부적으로 스레드 풀을 두어서 블록킹 연산 수행한다.



04. NodeJS의 한계와 극복

고성능의 싱글스레드 기반이라고는 하지만 단점도 있다. 
이벤트 루핑 스레드는 클라이언트의 요청을 반복적으로 watching 하면서 메시지를 처리한다. 하지만 요청 작업의 CPU연산이 많은 경우에는 해당 요청을 처리하는데 시간이 많이 소요된다. 마찬가지로 RDB의 트랜잭션이 긴 쿼리가 수행된다면 CPU가 죽어버릴수도 있다. 
--> 이를 근본적으로 해결하는 방안은 없다. 그렇기 때문에 NodeJS는 단순한 작업만을 하는 프로그램에 유리하고, 마이크로 서비스형태에 최적이다. 즉, 짧은 이벤트 단위로 많은 트래픽을 받는 서버에 유리하다.

마이크로 서비스형태를 구성할 때는 여러 프로세스(하나의 스레드만은 가진)가 어떻게 데이터를 공유할 것인가의 문제도 있다.
JVM과 같은 프로세스에서 스레드를 생성하는 구조는 어차피 같은 프로세스에서 동작하기 때문에 자원의 공유에 있어서는 크게 걱정할 필요가 없다.
--> 여러 모듈들이 개발되어 프로그래밍적으로 이를 극복한다. 인메모리 DB. Redis가 대표적이고, 큐잉 시스템을 이용해서 극복할 수 있다.


RDB를 사용한다면, 대부분의 전통적인 RDB는 트랜잭션 개념이 존재한다. 이는 비동기와 전혀 맞지않는다.
--> NoSQL을 사용한다. 하지만 데이터의 무결성이 중요한 프로그램일 경우에는 적합하지 않을 수 있다. 이 또한 프로그램적으로 해결되어야 할 것이다.















반응형