Node.js 교과서 (길벗)을 참고로 공부하며 정리하는 글입니다.
노드는 서버 애플리케이션을 실행하는데 있어서 가장 많이 사용된다.
여기서 서버란 ?
간단히 말해 네트워크를 통해 클라이언트에 정보, 서비스를 제공하는 컴퓨터 또는 프로그램을 말한다.
서버가 항상 요청에 응답만 하는 것은 아니다. 서버 역시 다른 서버에 요청을 할 수 있고 그때는 그 서버가 클라이언트 측 역할을 한다.
서버는 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 시스템으로 컴퓨터 프로그램 또는 장치를 의미한다.
-위키백과
노드는 Js 애플리케이션이 서버로서 기능하기 위한 도구를 제공하여 서버 역할을 수행할 수 있다.
노드는 Js 런타임이다. 그럼 런타임이 무엇인가? 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 뜻한다.
런타임 환경(영어: runtime environment)은 컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상 머신의 상태이다. - 위키백과
노드는 V8 자바스크립트 엔진과 더불어 libuv라는 라이브러리를 사용하며 libuv 라이브러리는 노드의 특성인 이벤트 기반,
논 블로킹 I/O 모델을 구현하고 있다.
이런 특징으로 스스로 가볍고, 효율적이라고 표현하고 있다.
이벤트(ex: 클릭, 네트워크 요청 등 ..) 가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.
이벤트 루프 개념 기반으로 동작한다. 여기서 이벤트 루프에 대해서 간단하게 설명하자면 다음과 같다.
콜스택이 비워지면 이벤트 루프가 태스크 큐에 있는 작업을 콜 스택에 올려준다.
자세한 설명은 저번에 포스팅한 [자바스크립트 비동기 처리] 글을 참조하면 된다.(https://velog.io/@kdo0129/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC)
논 블로킹은 이벤트 루프를 활용하여 이전 작업이 완료될 때까지 멈추지 않고 작업을 수행함을 뜻한다.
I/O 작업을 할 때 노드는 논블로킹 방식으로 동작한다.
싱글 스레드를 알아보기 전에 스레드와 프로세스를 비교해보자.
프로세스 : 운영체제에서 할당하는 작업의 단위 ex) 노드, 브라우저 등... ,
프로세스간의 메모리 등의 자원 공유가 불가능하다.스레드 : 프로세스 내에서 실행되는 흐름의 단위, 스레드들은 부모 프로세스의 자원을 공유한다.
즉, 같은 메모리 접근이 가능하다.
쉽게 표현을 해보자면 스레드는 컴퓨터 작업을 처리할 수 있는 일꾼이다.
노드는 이러한 일꾼들을 여러명 사용하는 멀티 스레딩과 비슷한 기능을 할 수 있다. 엄밀히 말하면 멀티 프로세싱에 가깝다.
노드 프로세스는 여러개의 스레드를 가지지만 제어가 가능한 스레드가 하나뿐이라 싱글 스레드라 칭한다.
아래의 표를 보면서 서버로서의 노드의 장점과 단점을 살펴보자.
장점 | 단점 |
---|---|
멀티 스레드 방식에 비해 컴퓨터 작원을 적게 사용 | CPU 코어를 하나만 사용한다. |
I/O 작업이 많은 서버로 적합하다. | CPU 작업이 많은 서버로는 부적합하다. |
멀티 스레드보다 상대적으로 접근이 쉽다. | 싱글 스레드이기 때문에 에러 하나에 전체가 멈추는 상황이 발생한다. |
웹 서버가 내장되어 있다. | 서버 규모가 커졌을 때 서버 관리에 어려움이 있다. |
자바스크립트를 사용해 친숙함이 있다. | 어중간한 성능 |
JSON 형식과 호환하기 쉽다. |
노드는 개수는 많지만 크기가 작은 데이터를 실시간으로 주고 받는 데 매우 적합하다.
네트워크, 데이터 베이스, 디스크 작업 등의 I/O에 특화되어 있기 때문이다.
실시간 채팅 , JSON 데이터를 제공하는 API 서버가 노드를 많이 사용한다.
반대로 이미지, 비디오 처리 등의 CPU를 많이 사용하는 작업을 위한 서버로는 좋지 않다.
요즘에는 AWS Lambda , Google Cloud Functions 등의 서비스에서 작업을 처리하는 것을 지원한다.