728x90
반응형
1. Buffer란
Buffer는 Node.js에서 바이너리 데이터를 다루기 위한 클래스입니다. JavaScript는 원래 문자열 처리에 최적화되어 있어 바이너리 데이터를 직접 다루기 어려웠습니다. Buffer는 고정 크기의 메모리 청크를 할당하여 TCP 스트림, 파일 시스템 작업, 이미지 처리 등에서 바이너리 데이터를 효율적으로 처리할 수 있게 해줍니다.
2. Buffer 생성
2.1 Buffer.alloc()
지정된 크기의 버퍼를 생성하고 0으로 초기화합니다.
// 10바이트 버퍼 생성 (0으로 초기화)
const buf1 = Buffer.alloc(10);
console.log(buf1);
// <Buffer 00 00 00 00 00 00 00 00 00 00>
// 특정 값으로 채우기
const buf2 = Buffer.alloc(10, 1);
console.log(buf2);
// <Buffer 01 01 01 01 01 01 01 01 01 01>
2.2 Buffer.allocUnsafe()
초기화 없이 버퍼를 생성합니다. 빠르지만 이전 메모리 데이터가 남아있을 수 있습니다.
// 초기화 없이 생성 (더 빠름, 민감한 데이터 주의)
const buf = Buffer.allocUnsafe(10);
console.log(buf); // 이전 메모리 내용이 있을 수 있음
2.3 Buffer.from()
기존 데이터로부터 버퍼를 생성합니다.
// 문자열로부터 생성
const buf1 = Buffer.from('Hello');
console.log(buf1);
// <Buffer 48 65 6c 6c 6f>
// 인코딩 지정
const buf2 = Buffer.from('안녕하세요', 'utf8');
console.log(buf2);
// 배열로부터 생성
const buf3 = Buffer.from([72, 101, 108, 108, 111]);
console.log(buf3.toString()); // Hello
// 다른 버퍼로부터 복사
const buf4 = Buffer.from(buf1);
3. Buffer 읽기/쓰기
3.1 문자열 변환
const buf = Buffer.from('Hello, Node.js!');
// 버퍼를 문자열로 변환
console.log(buf.toString()); // Hello, Node.js!
console.log(buf.toString('utf8')); // Hello, Node.js!
console.log(buf.toString('hex')); // 48656c6c6f2c204e6f64652e6a7321
console.log(buf.toString('base64')); // SGVsbG8sIE5vZGUuanMh
// 부분 문자열
console.log(buf.toString('utf8', 0, 5)); // Hello
3.2 개별 바이트 접근
const buf = Buffer.from('Hello');
// 읽기
console.log(buf[0]); // 72 (H의 ASCII 코드)
console.log(buf[1]); // 101 (e의 ASCII 코드)
// 쓰기
buf[0] = 74; // J로 변경
console.log(buf.toString()); // Jello
3.3 숫자 읽기/쓰기
const buf = Buffer.alloc(8);
// 정수 쓰기
buf.writeUInt8(255, 0); // 1바이트 부호 없는 정수
buf.writeUInt16BE(65535, 1); // 2바이트 빅엔디안
buf.writeUInt32LE(4294967295, 3); // 4바이트 리틀엔디안
// 정수 읽기
console.log(buf.readUInt8(0)); // 255
console.log(buf.readUInt16BE(1)); // 65535
console.log(buf.readUInt32LE(3)); // 4294967295
// 실수 쓰기/읽기
const floatBuf = Buffer.alloc(8);
floatBuf.writeFloatBE(3.14, 0);
floatBuf.writeDoubleBE(3.141592653589793, 0);
console.log(floatBuf.readDoubleBE(0)); // 3.141592653589793
4. Buffer 조작
4.1 버퍼 복사
const source = Buffer.from('Hello');
const target = Buffer.alloc(10);
source.copy(target);
console.log(target.toString()); // Hello
// 부분 복사
source.copy(target, 5, 0, 3); // target의 5번 위치에 source의 0~2 복사
console.log(target.toString()); // HelloHel
4.2 버퍼 연결
const buf1 = Buffer.from('Hello ');
const buf2 = Buffer.from('World');
const combined = Buffer.concat([buf1, buf2]);
console.log(combined.toString()); // Hello World
// 총 길이 지정
const limited = Buffer.concat([buf1, buf2], 8);
console.log(limited.toString()); // Hello Wo
4.3 버퍼 슬라이스
const buf = Buffer.from('Hello World');
// slice는 원본과 메모리를 공유
const slice = buf.slice(0, 5);
console.log(slice.toString()); // Hello
slice[0] = 74; // J로 변경
console.log(buf.toString()); // Jello World (원본도 변경됨)
// subarray도 동일하게 동작
const sub = buf.subarray(6, 11);
console.log(sub.toString()); // World
4.4 버퍼 비교
const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('ABD');
const buf3 = Buffer.from('ABC');
console.log(buf1.compare(buf2)); // -1 (buf1 < buf2)
console.log(buf2.compare(buf1)); // 1 (buf2 > buf1)
console.log(buf1.compare(buf3)); // 0 (같음)
console.log(buf1.equals(buf3)); // true
console.log(buf1.equals(buf2)); // false
반응형
5. Buffer 정보 확인
const buf = Buffer.from('Hello');
console.log(buf.length); // 5 (바이트 수)
console.log(Buffer.byteLength('안녕')); // 6 (UTF-8에서 한글은 3바이트)
console.log(Buffer.isBuffer(buf)); // true
console.log(Buffer.isEncoding('utf8')); // true
6. 실전 활용 예시
6.1 파일 바이너리 처리
const fs = require('fs');
// 이미지 파일 읽기
const imageBuffer = fs.readFileSync('image.png');
console.log('파일 크기:', imageBuffer.length, 'bytes');
// PNG 시그니처 확인
const pngSignature = Buffer.from([0x89, 0x50, 0x4E, 0x47]);
const isValidPng = imageBuffer.slice(0, 4).equals(pngSignature);
console.log('유효한 PNG:', isValidPng);
6.2 Base64 인코딩/디코딩
// 문자열 → Base64
const text = 'Hello, World!';
const base64 = Buffer.from(text).toString('base64');
console.log(base64); // SGVsbG8sIFdvcmxkIQ==
// Base64 → 문자열
const decoded = Buffer.from(base64, 'base64').toString('utf8');
console.log(decoded); // Hello, World!
6.3 바이너리 프로토콜 파싱
// 간단한 바이너리 메시지 파싱
const message = Buffer.from([
0x01, // 버전 (1바이트)
0x00, 0x0A, // 길이 (2바이트, 빅엔디안)
0x48, 0x65, 0x6c, 0x6c, 0x6f // 데이터 "Hello"
]);
const version = message.readUInt8(0);
const length = message.readUInt16BE(1);
const data = message.slice(3, 3 + length).toString();
console.log({ version, length, data });
// { version: 1, length: 10, data: 'Hello' }
결론
Buffer는 Node.js에서 바이너리 데이터를 다루는 핵심 클래스입니다. Buffer.alloc(), Buffer.from()으로 생성하고, toString()으로 문자열 변환, slice()로 부분 추출이 가능합니다. 파일 I/O, 네트워크 통신, 암호화, 이미지 처리 등 바이너리 데이터가 필요한 모든 작업에서 Buffer를 활용합니다.
728x90
반응형
'Node.js' 카테고리의 다른 글
| Node.js의 스트림 모듈(stream module) (0) | 2026.02.24 |
|---|---|
| Node.js의 이벤트 모듈(events module) (0) | 2026.02.24 |
| Node.js의 경로 모듈(path module) (0) | 2026.02.23 |
| Node.js의 URL 모듈(url module) (0) | 2026.02.23 |
| Node.js의 HTTP 모듈(http module) (0) | 2026.02.23 |