DIRTy 애플리케이션 

DIRT는 노드를 적용하기에 적절한 형태의 어플리케이션인 데이터 집약적 실시간 애플리케이션(data-intensive real-time)의 앞글자를 딴 단어입니다.

노드는 I/O 부분에서 매우 가벼워졌기 때문에 한 파이프에서 다른 파이프로 데이터를 전송하는 프록싱(proxying)이나 셔플링(shuffling)에 적합합니다.

이는 서버가 많은 요청을 처리하는 중에도 여러 개의 연결을 유지할 수 있으며 메모리 공간을 적게 사용하도록 관리되기 때문입니다. 이처럼 노드는 브라우저와 같이 요청에 빠르게 반응하도록 설계됐습니다.


DIRTy의 기본요소

노드는 이벤트 주도와 비동기 방식을 기반으로 만들어졌습니다. 자바스크립트는 일반적인 서버 측 언어와 달리 표준  I/O 라이브러리를 가지고 있지 않다.

자바스크립트의 기반 환경이 이를 제공합니다. 가장 일반적이며 가장 많은 개발자가 사용하는 스크립트 환경은 이벤트주도와 비동기 방식을 사용하는 부라우저입니다. 노드는 다양한 종류의 네트워크 및 파일 I/O에 사용되는 핵심 모듈도 포함하고 있는습니다. 여기에는 HTTP, TLS, HTTPS, 파일시스템(POSIX), 데이터그램(UDP), NET(TCP)에 대한 모듈이 포함되어 있습니다. 핵심 모듈은 I/O 기반의 애플리케이션을 위한 기본적인 구성 요소만을 포함하여 일부러 작고 단순하며 하위레벨로 만들어졌습니다. 이를 기반으로 만들어진 서드파티 모듈은 일반적인 문제에 대한 훌륭한 추상화를 제공합니다.


플랫폼 vs 프레임워크

노드는 자바스크립트 어플리케이션을 위한 플랫폼이며 혼동해서는 안됩니다. 노드에 관한 일반적인 오해는 노드가 훨씬 낮은 계층임에도 불구하고 레일즈(Rails)나 장고(Django) 같은 스크립트의 프레임워크라고 생각하는 것입니다. 


이제는 노드를 이용해서 기본적인 서버를 하나 만들어 보도록 하겠습니다.

언제나 그렇듯 처음 시작할 때는 Hello world가 빠져선 안되겠죠? 그래서 Hello World HTTP 서버를 만들어 보도록 하겠습니다.


Hello World HTTP서버 ( node 설치 방법 )

노드는 일반적으로 서버를 구성하는데 많이 이용됩니다. 노드를 이용해 다양한 종류의 서버를 만드는 것이 매우 간단하기 때문입니다.

이는 아파치 HTTP 서버에서 PHP 어플리케이션을 올리는 것처럼 어플리케이션을 위해서 서버를 따로 두어야 했던 환경에 익숙한 사람에게는 이상하게 들릴 수도 있습니다. 노드에서는 서버와 어플리케이션이 같은 의미입니다.

그럼 모든 요청에 단순하게 'Hello World' 라고 응답하는 HTTP 서버 예제를 만들어 보겠습니다.


helloworld.js

1
2
3
4
5
6
var http = require('http');
http.createServer(function(req, res) {
    res.writeHead(200, {'Content-Type''text/plain'});
    res.end('Hello World\n');
}).listen(3000);
console.log('Server running at http://localhost:3000/');
cs


요청이 들어오면 콜백 함수인 function(req, res)이 호출되어 "Hello World"라는 문장을 응답으로 보낸다. 이러한 이벤트 처리 방식은 브라우저에서 onclick 이벤트를 처리하는 방법과 유사합니다. 클릭은 어떤 부분에서든 발생할 수 있으며 이벤트가 발생했을 때 이를 처리하기 위한 함수를 만들어야 합니다.

이 예제에서 노드는 언제 요청이 들어오든 간에 응답하는 함수를 제공하고 있습니다. 이번에는 좀 더 명확하게 표시해 작성한 예입니다.


helloworld.js

1
2
3
4
5
6
7
var http = require('http');
var server = http.createServer();
server.on('request'function(req, res) {
    res.writeHead(200, {'Content-Type''text/plain'});
    res.end('Hello World\n');
}).listen(3000);
console.log('Server running at http://localhost:3000/');
cs


▷스트리밍 데이터

