[Node.JS] 버퍼와 스트림

진실·2021년 7월 3일
0

1. 버퍼와 스트림

1.1 버퍼

버퍼는 메모리에 임시로 저장된 데이터입니다. 만약에 10MB의 파일을 읽는다면 10MB 크기의 버퍼가 있어야 합니다.

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);

위 코드의 출력 결과는 아래와 같습니다.

from(): <Buffer ec a0 80 eb a5 bc 20 eb b2 84 ed 8d bc eb a1 9c 20 eb b0 94 ea bf 94 eb b3 b4 ec 84 b8 ec 9a 94>
length:  32
toString(): 저를 버퍼로 바꿔보세요
concat():  띄엄띄엄띄어쓰기
alloc():  <Buffer 00 00 00 00 00>
PS C:\Users\USER\Desktop\공부\textbook> 

노드에는 Buffer라는 객체가 있어서 버퍼를 다룰 수 있습니다.
Buffer의 객체는 다음과 같습니다.

  • Buffer.from(문자열) : 문자열을 버퍼로 바꿔줍니다
  • Buffer.toString(버퍼) : 버퍼를 문자열로 바꿔줍니다
  • Buffer.concoat(배열) : 배열 형태의 버퍼를 하나로 버퍼로 합칩니다
  • Buffer.alloc(바이트) : 버퍼에 바이트 만큼의 공간을 할당합니다.

1.2 스트림

버퍼는 읽을 크기 만큼의 공간을 필요로 합니다. 따라서 읽을 파일의 크기가 굉장히 크면 난감합니다. 따라서 읽을 내용을 chunk로 조각내서 조금씩 읽는 방법이 필요합니다. 이를 수행하는 것이 스트림입니다.

스트림을 통한 읽기

const fs = require('fs');

const readStream = fs.createReadStream('./readme3.txt', {highWaterMark : 16});
// readme3.txt를 읽을 스트림을 만들어 줍니다.
const data = [];
// 읽은 chunk를 저장할 빈 공간을 만들어 줍니다.

readStream.on('data', (chunk)=>{ //16byte의 크기의 버퍼로 읽어옴
  data.push(chunk); // data 배열에 읽어온 chunk 추가
  console.log('raw data :', chunk, ' length :', chunk.length);
});

readStream.on('end', ()=>{ // 다 읽었으면
  console.log('end : ', Buffer.concat(data).toString());
  // data 배열에 담긴 chunk들을 버퍼로 합치고 문자열 변환
});

readStream.on('error', (err)=>{
  console.log('error : ', err);
});
// 오류 처리

위 코드의 출력 결과는 아래와 같습니다.

raw data : <Buffer ec a0 80 eb 8a 94 20 ec a1 b0 ea b8 88 ec 94 a9>  length : 16
raw data : <Buffer 20 ec a1 b0 ea b8 88 ec 94 a9 20 eb 82 98 eb 88>  length : 16
raw data : <Buffer a0 ec 84 9c 20 ec a0 84 eb 8b ac ed 95 a9 eb 8b>  length : 16
raw data : <Buffer 88 eb 8b a4 2e 20 eb 82 98 eb 88 a0 ec a7 84 20>  length : 16
raw data : <Buffer ec a1 b0 ea b0 81 ec 9d 84 20 63 68 75 6e 6b eb>  length : 16
raw data : <Buffer 9d bc ea b3 a0 20 ed 95 a9 eb 8b 88 eb 8b a4 2e>  length : 16
end :  저는 조금씩 조금씩 나눠서 전달합니다. 나눠진 조각을 chunk라고 합니다.

16byte의 chunk로 readme3.txt를 읽어오는 것을 확인할 수 있습니다.

스트림을 통한 쓰기

const fs = require('fs');

const writeStream = fs.createWriteStream('./writeme2.txt');
// 파일을 작성할 stream 생성
writeStream.on('finish', ()=>{ // 파일 작성이 완료되면
  console.log('파일 쓰기 완료');
});

writeStream.write('이 글을 씁니다');
// 스트림에 '이 글을 씁니다' 작성
writeStream.write(' 한번 더 씁니다');
// 스트림에 '한번 더 씁니다' 작성
writeStream.end();
// 스트림에 종료 알리기

위 코드를 수행하면

이 글을 씁니다 한번 더 씁니다

write2.txt 파일이 위와 같이 생성됩니다.

이 포스팅의 예시 코드는 Node.js교과서(조현영, 길벗)에서 발췌했습니다.

profile
반갑습니다.

0개의 댓글