Study/Node.js

이벤트 기반 입출력 방식

AC 2019. 3. 6. 16:10


데이터 처리 방식을 비동기 방식으로 바꾸어도 자바스크립트 코드를 실행하는 속도가 느리면 효율성이 떨어질 수 있다.

자바스크립트는 코드를 한 줄씩 해석하면서 실행하는 인터프리터(Interpreter)방식을 사용하므로 속도가 느려 문제가 되곤 했다.



그러나 이러한 문제는 크롬의 V8 자바스크립트 엔진이 나오면서 해결되었다. V8 엔진은 자바스크립트 코드를 네이티브 코드로 바꾼 후 실행할 수 있는데, 노드는 이 V8 엔진을 이용해 자바스크립트 코드를 빠르게 실행할 수 있다. 다음 그림은 V8 엔진에서 노드가 동작할 수 있도록 만든 시스템 구조(아키텍처, Architecture)를 보여준다.






노드를 설치한 다음 노드로 프로그램을 만들어 실행하면 크롬 V8 엔진 위에서 실행되낟.

V8 엔진에는 필요한 기능을 병렬로 실행하는 '스레드 풀'과 이벤트를 받아 처리하는 '이벤트 루프' 등의 기본 기능이 있으며,


그 위에 네트워킹 기능을 담당하는 소켓(Socket), http 라이브러리들이 있다. 그리고 다시 그 위에 표준 라이브러리가 구현되어 있다.


이런 라이브러리를 사용하고 싶다면 자바스크립트로 프로그램을 만들면 된다.


개발자들이 각자의 목적에 맞게 만든 노드 프로그램은 그 라이브러리 위에서 동작하게 된다.



노드 프로그램이 동작할 수 있도록 만든 이 아키텍처에서 가장 중요한 부분 중 하나가 이벤트를 받아 처리하는 기능이다.


특히 노드는 서버 쪽에서 동작하는 프로그램을 만드는 것이 주 임무이기 때문에 기본 기능인 소켓이나 HTTP 프로토콜을 사용해 데이터를 송수신하는 기능을 포함하고 있다. 따라서 데이터 송수신 부분에도 이벤트 처리 방식을 그대로 사용할 수 있다.


그러면 노드의 기본 기능인 http를 이용해 웹 서버로 요청을 보내고 응답을 받는 코드의 일부를 살펴보자.




▲ http를 이용해 웹 서버로 요청을 보내고 응답을 받는 방식





http 객체는 HTTP 프로토콜로 웹 서버에 데이터를 요청할 수 있는 기능이 있다. 


request() 함수를 호출하여 웹 서버에 데이터를 요청할 수 있고, 응답을 받으면 콜백 함수가 자동으로 호출된다. 


응답을 처리할 수 있는 콜백 함수는 res라는 이름의 객체를 전달받는데, 이 res 객체는 수신한 데이터를 이벤트 이름으로 구별할 수 있다. 


예를 들어, data 이벤트가 있을 때 이 이벤트 이름으로 콜백 함수를 등록하면, 등록한 콜백 함수에 data 이벤트로 전달된 응답 데이터가 전달된다.


자바스크립트에서는 on() 메소드를 사용해 이벤트를 콜백 함수와 바인딩(Binding)할 수 있다. 따라서 응답 객체인 res 객체의 on() 메소드를 사용해 data 이벤트와 콜백 함수를 바인딩하며 data라는 이름의 이벤트를 받았을 때 등록한 콜백 함수가 실행된다. 


앞에서 살펴본 코드에서는 이벤트 이름이 datas이며, 응답으로 받은 데이터는 chunk 변수에 들어있다.

LIST