Node.js 란?
웹 브라우저를 통해 PC에 있는 문서 파일 하나를 업로드 하고 싶다면 먼저 웹 서버에 업로드를 요청해야 합니다. 이때 웹 서버에는 파일 업로드 기능을 담당하는 핸들러(Handler)를 하나 만들어줍니다. 파일의 크기가 크다면 파일을 업로드하는 데 1분 또는 그 이상의 시간이 걸릴 수 있습니다. 파일 업로드를 완료하기 전에는 서버에 있는 다른 파일의 정보를 확인하거나 파일 업로드가 어떻게 진행되는지 요청하는 것이 불가능하여 업로드가 진행될 때까지 대기해야 했습니다.
위와 같은 문제를 해결하기 위해 개발된 것이 노드입니다. 하나의 요청 처리가 끝날 때까지 기다리지 않고 다른 요청을 동시에 처리할 수 있는 비동기 입출력(Non-Blocking IO) 방식을 적용했습니다.
동기/비동기 입출력 방식이란?
- 프로그램이 파일 시스템에 읽기 요청 전송
- 파일 시스템에서 디스크에 있는 파일 확인 / 준비
- 프로그램이 파일의 내용을 읽어와 화면에 띄움
비동기 입출력 방식의 프로그램의 작동 순서는 다음과 같습니다.
- 프로그램이 파일 시스템에 읽기 요청
- 등록된 콜백 함수를 호출하여 파일 내용을 화면에 띄움
동기 입출력 방식과 비동기 입출력 방식은 아래와 같이 코드를 짤 수 있습니다.
/* Blocking IO */
var content = file.read('a.txt');=================대기===============
doShow(contents);
var result = doAdd(10, 10);
/* Non-Blocking IO */
file.read('a.txt', function(contents){
doShow(contents);
});
var result = doAdd(10, 10);
위의 코드에서는 첫 번째 코드가 실행되고 대기하는 시간이 있지만, 아래의 코드는 파일 읽기를 요청한 후 바로 doAdd() 함수를 호출합니다. 파일 읽기가 완료되었을 때 파일 시스템에서 콜백 함수를 호출하는데, 파일 시스템이 이벤트와 함께 호출하는 방식이면 이벤트 기반 입출력(Event Driven I/O) 모델이라고 부릅니다.
노드에서 구현하는 이벤트 기반 입출력 방식
노드를 설치하고 노드로 프로그램을 만들어 실행하면 크롬 V8 엔진 위에서 실행됩니다. V8 엔진에는 필요한 기능을 병렬로 실행하는 '스레드 풀'과 이벤트를 받아 처리하는 '이벤트 루프' 등의 기본 기능이 있으며, 그 위에 네트워크를 담당하는 소켓(Socket), http 라이브러리 들이 있습니다. 그리고 그 위에 표준 라이브러리가 구현되어 있습니다.
노드 프로그램이 동작할 수 있도록 만든 이 아키텍쳐에서 가장 중요한 부분 중 하나가 이벤트를 받아 처리하는 기능입니다. 특히 노드는 서버 쪽에서 동작하는 프로그램을 만드는 것이 주 임무이기 때문에 기본 기능인 소켓이나 HTTP 프로토콜을 사용해 데이터를 송수신하는 기능을 포함하고 있습니다. 따라서 데이터 송수신 부분에도 이벤트 처리 방식을 그대로 사용하고 있습니다.
노드의 기본 기능인 http를 이용해 웹 서버로 요청을 보내고 응답을 받는 코드의 일부를 살펴보도록 하겠습니다.
http.request(options, function(res){
res.on('data', function(chunk){
console.log('BODY :' + chunk);
});
});
http 객체는 HTTP 프로토콜로 웹 서버에 데이터를 요청할 수 있는 기능이 있습니다. request() 함수를 호출하여 웹 서버에 데이터를 요청할 수 있고 응답을 받으면 콜백 함수가 자동으로 호출됩니다. 응답을 처리할 수 있는 콜백 함수는 res라는 이름의 객체를 전달받는데, 이 res객체는 수신한 데이터를 이벤트 이름으로 구별할 수 있습니다. 예를 들어, data 이벤트가 있을 때 이 이벤트 이름으로 콜백 함수를 등록하면, 등록한 콜백 함수에 data 이벤트로 전달된 응답 데이터가 전달됩니다.
자바스크립트에서는 on() 메소드를 활용하여 이벤트를 콜백 함수와 바인딩(Binding) 할 수 있습니다. 응답 객체인 res 객체의 on() 메소드를 사용해 data 이벤트와 콜백 함수를 바인딩하면 data라는 이름의 이벤트를 받았을 때 등록한 콜백 함수가 실행됩니다. 앞에서 살펴본 코드는 이벤트 이름이 data이며 응답으로 받은 데이터는 chunk 변수에 들어가 있습니다.
References
- Do it! Node.js 프로그래밍