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') 형태로 구현 할 수 있다.
'JavaScript│Node js' 카테고리의 다른 글
npx cli - nest js 프로젝트 명령어 (0) | 2020.06.25 |
---|---|
Nodejs 가비지 컬렉터 (0) | 2020.06.14 |
redis 캐시 활용해서 express API 속도 높이기 (1) | 2020.05.28 |
리액트 코드 빌드시 난독화하기 (0) | 2020.05.20 |
'./locale' path not found in moment/src/lib/locale/locales.js 에러 해결 (0) | 2020.05.04 |
댓글