Stream은 데이터의 읽기 및 쓰기를 효율적으로 처리하기 위한 추상화된 인터페이스입니다. 대규모 데이터를 메모리에 한 번에 로드하지 않고, 조각(chunk) 단위로 처리할 수 있도록 돕습니다.
주요 스트림 타입
- Readable: 데이터 소스로부터 데이터를 읽는 스트림
- Writable: 데이터를 목적지로 쓰는 스트림
- Duplex: 읽기와 쓰기를 동시에 수행하는 스트림 (예: TCP 소켓)
- Transform: 입력 데이터를 처리하여 출력으로 변환하는 스트림 (예: 압축, 암호화)
1. Readable Stream (파일 읽기)
const fs = require('fs');
const readableStream = fs.createReadStream('input.txt', { encoding: 'utf8', highWaterMark: 16 });
readableStream.on('data', (chunk) => {
console.log('Received chunk:', chunk);
});
readableStream.on('end', () => {
console.log('No more data to read.');
});
readableStream.on('error', (err) => {
console.error('Error:', err);
});
2. Writable Stream (파일 쓰기)
const fs = require('fs');
const writableStream = fs.createWriteStream('output.txt');
writableStream.write('Hello, Stream!\n');
writableStream.write('Writing data in chunks.\n');
writableStream.end('Finished writing data.');
writableStream.on('finish', () => {
console.log('All data written to file.');
});
writableStream.on('error', (err) => {
console.error('Error:', err);
});
3. Duplex Stream (TCP 에코 서버)
const net = require('net');
const server = net.createServer((socket) => {
console.log('Client connected.');
socket.on('data', (data) => {
console.log('Received:', data.toString());
socket.write(`Echo: ${data}`);
});
socket.on('end', () => {
console.log('Client disconnected.');
});
});
server.listen(8080, () => {
console.log('Server is listening on port 8080.');
});
4. Transform Stream (압축 예제)
const fs = require('fs');
const zlib = require('zlib');
const readableStream = fs.createReadStream('input.txt');
const gzip = zlib.createGzip();
const writableStream = fs.createWriteStream('input.txt.gz');
readableStream.pipe(gzip).pipe(writableStream);
writableStream.on('finish', () => {
console.log('File successfully compressed.');
});
'Node.js > 3. 기본객체' 카테고리의 다른 글
3-3 node.js fs (파일시스템) (3) | 2025.01.06 |
---|---|
3-2 node.js 기본 모듈 리스트 (0) | 2025.01.06 |
3-1 node.js 전역 객체 (0) | 2025.01.06 |