이어지는 글
NodeJS 스트림을 이용한 입출력
이전 글에서 데이터 단위 입출력을 사용했습니다. 작은 용량의 데이터를 읽고 쓰는데에는 데이터 단위 입출력을 사용해도 문제가 되지 않지만 대용량 데이터인 경우 문제가 되기도 합니다.

다음은 input.txt에서 읽은 대용량 파일을 readFileSync()를 통해 읽어온 후 writeFileSync()메서드를 통해 output.txt 파일에 출력하는 경우입니다.

기본 입출력 사용시 
1
2
3
4
5
6
7
8
var fs = require('fs');
 
//input.txt파일로부터 데이터 입력받음
var data = fs.readFileSync('./input.txt''utf8');
 
//입력받은 데이터를 output.txt로 출력
var option = { encoding: 'utf8', flag: 'w' };
fs.writeFileSync('./output.txt', data, option);
cs

 

 

이 경우 input.txt 파일의 데이터가 100mb 라고 한다면 100mb의 텍스트를 입력을 통해 모두 다 읽어온 후 output.txt에 모두 출력해주어야 합니다. 여기서 중요한 점은 input.txt의 모든 데이터를 readFileSync()를 통해 읽어온 후에야 output.txt로 출력 가능하다는 것입니다.

일반 입출력 사용시

만약 해당 어플리케이션 웹서버에서 동작한다면 readFileSync()를 사용했을때 모든 데이터를 읽어 메모리에 올리게 되고 이는 많은 서버의 자원을 사용하게 됩니다. 만약 동시에 여러명의 사용자가 동시에 이런 작업을 요청했다면 엄청난 부하가 걸리게 될 것입니다.



스트림을 이용하면 한번에 하나의 덩어리(chunk)씩 스트림으로 읽습니다.
또한 파이프로 클라이언트로의 출력스트림과 pipe를 통해 연결해주면 한덩어리씩 읽은것을 그대로 연결된 출력 스트림으로 보내게 되므로 자원을 엄청나게 효율적으로 절약할 수 있습니다.


스트림을 통한 데이터 입출력

스트림을 사용한 입출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var fs = require('fs');
 
var inStream = fs.createReadStream('./input.txt', {flags: 'r'} );
var outStream = fs.createWriteStream('./output.txt', {flags: 'w'});
 
inStream.on('data'function(data) {
    //입력 스트림으로 입력받은 데이터를
    //출력 스트림으로 출력
    outStream.write(data);
});
 
inStream.on('end'function() {
    outStream.end(function() {
    });
});
cs

 

 

pipe() 메서들 이용하게 되면 다음과 같이 훨씬 단순해집니다.

단 몇줄의 소스만으로 입력스트림을 파이프를 통해 출력스트림으로 연결해주어 데이터의 흐름을 바꾸어 줄 수 있습니다.
1
2
3
4
5
6
7
var fs = require('fs');
 
 
var inStream = fs.createReadStream('input.txt', {flags: 'r'} );
var outStream = fs.createWriteStream('output.txt', {flags: 'w'});
 
inStream.pipe(outStream);
cs

웹어플리케이션에서의 응용
다음과 같이 입력스트림을 통해 서버의 자원을 입력받아 클라이언트 측으로 연결된 출력스트림으로 내보내줄 수도 있습니다.
1
2
3
4
5
6
7
8
9
10
11
var fs = require('fs');
var http = require('http');
 
var server = http.createServer(function (req, res) {
    // 입력스트림을 통해 입력받은 데이터를
    // http 출력스트림을 통해 브라우저에 응답
    var inStream = fs.createReadStream('./input.txt');
    inStream.pipe(res);
});
 
server.listen(7001'127.0.0.1');
cs
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,