Buffer
자바스크립트에서 Buffer를 활용하여 바이너리 데이터를 효율적으로 다루는 방법과 ArrayBuffer, Uint8Array와의 차이점을 알기 쉽게 설명합니다.
Javascript 를 이용해 단순한 FE, BE 만 구현한다면 Buffer 의 기능들이 필요할 일이 많이 없다. 하지만 Javascript 를 이용하여 Socket 통신, 암호화, 인코딩, Stream 관련 작업을 하다 보면 Buffer 관련 기능이 필요해진다. 이 글에서는 Javascript 의 Buffer 에 대해 두서없이 정리해 보겠다.
Javascript 의 Buffer 를 가장 간단히 정리해 보면, Binary 데이터를 저장하기 위한 메모리 공간 이다. 이는 보편적인 Buffer 의 실제 정의와 차이가 있을 수 있지만, 내가 느끼기에는 가장 피부에 와닿는 "Javascript Buffer" 자료구조의 설명이다. Buffer 는 주로 바이너리 데이터를 임시로 담아두는 역할을 수행한다. 가장 많이 접할 수 있는 예는, 바이너리 데이터를 hex 나 base64 로 변환하여 보여준다. 
const message = '안녕하세요';
const buffer = Buffer.from(message);
const hex = buffer.toString('hex');
const base64 = buffer.toString('base64');
const originalMessage = Buffer.from(base64, 'base64').toString();
console.log(buffer);                        // <Buffer ec 95 88 eb 85 95 ed 95 98 ec 84 b8 ec 9a 94>
console.log(hex);                           // ec9588eb8595ed9598ec84b8ec9a94
console.log(base64);                        // 7JWI64WV7ZWY7IS47JqU
console.log(buffer.toString());             // '안녕하세요'
console.log(originalMessage);               // '안녕하세요'
한편, Javascript 에는 비슷한 자료구조인  ArrayBuffer, ArrayBufferView 등이 있는데, 왜 비슷한 역할을 하는 자료구조가 두 개 있는지  이해가 되지 않았었다. 그 이유는 생각보다 간단했다. 
Uint8Array is a general-purpose byte-array that’s available in both nodejs and browsers. Buffer is a subclass of Uint8Array that’s only available in nodejs (for historical reasons). both are primarily used for manipulating binary (byte) data. Historically, when nodejs first came about, general-purpose Uint8Arrays didn’t exist, so it had to invent its own “Buffer” type for handling binary-data. after general-purpose Uint8Arrays were introduced with es6, nodejs (after version 4.0) decided to migrate Buffer over from a separate data-type -> subclass of Uint8Array (to try and make it more browser-compatible with Uint8Array).
 
놀랍게도(?) Node.js 가 처음 나왔을 때에는, ECMAScript에 해당 역할을 수행하는 자료구조가 없어서라고 한다. Nodejs 는 보편적인 Javascript 런타임을 제공해야 했기 때문에, Binary 단위의 작업을 처리할 수 있는 기능을 제공해야 했을 것이다. 당시의 ECMAScript 에서는 지원되지 않으니 직접 구현했을 것이다. 이후에는 브라우저 호환성을 위해 Uint8Array 의 하위 클래스로 지정하였다. 이 말은, Buffer 가 Nodejs API 이기 때문에 브라우저에서는 Buffer 를 활용하는 것이 불가능하고, Uint8Array 등의 자료구조로 처리해야 함을 의미한다.
이렇게 어지러워진 Nodejs Binary 관련 자료구조는 어떻게 정리할 수 있을까 ?
이것도 읽어보세요