이 글에서는 Node.js Streams에 대해 자세히 알아보고 이것이 대량의 데이터를 효율적으로 처리하는 데 어떻게 도움이 되는지 이해하겠습니다. 스트림은 대용량 파일 읽기, 네트워크를 통한 데이터 전송, 실시간 정보 처리 등 대규모 데이터 세트를 처리하는 우아한 방법을 제공합니다. 전체 데이터를 한 번에 읽거나 쓰는 기존 I/O 작업과 달리 스트림은 데이터를 관리 가능한 청크로 나누고 하나씩 처리하므로 효율적인 메모리 사용이 가능합니다.
이 도움말에서는 다음 내용을 다룹니다.
Node.js의 스트림은 지속적인 데이터 흐름입니다. 스트림은 파일 읽기, 네트워크를 통한 통신 또는 데이터베이스와의 상호 작용과 같은 I/O 바인딩 작업을 처리하는 데 특히 유용합니다. 전체 작업이 완료될 때까지 기다리는 대신 스트림을 사용하면 데이터를 청크로 처리할 수 있습니다.
Node.js는 네 가지 유형의 스트림을 제공합니다.
예시를 통해 각 스트림 유형을 살펴보겠습니다.
읽기 가능한 스트림을 사용하면 데이터를 하나씩 읽을 수 있어 대용량 파일이나 실시간 데이터 소스를 처리하는 데 유용합니다.
const fs = require('fs'); // Create a readable stream from a large file const readableStream = fs.createReadStream('largeFile.txt', { encoding: 'utf8', highWaterMark: 16 * 1024 // 16 KB chunk size }); readableStream.on('data', (chunk) => { console.log('New chunk received:', chunk); }); readableStream.on('end', () => { console.log('Reading file completed'); });
쓰기 가능한 스트림은 파일이나 네트워크 소켓과 같은 대상에 데이터를 증분적으로 쓰는 데 사용됩니다.
const fs = require('fs'); // Create a writable stream to write data to a file const writableStream = fs.createWriteStream('output.txt'); writableStream.write('Hello, world!\n'); writableStream.write('Writing data chunk by chunk.\n'); // End the stream and close the file writableStream.end(() => { console.log('File writing completed'); });
이중 스트림은 데이터를 읽고 쓸 수 있습니다. 일반적인 예 중 하나는 데이터를 동시에 보내고 받을 수 있는 TCP 소켓입니다.
const net = require('net'); // Create a duplex stream (a simple echo server) const server = net.createServer((socket) => { socket.on('data', (data) => { console.log('Received:', data.toString()); // Echo the data back to the client socket.write(`Echo: ${data}`); }); socket.on('end', () => { console.log('Connection closed'); }); }); server.listen(8080, () => { console.log('Server listening on port 8080'); });
변환 스트림은 데이터가 통과할 때 데이터를 수정하는 특별한 유형의 이중 스트림입니다. 일반적인 사용 사례는 파일 압축입니다.
const fs = require('fs'); const zlib = require('zlib'); // Create a readable stream for a file and a writable stream for the output file const readable = fs.createReadStream('input.txt'); const writable = fs.createWriteStream('input.txt.gz'); // Create a transform stream that compresses the file const gzip = zlib.createGzip(); // Pipe the readable stream into the transform stream, then into the writable stream readable.pipe(gzip).pipe(writable); writable.on('finish', () => { console.log('File successfully compressed'); });
대용량 파일(예: 로그 또는 미디어)을 처리할 때 전체 파일을 메모리에 로드하는 것은 비효율적이며 성능 문제를 일으킬 수 있습니다. 스트림을 사용하면 대용량 파일을 점진적으로 읽거나 쓸 수 있어 메모리 부하가 줄어듭니다.
예:
채팅 서버나 라이브 대시보드와 같은 실시간 애플리케이션은 데이터가 도착하는 대로 처리해야 합니다. 스트림은 이 데이터를 효율적으로 처리하여 지연 시간을 줄이는 방법을 제공합니다.
예:
압축은 스트림의 또 다른 일반적인 사용 사례입니다. 전체 파일을 메모리에 로드하는 대신 변환 스트림을 사용하여 즉시 데이터를 압축할 수 있습니다.
예:
Node.js 스트림은 파일 읽기, 네트워크 요청 처리, 실시간 작업 수행 등 대용량 데이터를 처리할 수 있는 유연하고 효율적인 방법을 제공합니다. 데이터를 관리 가능한 단위로 분할함으로써 스트림을 사용하면 시스템 메모리에 부담을 주지 않으면서 대규모 데이터 세트로 작업할 수 있습니다.
다음 글에서는 NGINX와 정적 콘텐츠 제공, 로드 밸런싱, Node.js 애플리케이션에서 역방향 프록시로 작동하는 역할에 대해 살펴보겠습니다. 또한 보안 강화를 위해 SSL과 암호화를 통합하는 방법에 대해서도 논의하겠습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3