Node.js 스트림으로 대용량 파일 처리

서버에서 대용량 파일을 처리할 때, 모든 데이터를 메모리에 올리면 메모리 부족 문제가 발생합니다. Node.js 스트림(Stream)을 활용하면 데이터를 조각 단위로 읽고 쓰면서, 백프레셔(backpressure)를 통해 안정적으로 파이프라인을 구성할 수 있습니다.

1. 읽기·쓰기 스트림 기본

Node.js의 fs.createReadStreamfs.createWriteStream를 이용하면 파일을 조각 단위로 처리할 수 있습니다.


const fs = require('fs');
const readStream = fs.createReadStream('input.txt');
const writeStream = fs.createWriteStream('output.txt');

readStream.pipe(writeStream);
      

2. 백프레셔 제어

스트림을 연결하면 데이터 흐름이 자동으로 조절됩니다. 쓰기 스트림이 처리 속도를 따라가지 못하면 읽기 스트림이 일시 정지하며, 메모리 폭주를 방지합니다. 이를 통해 안정적인 대용량 파일 처리가 가능합니다.

3. 변환 스트림 활용

Transform 스트림을 활용하면 읽어들인 데이터를 실시간으로 변환할 수 있습니다. 예를 들어 CSV→JSON 변환, 압축/압축 해제, 이미지 리사이징 등 다양한 파이프라인을 구현했습니다.


const { Transform } = require('stream');
const upperCaseTransform = new Transform({
  transform(chunk, encoding, callback) {
    callback(null, chunk.toString().toUpperCase());
  }
});

readStream.pipe(upperCaseTransform).pipe(writeStream);
      

4. 실무 적용 경험

실제 프로젝트에서는 1GB 이상의 로그 파일과 이미지 업로드를 처리할 때 스트림 기반 파이프라인을 구축했습니다. 모든 데이터는 메모리에 한 번에 적재하지 않고, 변환과 저장을 동시에 진행해 안정성과 성능을 확보했습니다.

5. 결론

Node.js 스트림은 대용량 파일 처리에 필수적인 패턴이며, 백프레셔와 변환 스트림을 활용하면 안정적이고 효율적인 파이프라인을 만들 수 있습니다. 이번 경험으로 실시간 데이터 처리와 서버 메모리 관리 능력을 함께 향상시킬 수 있었습니다.