TIL no.96 - Node.js - Buffer

박준규·2019년 12월 31일
0

해당 포스팅은 Do you want a better understanding of Buffer in Node.js? Check this out.을 토대로 번역, 의역, 구성 재배치, 첨언한 것입니다.

오역은 댓글로 남겨주시면 감사하겠습니다.


TIL no.95 - Node.js - Buffer - binary data, stream of data에서 이어지는 글입니다.

만약 binary data와 stream of data에 관한 지식이 부족하다면 위 글을 공부한 뒤, 본문을 읽는 것을 추천 드립니다.


Buffer

buffer는 streaming 동안 어떻게 binary data와 상호작용하는 것을 도와줄까요? 정확히 buffer란 무엇일까요?

stream이란 data의 이동이라는 것을 알아봤습니다. 그렇다면 data은 어떻게 이동할까요?

대체적으로 데이터의 이동은 데이터를 처리하거나 읽거나 그 데이터를 이용해 결정을 내리기 위해 행해집니다.

한 프로세스가 특정 시간동안 받을 수 있는 데이터의 최소량과 최대량이 있습니다.

그래서 만약에 한 작업이 데이터를 처리하는 시간보다 데이터가 도착하는 시간이 더 빠르다면, 초과된 데이터는 어디에선가 처리되기를 기다리고 있어야 합니다.

반대로, 만약 데이터가 도착하는 것보다 처리되는 속도가 더 빠르다면 일찍 도착한 데이터들은 처리 전까지 나머지 데이터들을 기다려야 합니다.

이 때 필요한 대기 장소가 바로 buffer입니다. 컴퓨터의 작은 물리적 위치이며 주로 RAM에 위치합니다. 이곳에 데이터들이 일시적으로 모이고 기다리고 streaming 동안 처리되기 위해 보내집니다.

Buffer == Station

buffer는 버스 정류장에 비유할 수 있습니다.

버스 정류장에서 버스는 충분한 승객이 타지 않았거나 출발 시간이 아니라면 출발할 수 없습니다.

승객들도 각기 다른 속도로 다른 시각에 도착합니다.

승객들도 버스 정류장도 승객들의 도착을 컨트롤할 수는 없습니다.(승객들의 속도는 환경적 요인에 의해 결정된다고 생각해주세요.)

어떤 경우이건, 일찍 도착한 승객들은 정류장이 버스를 보내기까지 기다려야합니다.

버스가 이미 만석일 때 혹은 이미 버스가 떠난 뒤 도착한 승객들도 다음 버스를 기다려야만 합니다.

어느 경우건 "대기 장소"는 필요합니다.

이 대기장소가 Node.js에서는 Buffer입니다.

Node.js는 데이터 도착 시간, 데이터 도착 속도, stream의 속도를 제어할 수는 없습니다.

언제 데이터를 전송할지만 결정할 수 있습니다.

아직 때가 아니라면 Node.js는 데이터들을 buffer에 둡니다.

여기서 말하는 때는 데이터를 처리하기 위해 전송하는 타이밍을 뜻합니다.

실생활에서 buffer를 볼 수 있는 경우가 온라인 비디오 스트리밍 서비스입니다.

만약 인터넷 속도가 충분히 빠르다면 stream 속도가 빠르기 때문에
stream이 끝날때까지 즉각적으로 buffer를 채우고 처리를 위해 전송하고 다시 즉각적으로 buffer를 채우고 처리를 위해 전송합니다.

하지만 만약 인터넷 속도가 느리다면,
첫번째 데이터 set 처리 이후에 비디오 플레이어는 로딩아이콘을 화면에 띄웁거나 "buffering" 이라는 텍스트를 보여줍니다. 이는 데이터를 모으는 중이거나 데이터가 도착할 때까지 기다리는 중이라는 것을 의미합니다.

그리고 buffer가 채워지고 처리되면 비디오 플레이어는 비디오라는 데이터를 보여줍니다.

그 데이터들을 플레이하는 동안, 이후의 데이터들은 계속해서 도착하고 buffer에서 기다립니다.

만약 플레이어가 이전의 데이터 처리를 완료했고 buffer가 아직 다 채워지지 않았다면 "buffering"이라는 텍스트는 다시 띄워질 것입니다. 처리할 데이터들을 모으면서 말이죠.

이것이 Buffer입니다!

buffer에 대한 설명에서, 데이터가 buffer에 있는 동안 우리가 streaming되는 binary data들을 조작하고 다룰 수 있다고 했습니다.(interact and manipulate)

이러한 raw binary data들을 이용해서 어떤 종류의 작업을 할 수 있을까요?

Node.js의 Buffer 문서에는 할 수 있는 작업 내용들을 보여줍니다.

그 중 몇가지를 살펴보겠습니다.

Interacting with a Buffer

직접 buffer를 만드는 게 가능합니다.

Node.js는 Streaming 동안 buffer를 만드는데 이와 별개로 직접 buffer를 만들고 다룰 수 있습니다.

직접 만들어 보겠습니다.

buffer를 만드는 방법은 여러가지 있습니다. 몇 가지를 살펴보겠습니다.


// Create an empty buffer of size 10.
// 10 bytes만 수용할 수 있는 buffer
const buf1 = Buffer.alloc(10);

// Create a buffer with content
const buf2 = Buffer.from("hello buffer");

생성한 buffer를 다룰 수 있습니다.

// Examine the structure of a buffer
buf1.toJSON()
/* 
{ 
	type: 'Buffer',
	data: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
}
*/
//an empty buffer

buf2.toJSON()
/*
{
	type: 'Buffer',
	data: [ 104, 101, 108, 108, 111, 32, 98, 117, 102, 102, 101, 114 ]
}
*/
// the toJSON() method는 데이터를 UniCode Point로 나타냅니다.

// Examine the size of a buffer
buf1.length // 10
buf2.length // 12. 생성될 때, initial content에 근거해 자동 할당됩니다.

// Write to a buffer
buf1.write("Buffer really rocks!") 
// Decode a buffer
buf1.toString() // 'Buffer rea'
//buf1은 10 bytes만 수용할 수 있기 때문에 여분의 character들은 수용할 수 없습니다.

buf2.write("Buffer really rocks!")

buf2.toString() //  'Buffer reall'
// initial content에 의해 12 size (12 bytes)의 buffer로 생성되었기 때문에 buf1보다 2bytes 더 수용할 수 있습니다.

buffer를 다루는 방법은 이 뿐만 아니라 더 많이 있습니다.

더 많은 Buffer 관련 method들은 Node.js 공식 문서에서 확인하시기 바랍니다.

profile
devzunky@gmail.com

0개의 댓글