Node.js를 활용하여 대용량 파일을 처리하는 시스템을 구축하는 방법을 설명합니다. 스트림을 사용한 파일 읽기와 쓰기, 데이터 변환 및 최적화 기법을 다룹니다.
1. Node.js의 스트림 개념
Node.js의 스트림은 대용량 데이터를 작은 단위로 나누어 처리할 수 있는 기능을 제공합니다. 이는 메모리 사용을 최소화하고, 데이터를 효율적으로 관리할 수 있도록 돕습니다. 스트림에는 읽기 스트림, 쓰기 스트림, 변환 스트림 등이 있습니다.
1.1 스트림의 장점
메모리 효율성: 스트림은 데이터를 한꺼번에 메모리에 로드하지 않고, 작은 청크로 나누어 처리합니다. 이를 통해 메모리 사용량을 줄이고, 시스템의 안정성을 높일 수 있습니다.
속도 최적화: 스트림은 데이터를 처리하는 동안 다음 데이터를 준비할 수 있어, 전체 처리 시간을 단축시킬 수 있습니다.
유연성: 스트림은 데이터를 읽고 쓰는 동안 변환하거나, 압축/압축 해제와 같은 추가 작업을 수행할 수 있습니다.
2. 파일 읽기와 쓰기: 스트림의 활용
Node.js에서 대용량 파일을 처리할 때 스트림을 사용하는 것이 가장 효과적입니다. 스트림을 사용하여 파일을 읽고 쓰는 기본적인 방법을 알아보겠습니다.
2.1 파일 읽기 스트림
파일 읽기 스트림은 대용량 파일을 효율적으로 읽어들일 수 있는 방법입니다. fs.createReadStream 메서드를 사용하여 파일을 스트림으로 읽을 수 있습니다.
const fs = require('fs');
const readStream = fs.createReadStream('largeFile.txt', { encoding: 'utf8' });
readStream.on('data', chunk => {
console.log('Reading chunk:', chunk);
// 데이터 처리 로직 추가
});
readStream.on('end', () => {
console.log('Finished reading the file.');
});
이 코드는 지정된 파일을 스트림으로 읽어와, 각 청크(chunk)를 data 이벤트로 처리합니다. 파일의 모든 데이터를 읽으면 end 이벤트가 발생합니다.
2.2 파일 쓰기 스트림
파일 쓰기 스트림은 데이터를 파일로 출력하는 방법입니다. fs.createWriteStream 메서드를 사용하여 파일에 데이터를 쓰는 스트림을 생성할 수 있습니다.
const fs = require('fs');
const writeStream = fs.createWriteStream('outputFile.txt', { encoding: 'utf8' });
writeStream.write('This is a line of text.\n');
writeStream.write('Another line of text.\n');
writeStream.end(); // 스트림 종료
이 코드는 outputFile.txt 파일에 텍스트 데이터를 씁니다. write 메서드를 사용하여 데이터를 스트림에 추가하고, end 메서드를 호출하여 스트림을 종료합니다.
3. 파일 처리 시스템 구축: 실전 예제
이제 Node.js의 스트림을 활용하여 대용량 파일 처리 시스템을 구축하는 방법을 살펴보겠습니다. 이 시스템은 파일을 읽고, 데이터 변환을 수행한 후, 변환된 데이터를 새로운 파일에 저장하는 기능을 포함합니다.
3.1 파일 변환과 필터링
파일 처리 시스템의 주요 기능 중 하나는 데이터 변환입니다. 예를 들어, CSV 파일을 읽어와 특정 열의 데이터를 변환하거나, 필터링된 데이터를 추출할 수 있습니다.
const fs = require('fs');
const readline = require('readline');
const inputFilePath = 'input.csv';
const outputFilePath = 'filteredOutput.csv';
const readStream = fs.createReadStream(inputFilePath);
const writeStream = fs.createWriteStream(outputFilePath);
const rl = readline.createInterface({ input: readStream });
rl.on('line', (line) => {
const columns = line.split(',');
// 예를 들어, 특정 조건에 맞는 행만 출력
if (columns[2] === 'someValue') {
writeStream.write(line + '\n');
}
});
rl.on('close', () => {
writeStream.end();
console.log('File processing completed.');
});
이 예제에서는 readline 모듈을 사용하여 CSV 파일의 각 행을 읽고, 특정 조건에 맞는 데이터를 필터링하여 새로운 파일에 저장합니다.
3.2 데이터 압축과 압축 해제
대용량 데이터를 처리할 때 압축을 사용하여 데이터 크기를 줄이고, 저장 공간을 절약할 수 있습니다. Node.js는 zlib 모듈을 사용하여 데이터를 압축하고 압축 해제할 수 있습니다.