본문 바로가기
node.js

노드js Buffer&Stream

by PudgeKim 2021. 5. 28.

Buffer에 대해 먼저 알아보겠습니다.

1
2
3
4
const buf = Buffer.from('Hello World')
console.log(buf);
 
//output: <Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>
cs

위와 같이 기본 Buffer class를 사용해서 버퍼의 형태로 만들 수 있으며
buffer는 배열이기 때문에 buf[0] 이렇게 접근할 수 있습니다.

buf.toString()을 통해 다시 Hello World로 변환시킬 수 있는데 두번째 인자로 인코딩 타입을 정할 수 있습니다.
(defualt는 utf-8입니다.)

 

Buffer의 초기화는 아래와 같습니다.

1
2
3
4
const buf2 = Buffer.alloc(5)
console.log(buf2)
 
//output: <Buffer 00 00 00 00 00>
cs

* allocUnsafe라는 함수는 버퍼 크기는 잡아주지만 초기화하지않습니다. (즉, 다른 데이터가 들어있을 수도 있습니다.)

여러 buffer를 합치려면 Buffer.concat 함수를 이용하면 됩니다.

 

다음은 Stream에 관해 알아보겠습니다.

Stream은 데이터를 작게 쪼개서 보내는 것을 뜻합니다. 예를 들어서 넷플릭스를 볼때 사용자는 보고 싶은 영화를 전부 다운받은 후에 보는 것이 아닌 실시간으로 해당 영화의 데이터를 넷플릭스 서버로부터 조금씩 받아와서 영상을 시청하게 됩니다.
Stream을 사용하면 전체 데이터를 한번에 다운받는 것보다 메모리를 줄일 수 있고 사용자도 모두 다운받기까지 기다리지 않아도 됩니다.

자바스크립트는 이벤트 기반이기 때문에 stream으로부터 데이터가 조금씩 도착할 때마다 알려주게 됩니다.

 

1
2
3
4
5
6
7
8
9
10
const fs = require('fs')
 
const streamData = fs.createReadStream('./largeFile.txt', {
    highWaterMark: 64,
    encoding: 'utf-8'
})
 
streamData.on('data', chunk => {
    console.log(chunk);
})
cs

위처럼 createReadStream 함수를 이용하여 스트림 변수를 하나 만듭니다.
highWaterMark옵션은 buffer의 크기를 뜻하는 것으로 기본값이 64kb입니다. (byte단위이기 때문에 위 예제는 64byte입니다.)

이렇게 만든 스트림 변수에는 event를 등록할 수 있습니다. 위 예제는 데이터가 올 때마다 해당 데이터를 출력하는 이벤트를 적용시켰습니다. (이렇게 event를 발생시킬 수 있는 이유는 EventEmitter를 상속받기 때문입니다.)

on함수에 'end'를 통해 stream이 데이터 처리를 끝내면 그 때 이벤트를 발생시킬 수도 있습니다.

 

당연히 stream을 write 할 수도 있습니다.

1
2
3
4
5
6
7
8
9
const fs = require('fs')
 
const writeStream = fs.createWriteStream('./test.txt')
writeStream.on('finish', () => {
    console.log('finished');
})
 
writeStream.write('hello world')
writeStream.end()
cs

writeStream의 경우 write함수를 실행하고 end함수도 실행해야 쓰기를 끝냅니다.

역시 event를 등록할 수 있는데 'finish'는 write이 모두 끝나면 발생됩니다.

 

Stream Pipe

pipe를 이용하면 데이터를 읽고 다른 곳으로 보낼 수 있습니다.

1
2
3
4
5
6
const fs = require('fs')
 
const readStream = fs.createReadStream('./start.txt')
const writeStream = fs.createWriteStream('./destination.txt')
 
const piping = readStream.pipe(writeStream)
cs

위 예제는 start.txt의 데이터가 destination.txt로 흘러들어가게 됩니다.

 

1
const piping = readStream.pipe(otherStream).pipe(writeStream)
cs

위처럼 pipe는 여러개의 stream을 연결시킬 수도 있습니다.

'node.js' 카테고리의 다른 글

노드js 파일/파일경로 관리하기  (0) 2021.05.28
node.js Interval과 nextTick  (0) 2021.05.27