본문 바로가기

Programming/Node.js

4. Node 기능 살펴보기 (7) - 버퍼와 스트림 1

node js logo image

 

 

 

 

앞선 아티클에서 readFile과 readFileSync를 사용해 특정 텍스트 파일을 읽었고, 해당 파일의 데이터는 data로 불러왔습니다. 그런데, 이 파일들을 항상 마지막에 toString( )을 이용해 변환하여 출력하는 과정을 겪었습니다. 

 

 

 

4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 3

앞의 아티클에서는, 동기-블로킹 방식으로 readFile을 구현하는 예제를 살펴보았었습니다.    4. Node 기능 살펴보기 (6) - 동기 / 비동기 메서드 2앞선 아티클에서 설명했다시피, 동기 / 비동기는

nozeroslope.tistory.com

 

 

왜 그런 방식으로 출력을 진행했을까요? 답을 바로 말씀드려 보겠습니다. 바로 여기서 반환된 data는 '버퍼'이기 때문입니다. 

 

 

 


 

 

 

흔히 인터넷에서 사용되는 용어, "버퍼링""스트리밍"이 있습니다. 아마 별다른 설명이 없어도 각각의 용어에 대해서 대강 이해하고 있을 것입니다. 영상을 로딩할 때 '버퍼링이 걸렸다'라고 표현하죠. 그리고 영상을 실시간으로 송출할 때 '스트리밍을 하고 있다'라는 표현을 씁니다. 

 

간단하게 버퍼링은 영상이 재생 가능할 때까지 데이터를 모아가는 행위를 뜻합니다. 그리고 스트리밍은 영상을 스트리머가 구독자의 PC로 영상 데이터를 조금씩 전송하는 동작이죠. 

 

이렇게 영상이 '스트리밍 되는 동안'에도 '버퍼링'이 일어나게 됩니다. 영상이 시청자 PC에서 재생되기 위한 최소한의 데이터를 모아야하기 때문이죠. 또한, 전송이 재생 속도보다 빠르게 전송이 되었다고 하더라도 미리 전송받은 데이터를 받아서 보관해 두는 장소가 필요하기 때문이죠. 

 

이제 이 친숙한 개념을 통해 노드에서의 버퍼와 스트림 개념을 살펴보겠습니다. 

 

 

 


 

 

 

앞선 아티클에서 readFile 메서드를 통해 읽었던 파일을 toString을 사용하지 않고 출력하면, 알아볼 수 없는 버퍼 값으로 출력되었습니다. 이렇게 노드는 파일을 읽어들일 때, 메모리에 파일 크기만큼 공간을 할당하고 - 파일 데이터를 메모리에 저장한 다음 - 사용자가 조작하도록 만듭니다. 

 

이 때, 사용자가 이 버퍼를 다룰 수 있도록 만들어주는 클래스가 Buffer입니다.

 

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 eb b2 84 ed 8d bc eb a1 9c 20 eb b3 80 ed 99 98 ed 95 a0 20 eb ac b8 ec 9e 90 ec 97 b4 ec 9e 85 eb 8b 88 eb 8b a4 2e>
length:  39
toString():  버퍼로 변환할 문자열입니다.
concat():  단어 사이 공백들
alloc(): <Buffer 00 00 00 00 00>
*/

 

 

위에서 사용한 Buffer의 메서드를 다음 아티클에서 살펴보겠습니다.