Streams 란
- 데이터를 작은 조각(chunk) 로 나누어서 처리하는 방식
- 전체 데이터를 읽거나 쓰지 않고, 메모리에 저장도 하지 않는다.
- 따라서 큰 데이터를 효율적으로 다룰 수 있고, 메모리 절약 및 더 빠른 I/O 작업 처리가 가능해진다.
- Streams 또한 Event Emitter 의 인스턴스
- 따라서 Event 를 emit 하고 그에 대한 리스너 & 핸들러에 의해 이벤트 루프를 통해 핸들링된다.
4가지 종류의 Streams
Readable
- 말 그대로 데이터를 읽을 수 있는 stream
- http request, fs read streams 가 있다.
- 발생시키는 주요 이벤트로는 data, end
Wrieable
- 말 그대로 데이터를 쓸 수 있는 stream
- http response, fs write streams
- drain, finish 와 같은 이벤트가 있다.
Duplex
- Read & write 가 동시에 가능한 stream
- net web socket 모듈이 예시
Transform
- Duplex && 데이터 변환
- 예시로는 zlip
간단한 코드 예시
1. fs.readFile 을 사용해 파일을 한 번에 읽어오기
// 전체 파일을 모두 읽어와야 하므로 느린 동작 & 메모리에 이 데이터를 저장해야함. (data 변수)
server.on('request', (req, res) => {
fs.readFile('test-file.txt', (err, data) => {
if (err) console.log(err);
res.end(data);
});
});
- 서버에 요청이 들어오면, fs 모듈을 통해 txt 파일을 읽어온다.
- 이 작업은 요청에 의해서 비동기 적으로 실행되지만, 만약 읽어오는 파일의 크기가 크다면, 이를 다 읽어올 때까지 기다렸다가 콜백이 실행되기 때문에, 파일 크기가 적을 때에나 적합한 작업이다.
2. readable & writable stream 을 사용해보자
server.on('request', (req, res) => {
// redable stream 생성
const readable = fs.createReadStream('test-file.txt');
// 파일 읽기가 시작되면, 작은 데이터 조각 (chunk) 로 읽혀짐
readable.on('data', (chunk) => {
// http response 응답 객체 (res) 에 write 를 호출해 chunk 를 클라이언트에 전달
res.write(chunk);
});
// 파일 읽기가 완료되면, http 응답을 완료한다.
readable.on('end', () => {
res.end();
});
readable.on('error', (err) => {
console.log(err);
res.statusCode(500);
res.end('File not found');
});
});
- 위 방식에서는 backpressure 현상이 발생할 수 있다.
- 즉, 데이터 생성 속도 >> 데이터 소비 속도, 네트워크가 느린 경우 네트워크 버퍼가 금방 차 시스템 메모리를 차지하고 이로 인해 성능 저하가 발생할 수 있음.
- 이럴 땐 데이터의 흐름을 관리해주는 방법이 필요함.
3. pipe 메서드 사용하기
server.on('request', (req, res) => {
const readable = fs.createReadStream('test-file.txt');
readable.pipe(res);
})
- pipe 메소드는 redable 스트립과 writable 스트림(res 응답객체) 을 자동으로 연결해준다.
- 위 과정에서 redable 스트림의 읽기 속도를 제어해 데이터 흐름을 관리해줌.
아 뭔가 벌써 어려운데.. 일단 계속 해보겠음...
'Stacks' 카테고리의 다른 글
[Electron.js] electron 의 rebuild 란? (0) | 2024.02.18 |
---|---|
[Node.js] Node의 require module 은 어떻게 동작하는가? (0) | 2024.02.04 |
[Electron.js] 일렉트론에 대해서 알아보자! (0) | 2024.01.21 |
[Node.js] Node란 무엇이냐..이벤트 루프란..? (1) | 2024.01.14 |