
Node.js – 버퍼와 스트림 – 1 – 스트림의 개념과 사용
스트림은 Node.js에서 중요한 개념 중 하나입니다. 스트림은 데이터를 효율적으로 처리하는 방법을 제공하며, 파일, 네트워크, 표준 입출력 등 다양한 소스와 대상으로 사용됩니다. 스트림은 큰 데이터를 작은 조각으로 나누어 처리하여 메모리 사용을 최적화하고, 실시간 처리 및 병렬 처리에 유리한 성능을 제공합니다. 이번에는 스트림의 개념과 사용법에 대해 알아보겠습니다.
스트림의 개념
스트림은 물의 흐름과 비슷한 개념으로 이해할 수 있습니다. 물이 한 방향으로 흐르듯이 데이터도 스트림을 통해 일정한 흐름으로 전달됩니다. 이때 데이터는 작은 조각이나 청크(chunk)로 나누어져 순차적으로 처리됩니다. 스트림은 데이터를 조각조각 나누어 처리하기 때문에 대용량 파일이나 네트워크에서 실시간으로 데이터를 전송할 때 매우 유용합니다.
스트림은 크게 읽기(readable) 스트림과 쓰기(writable) 스트림으로 나눌 수 있습니다. 읽기 스트림은 데이터 소스로부터 데이터를 읽어오는 역할을 하며, 쓰기 스트림은 데이터 대상에 데이터를 쓰는 역할을 합니다. 이러한 스트림은 서로 연결하여 데이터의 흐름을 구성할 수 있습니다.
스트림의 사용
스트림은 Node.js의 stream
모듈을 통해 사용할 수 있습니다. 다음은 스트림을 사용하여 파일을 읽고 콘솔에 출력하는 예시 코드입니다.
const fs = require('fs');
const readableStream = fs.createReadStream('input.txt');
readableStream.on('data', (chunk) => {
console.log(chunk.toString());
});
readableStream.on('end', () => {
console.log('데이터 읽기 완료');
});
위의 코드에서 createReadStream
함수를 사용하여 input.txt
파일을 읽기 스트림으로 생성합니다. 그리고 data
이벤트를 통해 데이터를 받아와서 출력합니다. 데이터가 모두 읽혀지면 end
이벤트가 발생하며, 이를 통해 읽기가 완료되었음을 알 수 있습니다.
스트림은 버퍼(Buffer)라는 일종의 임시 저장 공간을 사용하여 데이터를 처리합니다. 버퍼는 데이터를 조각조각 나누어 저장하고 필요에 따라 처리합니다. 이를 통해 데이터가 순차적으로 처리되며, 필요한 만큼만 메모리를 사용하므로 대용량 데이터도 효율적으로 처리할 수 있습니다.
주의해야 할 점
스트림을 사용할 때 몇 가지 주의해야 할 점이 있습니다.
-
이벤트 핸들러의 등록과 해제:
data
이벤트 등록 후 꼭end
이벤트에서 이벤트 핸들러를 해제해야 합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다. -
오류 처리: 스트림 작업 중 오류가 발생할 수 있으므로 오류 이벤트를 처리해야 합니다.
error
이벤트를 등록하여 오류를 적절히 처리하세요. -
파이프: 스트림은
pipe
메서드를 사용하여 연결할 수 있습니다. 이를 통해 한 스트림의 출력을 다른 스트림의 입력으로 바로 전달할 수 있습니다. -
스트림 종류: 읽기 스트림, 쓰기 스트림 외에도 변환 스트림(transform stream) 등 다양한 종류의 스트림이 있습니다. 필요에 따라 적절한 스트림을 선택하여 사용하세요.
스트림은 Node.js에서 중요한 개념이므로, 스트림을 활용하여 데이터를 효율적으로 처리하는 방법에 대해 더 자세히 공부하시길 권장합니다.
이상으로 Node.js의 버퍼와 스트림에 대한 스트림의 개념과 사용에 대해 알아보았습니다. 스트림은 데이터를 효율적으로 처리하기 위한 강력한 도구이며, 실시간 처리 및 대용량 데이터 처리에 특히 유용합니다. 적절한 예시와 비유를 통해 이해하기 쉽게 설명하였으며, 주의해야 할 점도 간략하게 안내해드렸습니다.
계속해서 Node.js의 버퍼와 스트림에 대해 더 많은 내용을 공부하시면 좋을 것입니다. 행운을 빕니다!