노드는 스트림과 스트리밍 데이터 처리에도 많이 사용됩니다. 스트림은 배열과 같은 개념으로 생각할 수 있습니다. 다만 데이터가 여러 공간에 걸쳐 분산된 것이 아니라 시간의 흐름에 따라 분산된 것입니다. 쪼개진 데이터 조각이 하나씩 도착하므로 개발자는 데이터 전체가 준비될 때까지 기다렸다가 처리하는 대신 데이터가 도착하는 즉시 처리할 수 있어야 합니다. resource.json 스트림을 어떻게 처리하는지 살펴보도록 하겠습니다.


1
2
3
4
5
6
7
var stream = fs.createReadStream('./resource.json')
stream.on('data'function(chunk) {
    console.log(chunk)
})
stream.on('end',function() {
    console.log('finished')
})
cs

data 이벤트는 새로운 데이터 조각이 만들어질 때마다 발생합니다. 그리고 모든 데이터 조각을 다 읽었을 때 end 이벤트가 발생합니다. 데이터 조각은 크기가 정해져 있지 않으며 데이터의 종류에 따라 다릅니다. 읽기 스트림에 대한 하위레벨의 접근은 메모리 버퍼에 모든 데이터가 쌓일 때까지 기다리는 것보다 훨씬 효율적으로 데이터를 처리할 수 있습니다. 노드는 데이터 조각들을 쓸 수 있는 쓰기 스트림도 제공합니다. 그 중 하나가 바로 HTTP 서버에서 요청이 들어올 때 사용하는 응답(res)객체입니다. 

읽기와 쓰기 스트림은 하나로 연결되어 데이터 파이프를 구성할 수 있는데, 마치 셸 스크립트에서 |(파이프) 연산자를 사용하는 것과 비슷한 방식입니다.

이런 방식은 데이터 전체를 완전히 읽을 때까지 기다렷다가 쓰는 대신, 데이터를 읽어 들이는 즉시 쓸 수 있는 효율적인 방법을 제공합니다.

 

이전의 HTTP서버를 활용해서 클라이언트에 이미지를 스트리밍으로 전송하는 방법을 살펴보겠습니다.

1
2
3
4
5
6
7
8
var http = require('http');
var fs = require('fs');
http.createServer(function(req, res) {
 res.writeHead(200, {'Content-Type''image/png'});
 fs.createReadStream('/image.png').pipe(res);
}).listen(3000);
 
console.log('Server running at http://localhost:3000');
cs

 

이 짤막한 예제에서 파일(fs.createReadStream)로 부터 데이터를 읽는 즉시 클라이언트(res)에게 내보냅니다.(pipe)

이벤트 루프는 데이터가 스트림 되는 도중에도 다른 이벤트를 처리할 수 있습니다.

노드는 이러한 DIRTy의 기본적인 요소를 여러 유닉스와 윈도우를 포함한 다수의 플랫폼에 제공합니다.

특히 기반을 이루고 있는 비동기 I/O 라이브러리는 부모 운영체제와 상관없이 동일한 방식을 제공하므로 기기에 상관없이 프로그램을 이식하기 쉽고 필요할 겨우 다양한 장비에서 실행 할 수 있습니다.

 

▷요약
다른 기술과 마찬가지로 노드 역시 모든 것에 대한 해결책은 아닙니다. 노드는 그저 특정 문제를 해결하는데 도움을 주고 새로운 가능성을 열어 줍니다. 노드에 관해 한 가지 흥미로운 점은 시스템의 모든 분야 사람들에게 관심을 받는 다는 것입니다. 대부분 자바스크립트로 개발하는 클라이언트 측 프로그래머이고 그 외에 서버측 프로그래머와 시스템 레벨 프로그래머도 있습니다. 여러분이 어디에 속해있든 해당 분야에서 노드가 적합한 곳이 어딜지 이해하기 바랍니다. 다시 3줄로 정리해 보겠습니다.

 1. 자바스크립트 기반으로 만들어졌다.

 2. 이벤트와 비동기를 사용합니다.

 3. 데이터 집약적 실시간 어플리케이션을 위해 설계됐습니다.



출처 : node.js 인 액션

'Language > Node' 카테고리의 다른 글

2.다중 채팅방 만들기 (2부)  (0) 2017.09.19
2.다중 채팅방 만들기  (0) 2017.08.29
1.Node(노드)란?  (0) 2017.08.28

+ Recent posts