노드
노드 버퍼와 스트림 이해하기
포칼이
2023. 4. 12. 14:25
버퍼 : 일정한 크기로 모아주는 데이터이다.
- 일정한 크기가 되면 한 번에 처리한다.
- 버퍼링 : 버퍼에 데이터가 찰 때까지 모으는 작업이다.
스트림 : 데이터의 흐름이다.
- 일정한 크기로 나눠서 여러 번에 걸쳐서 처리한다.
- 버퍼(또는 청크)의 크기를 작게 만들어서 주기적으로 데이터를 전달한다.
- 스트리밍 : 일정한 크기의 데이터를 지속적으로 전달하는 작업이다.
Buffer 객체를 사용했을때
//buffer.js
const buffer = Buffer.from('저를 버퍼로 바꿔보세요');
console.log('from():', buffer);
console.log('length:', buffer.length);
console.log('toString():', buffer.toString());
const array = [Buffer.from('띄엄 '), Buffer.from('띄엄 '), Buffer.from('띄어쓰기')];
const buffer2 = Buffer.concat(array);
console.log('concat():', buffer2.toString());
const buffer3 = Buffer.alloc(5);
console.log('alloc():', buffer3);
length()에서 32 Byte 인것을 알 수 있다.
버퍼가 배열에 담겨 있다면 하나로 이을 수도 있다.
alloc을 사용하여 빈 버퍼를 보낼 수도 있다.
스트림 객체를 사용하여 readme3.txt 읽기
//readme3.txt
저는 조금씩 조금씩 나눠서 전달됩니다. 나눠진 조각을 chunk라고 부릅니다.
노드 버퍼 노드 스트림 붕권 나락 마신 슈날 나찰 초풍 사자 더퍼
//createReadStream.js
const fs = require('fs');
const readStream = fs.createReadStream('./readme3.txt', { highWaterMark: 16 });
const data = [];
readStream.on('data', (chunk) => {
data.push(chunk);
console.log('data :', chunk, chunk.length);
});
readStream.on('end', () => {
console.log('end :', Buffer.concat(data).toString());
});
readStream.on('error', (err) => {
console.log('error :', err);
});
스트림 형식을 사용하면 파일을 조금씩 읽는데 data = [] 식으로 하나하나 받아서(chunk를) 모아줘야 한다.
끝나는걸(end) 명시하고 concat을 이용해 하나로 이으면 된다.
스트림도 비동기다. 비동기는 애러처리를 반드시 해 주어야 한다.
여기서 주의할 점은 stream은 동시에 오는게 아니라 순서대로 온다는 점이다.
*highWaterMark : 16 은 16바이트씩 읽겠다는 것이다.
스트림 방식이 버퍼 방식과 비교해서 좋은점은 메모리를 아낄 수 있다는 점이다.
버퍼 방식은 한번에 파일 크기만큼 읽어서 서버에 보내주게 되는데 서버의 용량이 파일 크기보다 작다면 서버가 터질 수 있다.
반면에 스트림 방식으로 하면 얼마만큼 잘라서 보내는가에 따라서 서버 용량을 효율적으로 조절 할 수 있게 된다.