Node.js 마스터 클래스 Ep 6. 대용량 데이터 처리: Stream과 Buffer
Ep 6. 대용량 데이터 처리: Stream과 Buffer
만약 10GB짜리 로그 파일을 읽어서 분석해야 한다면 어떻게 해야 할까요? `fs.readFile`로 한 번에 읽으려다간 메모리 부족(Out of Memory)으로 서버가 뻗어버릴 겁니다.
이때 필요한 것이 바로 수도꼭지에서 물을 조금씩 흘려보내는 것과 같은 Stream입니다.
---
1. Buffer란? (데이터 덩어리)
컴퓨터는 모든 데이터를 0과 1로 처리하죠. Node.js에서 바이너리 데이터(영상, 이미지, 파일 등)를 잠시 저장하는 메모리 공간을 Buffer라고 합니다.
const buf = Buffer.from('Hello');
console.log(buf); // <Buffer 48 65 6c 6c 6f>
2. Stream이란? (데이터 흐름)
데이터를 Buffer 단위로 쪼개서 조금씩 이동시키는 기술입니다. 유튜브 영상을 볼 때 전체를 다 다운로드하지 않고 조금씩 재생(Streaming)하는 것과 같은 원리입니다.
- Readable Stream: 읽기 전용 (예: 파일 읽기, HTTP 요청 받기)
- Writable Stream: 쓰기 전용 (예: 파일 쓰기, HTTP 응답 보내기)
- Pipe: 읽기 스트림과 쓰기 스트림을 연결하는 파이프입니다.
// 효율적인 파일 복사 (메모리 절약)
readStream.pipe(writeStream);
---
🛠️ 오늘의 미션: 대용량 파일 복사하기
Stream을 사용했을 때와 안 했을 때의 차이는 파일이 클수록 극명합니다. `stream-test.js`를 만들어 직접 체험해 봅시다.
1. `stream-test.js` 파일을 작성합니다.
2. 아래 코드를 입력합니다.
const fs = require('fs');
// 1. 더미 대용량 파일 만들기 (약 100MB)
const file = fs.createWriteStream('./big.txt');
for(let i=0; i<= 1000000; i++) {
file.write('Node.js 스트림 연습을 위한 아주 긴 문장입니다.\n');
}
file.end();
console.log('대용량 파일 생성 완료! 이제 복사를 시작합니다.');
// 2. Stream으로 파일 복사하기
const readStream = fs.createReadStream('./big.txt');
const writeStream = fs.createWriteStream('./big_copy.txt');
// 파이프 연결 (읽은 데이터를 바로 쓴다)
readStream.pipe(writeStream);
readStream.on('end', () => {
console.log('복사 완료! 메모리를 거의 쓰지 않고 처리했습니다.');
});
3. `node stream-test.js`를 실행하세요.
4. 순식간에 `big_copy.txt`가 만들어졌나요? 100MB가 아니라 10GB 파일이라도 Node.js는 끄떡없습니다!
---
🎉 시리즈를 마치며
축하합니다! 여러분은 총 6강에 걸쳐 Node.js의 기초부터 핵심 원리까지 모두 훑어보았습니다.
1. Node.js의 탄생: 브라우저 밖으로 나온 JS
2. 모듈 시스템: CJS와 ESM
3. Express.js: 웹 서버 구축
4. DB & 비동기: 데이터 저장과 제어
5. 이벤트 루프: 성능의 비밀
6. Stream: 대용량 처리
이제 여러분은 어떤 백엔드 프로젝트도 시작할 준비가 되었습니다. 더 깊이 공부하고 싶다면 공식 문서를 정독해 보시길 추천합니다. 그동안 수고하셨습니다! 👋