Node Js 교과서 - 1

|

노드란?

  • Node.js는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용하며 Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.

  • 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도의 소프트웨어 없이 동작하는 것이 가능하며 이를 통해 웹 서버의 동작에 있어 더 많은 통제를 가능케 한다.

  • 간단히 설명하면, Node.js는 웹환경이 아닌 다른 환경에서 자바스크립트 코드를 실행할 수 있는 프로그램, 환경이라고 볼수 있다.

자바스크립트 런타임

  • 노드는 자바스크립트 런타임입니다. 런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻합니다. 따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있게 해줍니다. 기존에는 자바스크립트 프로그램을 인터넷 브라우저 위에서만 실행할 수 있었습니다. 노드는 V8 엔진을 기반으로 libuv 라는 라이브러리를 사용합니다. V8과 libuv는 C와 C++로 구현되어 있습니다.

  • libuv 라이브러리는 노드의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현하고 있었습니다.

노드는 이벤트 기반?

  • 이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다. 이벤트로는 클릭이나 네트워크 요청 등이 있을 수 있습니다. 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야 합니다. 이것을 이벤트 리스너에 콜백 함수를 등록한다고 표현합니다.

  • 노드도 이벤트 기반 방식으로 동작하므로 이벤트가 발생하면, 이벤트 리스너에 등록해둔 콜백 함수를 호출합니다. 발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면 노드는 다음 이벤트가 발생할 때까지 대기합니다.

논블로킹 I/O

논블로킹 I/O는 무엇일까요? 블로킹은 기본적으로, 요청 <-> 응답을 완료하면 다음 작업을 실행할 수 있습니다. 그렇지만 논블로킹 I/O는 요청을 하고, 응답을 기다리지않고 바로 다음작업을 실행합니다. 그뒤에 순차적으로 완료된 응답을 다시 전달합니다.

image

블로킹보다 논블로킹 방식이 같은 작업을 더 짧은 시간 동안 처리할 수 있음을 알 수 있습니다.

노드는 싱글스레드?

  • 이벤트기반, 논블로킹 모델과 더불어 노드를 설명할 때 자주 나오는 용어, 바로 싱글 스레드입니다. 노드는 싱글 스레드 이므로, 주어진 작업을 혼자서 처리해야합니다. 반대로 멀티 스레드인 시스템에서는 여러 개의 스레드가 일을 나눠서 처리할 수 있습니다.

  • 자바스크립트와 노드에서 논블로킹이 중요한 이유는 바로 싱글 스레드이기 때문입니다. 한 번에 한가지 일밖에 처리하지 못하므로 어떠한 작업에서 블로킹이 발생하면 다음 일을 처리하지 못합니다.

image

  • 위에 그림은 싱글스레드, 블로킹 모델입니다.
  • 이번에는 점원이 한 손님이 주문을 받고, 주방에 주문 내역을 넘긴 뒤 요리가 완성되면 요리를 전달합니다. 그 뒤, 다음 손님의 주문을 받습니다. 딱 봐도 비효율적입니다.

image

  • 위 그림은 싱글스레드, 논블로킹 모델입니다. 노드가 채택하고 있는 방식입니다.
  • 아까와는 다르게 점원 한명이 주문을 받고, 요리가 완성되는 걸 기다리지 않고 다음 주문을 계속 받습니다. 그 뒤, 요리가 완성된 순서대로 손님에게 서빙을 합니다. 점원 혼자서 많은 일을 처리 할 수 있습니다. 단점은 점원에게 문제가 생기거나, 주문이나 서빙을 하는데 시간이 오래 걸릴 경우 처리하기 힘듭니다.

image

  • 멀티스레드, 블로킹 모델입니다. 손님 한명 당 점원이 한명입니다. 보기엔 점원이 여러명이니 싱글 스레드 보다 좋은 방법 같지만 문제는 손님이 많아지면 점원도 늘어납니다. 손님수가 적어지면, 그만큼 점원을 놀게됩니다. 점원을 새로 고용하거나 기존직원을 해고 하는데 비용이 발생합니다.

  • 결론은, 노드도 자체적으로는 스레드를 여러개를 가지고 있습니다. 하지만 프로그래머가 직접 제어할 수 있는 스레드는 하나뿐이므로, 흔히 싱글 스레드라고 부르는 것입니다. 노드는 스레드를 늘리는 대신, 프로세스 자체를 복사해 여러 작업을 동시에 처리하는 멀티 프로세싱 방식을 택했습니다. 자바스크립트 언어 자체가 싱글 스레드 특성을 띠고 있기 때문입니다.

노드는 어디서 사용할까?

  • 서버
    • 노드를 통해 다양한 자바스크립트 애플리케이션을 실행할 수 있지만, 노드는 서버 애플리케이션을 실행하는 데 제일 많이 사용됩니다.

Comments