강좌 & 팁
글 수 2,412
2014.08.11 22:19:46 (*.134.169.166)
43325
파일을 읽을 때 readFile() 함수 종류를 사용하는 방법도 있지만
작은 리소스로 node 의 stream 기법을 사용하여 읽는 것이 더 효율적일 수 있습니다.
stream 객체를 사용하는 방법을 익힐때 간접적으로 이 함수의 사용법을 익히는 것이
좋습니다.
이 강좌는 fs.readFile() 에 대한 강좌를 읽었던 분을 대상으로 합니다.
사용법을 먼저 소스를 보면서 이해해 보죠..
먼저 createReadStream() 함수를 간단히 살펴 봅시다.
fs.createReadStream(path, [options]);
이 함수는 아규먼트 인자로 스트림 읽기 처리 대상이 되는 파일을 지정하고
동작 조건에 options 을 줄수 있습니다.
처리 결과는 스트림 객체를 반환합니다.
이 읽기 스트림 객체는 처리 과정을 이벤트로 발생시키고
읽기 스트림 객체를 직접 이용 하려면 다음 소스를 보고 실행하면 이해 할 수 있다.
읽기 스트림 객체는 이벤트에 따른 처리를 고려 하면 되기 때문이다.
이벤트 처리 과정을 보여 주는 소스를 보죠..
--[fs_createReadStream.js]-------------------------------------------------------------------------
var fs = require('fs');
var readStream = fs.createReadStream( './fs_createReadStream.js' , { highWaterMark: 256 } );
// readStream.pause();
readStream.on('readable', function() {
console.log( '>> readable event' );
});
readStream.on('open', function () {
console.log( '>> open event' );
});
readStream.on('data', function(chunk) {
console.log( '>> data event : chunk size = %d', chunk.length );
});
readStream.on('end', function() {
console.log( '>> end event' );
});
readStream.on('close', function() {
console.log( '>> close event' );
});
readStream.on('error', function(err) {
console.log( 'err = %j', err );
});
// readStream.resume();
-----------------------------------------------------------------------------------------------
위 소스는 fs.createReadStream() 함수를 이용해서 파일을 읽기를 스트림으로 처리하는
읽기 스트림을 얻습니다.
그리고 각각의 발생 이벤트에 대응하는 함수들을 등록 합니다.
실제로 실행되는 결과를 보면 위 소스가 무엇을 하는지 알 수 있습니다.
$ node fs_createReadStream.js
>> readable event
>> open event
>> readable event
>> data event : chunk size = 256
>> readable event
>> data event : chunk size = 256
>> readable event
>> data event : chunk size = 184
>> end event
>> close event
파일 './fs_createReadStream.js' 를 읽는 읽기 스트림을 얻습니다.
그러면 즉시 읽기를 시작하는데 각 이벤트의 함수가 등록 되면 해당 이벤트가 발생하게 됩니다.
사용가능한 이벤트는 다음과 같은 의미가 있습니다.
'readable' : 파일이 읽기가 가능한 상태가 되면 발생합니다.
'open' : 파일이 정상적으로 열린 후 발생합니다.
'data' : 데이터를 읽어 처리가 될 상태가 되면 발생합니다.
'end' : 데이터의 읽기가 모두 끝났을때 발생합니다.
'close' : 파일이 정상적으로 닫힌 후 발생합니다.
'error' : 처리 과정 중에 에러가 발생하면 발생합니다.
각 호출 형태는 위 소스를 참고 하면 됩니다.
이 이벤트 중 'open' 은 원래 읽기 스트림에 있는 이벤트가 아니고
fs.createReadStream() 함수로 만들어진 스트림에서 발생하는 추가적인 이벤트 입니다.
에러가 나면 에러 이벤트가 발생하는데 이때 파일이 없는 경우의 에러라면 다음과 같이 표출 됩니다.
$ node fs_createReadStream_error.js
>> readable event
err = {"errno":34,"code":"ENOENT","path":"no_file"}
fs.createReadStream() 함수를 호출 할때 주는 옵션은
스트림 객체에 주는 옵션이 있고
fs.createReadStream() 에 의해서 추가된 옵션이 있습니다.
이 부분은 node.js 매뉴얼을 참조 하면 좋은데..
여기서 쓰인 highWaterMark: 256 옵션은
데이터 읽기 단위를 지정한 것입니다.
만약 이 것을 지정하지 않으면 한번에 읽히게 될 겁니다.
즉 'data' 이벤트가 한번만 뜨고 안 뜰겁니다.
왜냐하면 내부적으로 디폴트 버퍼 크기가 16kb 크기 이기 때문입니다.