본문 바로가기
JavaScript│Node js

node js 스트림

by 자유코딩 2020. 6. 7.

node js 스트림

스트림: 배열이나 문자열같은 데이터 컬렉션

node js 에서 대량의 파일을 읽을때 그냥 읽으면 메모리 소비를 어마어마하게 하게 된다.

stream 을 사용하면 메모리 소비를 많이 줄일 수 있다.



스트림은 파일을 읽고 쓸때도 쓸 수 있지만 http request, response 에서도 쓸 수 있다.

http request 는 읽기 가능한 스트림이고 http response 는 쓰기 가능한 스트림이다.



스트림을 쓰지 않을때, 쓸 때 차이

스트림을 쓰지 않는다면 파일을 읽을 때 그대로 변수에 할당하고 사용해야 한다.

 

아래 예제처럼 말이다.

const fs = require('fs');

const server = require('http').createServer();



server.on('request', (req, res) => {

fs.readFile('./big.file', (err, data) => { // 파일을 읽고 data 에 담는다.

// 메모리가 파일크기인 400mb 소모 된다.

if (err) throw err;



res.end(data);

});

});

server.listen(8000);

 

이 코드에서는 변수 data에 파일을 모두 담고 있다. 파일의 크기가 커질수록 메모리 사용량이 증가한다.

 

스트림을 사용한다면 코드가 아래와 같이 바뀐다.

 

const fs = require('fs');

const server = require('http').createServer();



server.on('request', (req, res) => {

const src = fs.createReadStream('./big.file'); // read stream을 사용해서 읽기

src.pipe(res);

});



server.listen(8000);

 

createReadStream 을 사용한다.

 

이렇게 하면 위의 코드가 400mb 가까이 쓴다고 가정했을때 20mb 정도 밖에 쓰지 않는다.

스트림에는 4종류가 있다.

 

1. readable

 

2. writable

 

3. duplex

 

4. transform

 

---

 

- readable 은 읽기 가능한 스트림

- writable 은 쓰기 가능한 스트림

- duplex는 읽기/쓰기 가능한 스트림 - 예를 들어서 TCP 가 있다.

- transform 은 duplex 스트림에 속한다. - 데이터를 읽거나 쓸때 수정/변환 될 수 있다.


코드로는 const { Writable } = require('stream') 형태로 구현 할 수 있다.



댓글