[Node.js] 버퍼와 스트림

nemo·2022년 7월 16일
0

Node.js

목록 보기
1/3
post-thumbnail

버퍼(Buffer)

Node에서 fs(file system) 모듈을 사용하여 파일을 가져오면 버퍼 형식으로 제공된다.

Node에서 파일을 읽을 때 그 파일의 크기만큼 메모리에 공간을 마련해둔다. 그 공간에 파일 데이터를 저장하는데 이 데이터가 바로 버퍼이다.

버퍼 관련 메서드

  • from(문자열): 문자열을 버퍼로 바꾼다.
  • toString(버퍼): 버퍼를 문자열로 바꾼다.
  • concat(배열): 배열 안에 있는 버퍼를 하나로 합친다.
  • alloc(바이트): 빈 버퍼를 바이트 크기만큼 생성한다.

그런데 데이터의 크기만큼 메모리에 공간을 마련하게 되면 크기가 큰 데이터를 읽을 때마다 메모리에도 큰 공간을 마련해야 한다는 문제가 있다.

그래서 이 버퍼의 크기를 작게 쪼개서 여러 번에 나눠 보내는 방식이 등장했는데 바로 스트림이다.


스트림(Stream)

스트림 방식을 사용하면, 용량이 100MB인 데이터를 위해 메모리에 100MB 버퍼를 만드는 게 아니라 1MB 크기의 버퍼를 만든다. 1MB씩 100번에 걸쳐 연속으로 전송된다. 이 때 나뉘어진 조각을 청크(chunk)라고 한다.

읽기 스트림 생성하기

스트림 방식으로 파일을 읽을 때

const fs = require('fs');

// createReadStream(): 읽기 스트림 생성, 두 번째 인수는 버퍼의 크기를 정하는 옵션이다.
const readStream =  fs.createReadStream('./readme.txt', { highWaterMark: 16 });
const data = [];

// data 이벤트: 파일 읽기가 시작되면 실행
readStream.on('data', (chunk) => {
  data.push(chunk);
  console.log('data:', chunk, chunk.length);
})

// end 이벤트: 파일을 모두 읽으면 end 이벤트 발생
readStream.on('end', () => {
  console.log('end:', Buffer.concat(data).toString());
});

readStream.on('error', (err) => {
  console.log('error:', err);
})

쓰기 스트림 생성하기

스트림 방식으로 파일을 생성하고 문자열을 작성할 때

const fs = require('fs');

// createWriteStream(): 쓰기 스트림 생성
const writeStream = fs.createWriteStream('./writeme.txt');

// finish 이벤트: 파일 쓰기가 완료되면 콜백 호출
writeStream.on('finish', () => {
  console.log('쓰기 완료');
});

writeStream.write('안녕하세요');
writeStream.end();

스트림 형식으로 다른 파일에 내용 복사 (pipe)

const fs = require('fs');

const readStream = fs.createReadStream('readme.txt');
const writeStream = fs.createWriteStream('writeme.txt');

// readme.txt 파일의 내용을 writeme.txt 파일을 생성하여 복사
readStream.pipe(writeStream);

0개의 댓글