Node.js Streams는 대용량 데이터를 효율적으로 처리하는 데 필수적인 기능입니다. 기존 입출력 메커니즘과 달리 스트림을 사용하면 전체 데이터를 메모리에 로드하는 대신 데이터를 청크로 처리할 수 있으므로 대용량 파일이나 실시간 데이터를 처리하는 데 적합합니다. 이 기사에서는 Node.js Streams가 무엇인지, 왜 유용한지, 어떻게 구현하는지, 그리고 자세한 예시와 사용 사례를 통해 다양한 유형의 스트림에 대해 자세히 알아볼 것입니다.
간단히 말하면 스트림은 시간이 지남에 따라 한 지점에서 다른 지점으로 이동되는 일련의 데이터입니다. 데이터가 한꺼번에 흐르지 않고 하나씩 흐르는 컨베이어 벨트라고 생각하시면 됩니다.
Node.js Streams도 비슷하게 작동합니다. 데이터를 한 번에 모두 읽지 않고 여러 단위로 읽고 쓸 수 있어 메모리 효율성이 높습니다.
Node.js의 스트림은 EventEmitter 위에 구축되어 이벤트 중심으로 만들어집니다. 몇 가지 중요한 이벤트는 다음과 같습니다.
스트림은 I/O 처리에 있어 fs.readFile() 또는 fs.writeFile()과 같은 기존 방법에 비해 몇 가지 장점을 제공합니다.
Node.js에는 네 가지 유형의 스트림이 있습니다.
각 유형을 예시로 살펴보겠습니다.
읽기 가능한 스트림은 데이터를 청크 단위로 읽는 데 사용됩니다. 예를 들어, 대용량 파일을 읽을 때 읽기 가능한 스트림을 사용하면 전체 파일을 로드하는 대신 작은 데이터 청크를 메모리로 읽을 수 있습니다.
const fs = require('fs'); // Create a readable stream const readableStream = fs.createReadStream('largefile.txt', { encoding: 'utf8' }); // Listen for data events and process chunks readableStream.on('data', (chunk) => { console.log('Chunk received:', chunk); }); // Listen for the end event when no more data is available readableStream.on('end', () => { console.log('No more data.'); }); // Handle error event readableStream.on('error', (err) => { console.error('Error reading the file:', err); });
설명:
쓰기 가능한 스트림은 데이터를 청크 단위로 쓰는 데 사용됩니다. 모든 데이터를 한 번에 쓰는 대신 파일이나 쓰기 가능한 다른 대상으로 스트리밍할 수 있습니다.
const fs = require('fs'); // Create a writable stream const writableStream = fs.createWriteStream('output.txt'); // Write chunks to the writable stream writableStream.write('Hello, World!\n'); writableStream.write('Streaming data...\n'); // End the stream (important to avoid hanging the process) writableStream.end('Done writing.\n'); // Listen for the finish event writableStream.on('finish', () => { console.log('Data has been written to output.txt'); }); // Handle error event writableStream.on('error', (err) => { console.error('Error writing to the file:', err); });
설명:
이중 스트림은 데이터를 읽고 쓸 수 있습니다. 이중 스트림의 일반적인 예로는 데이터를 동시에 보내고 받을 수 있는 네트워크 소켓이 있습니다.
const { Duplex } = require('stream'); const duplexStream = new Duplex({ write(chunk, encoding, callback) { console.log(`Writing: ${chunk.toString()}`); callback(); }, read(size) { this.push('More data'); this.push(null); // End the stream } }); // Write to the duplex stream duplexStream.write('Hello Duplex!\n'); // Read from the duplex stream duplexStream.on('data', (chunk) => { console.log(`Read: ${chunk}`); });
설명:
변환 스트림은 스트림을 통과할 때 데이터를 수정합니다. 예를 들어 변환 스트림은 데이터를 압축, 암호화 또는 조작할 수 있습니다.
const { Transform } = require('stream'); // Create a transform stream that converts data to uppercase const transformStream = new Transform({ transform(chunk, encoding, callback) { this.push(chunk.toString().toUpperCase()); callback(); } }); // Pipe input to transform stream and then output the result process.stdin.pipe(transformStream).pipe(process.stdout);
설명:
Node.js 스트림의 주요 기능 중 하나는 파이프되는 기능입니다. 파이핑을 사용하면 스트림을 서로 연결하여 한 스트림의 출력을 다른 스트림의 입력으로 전달할 수 있습니다.
const fs = require('fs'); // Create a readable stream for the input file const readableStream = fs.createReadStream('input.txt'); // Create a writable stream for the output file const writableStream = fs.createWriteStream('output.txt'); // Pipe the readable stream into the writable stream readableStream.pipe(writableStream); // Handle errors readableStream.on('error', (err) => console.error('Read error:', err)); writableStream.on('error', (err) => console.error('Write error:', err));
설명:
Node.js 스트림은 데이터를 청크로 작업하여 I/O 작업을 처리하는 강력하고 효율적인 방법을 제공합니다. 대용량 파일을 읽거나, 소스 간에 데이터를 파이핑하거나, 즉시 데이터를 변환하는 경우 스트림은 메모리 효율적이고 성능이 뛰어난 솔루션을 제공합니다. 애플리케이션에서 읽기 가능, 쓰기 가능, 이중 및 변환 스트림을 활용하는 방법을 이해하면 애플리케이션의 성능과 확장성을 크게 향상시킬 수 있습니다.
위 내용은 Node.js 스트림 이해: 무엇을, 왜, 어떻게 사용하는가의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!