버퍼(Buffer)와 인코딩

버퍼(Buffer)와 인코딩

버퍼(Buffer)는 고정 길이의 바이트 시퀀스를 나타내는 객체예요. 파일이나 소켓에서 주고받는 데이터는 기본적으로 이진 데이터라서, 문자열로 바로 다루기 어려운데 이때 Buffer가 필요해요. 이 글에서는 Buffer가 무엇이고, 문자열 인코딩과 어떻게 변환되는지, 그리고 node:buffer 모듈의 유틸리티를 정리해 볼게요.

출처: Buffer — Node.js 공식 문서

Buffer가 뭔가요

Buffer 객체는 고정 길이의 바이트 시퀀스를 표현해요. 많은 Node.js API가 Buffer를 주고받지요. Buffer 클래스는 자바스크립트의 Uint8Array를 상속하고, 그 위에 추가 사용 사례를 위한 메서드를 더한 거예요.

버퍼를 만들 땐 주로 Buffer.from()으로 문자열이나 배열을 변환하는 방식을 써요. ASCII 문자열을 바이트 단위로 복사하고 싶다면 Buffer.allocUnsafe()로 크기를 정하고 한 바이트씩 채워 넣을 수도 있지만, 일반적으로는 Buffer.from()으로 변환하는 게 더 깔끔해요.

버퍼와 문자 인코딩

Buffer는 바이트라서, 문자열로 다룰 땐 인코딩을 지정해야 해요. 대표적인 인코딩은 아래와 같아요.

  • 'utf8' (별칭 'utf-8'): 멀티바이트 유니코드 문자를 표현하는 기본 인코딩이에요. 웹 페이지와 여러 문서 포맷이 사용하고요.
  • 'base64': base64 문자열과 이진 데이터를 서로 변환할 때 써요.
const { Buffer } = require('node:buffer');

// 문자열을 Buffer로 (utf8이 기본)
const buf = Buffer.from('Node.js', 'utf8');

// Buffer를 문자열로
console.log(buf.toString('utf8')); // Node.js

// base64 인코딩/디코딩
const b64 = Buffer.from('hello').toString('base64');
console.log(b64); // aGVsbG8=
console.log(Buffer.from(b64, 'base64').toString()); // hello

인코딩과 디코딩, 특히 base64는 Buffer.from(str, 'base64')와 buf.toString('base64')로 처리하는 걸 권장해요. atob/btoa 같은 브라우저 함수 대신에요.

node:buffer 모듈의 유틸리티

Buffer 객체는 전역으로도 쓸 수 있지만, 추가 API는 node:buffer 모듈로 접근해요.

  • buffer.isAscii(input): 입력이 ASCII 문자로만 이뤄졌는지 확인해요. (v19.6.0, v18.15.0에 추가)
  • buffer.transcode(source, fromEnc, toEnc): 주어진 인코딩을 다른 인코딩으로 변환해요. 예를 들어 utf8로 된 문자열을 ascii로 transcoding할 수 있어요.
const { Buffer, transcode } = require('node:buffer');
const newBuf = transcode(Buffer.from('€'), 'utf8', 'ascii');
console.log(newBuf.toString('ascii')); // ?

참고로 buffer.constants.MAX_STRING_LENGTH 같은 상수도 정의돼 있는데, 값은 사용 중인 JS 엔진에 따라 달라질 수 있어요.

더 알아보기