TIL(Today I Learned)
버퍼 객체
JavaCPP
2025. 1. 14. 20:47
1. 버퍼 객체란?
Buffer는 Node.js에서 제공하는 바이너리 데이터를 처리하기 위한 객체입니다. 소켓 통신과 같은 네트워크 데이터 송수신에서 주로 사용됩니다.
주요 특징:
- 고정 크기:
- Buffer는 고정 크기의 메모리 공간을 사용하며, JavaScript의 동적 배열과 달리 변경할 수 없습니다.
- 바이너리 데이터:
- 문자 데이터뿐만 아니라 이미지, 오디오, 파일 등의 바이너리 형식 데이터도 처리할 수 있습니다.
- 빠른 데이터 조작:
- 네트워크 통신에서는 빠르고 효율적으로 데이터를 처리해야 하며, Buffer는 이를 가능하게 합니다.
2. 소켓 통신과 버퍼
소켓 통신에서 데이터는 네트워크를 통해 패킷 단위로 전송되며, 이 데이터는 Buffer 형태로 수신됩니다. 이후, 이를 문자열 또는 다른 형식으로 변환하여 처리합니다.
3. 예제 코드
서버와 클라이언트 간에 메시지를 주고받으며, Buffer 객체의 동작을 설명합니다.
서버 코드 (소켓에서 버퍼 사용)
const net = require('net');
// 서버 생성
const server = net.createServer((socket) => {
console.log('클라이언트가 연결되었습니다.');
// 데이터 수신 이벤트
socket.on('data', (data) => {
console.log('클라이언트로부터 수신된 데이터 (Buffer):', data);
console.log('클라이언트로부터 수신된 데이터 (문자열):', data.toString());
// 응답 메시지 생성 (버퍼 사용)
const response = Buffer.from('서버에서 보내는 메시지입니다.');
socket.write(response); // 응답 전송
});
// 연결 종료 이벤트
socket.on('end', () => {
console.log('클라이언트와의 연결이 종료되었습니다.');
});
});
// 서버 시작
server.listen(8080, () => {
console.log('서버가 8080 포트에서 실행 중입니다.');
});
클라이언트 코드 (소켓에서 버퍼 사용)
const net = require('net');
// 서버에 연결
const client = net.createConnection({ port: 8080 }, () => {
console.log('서버에 연결되었습니다.');
// 메시지 전송 (버퍼로 전송)
const message = Buffer.from('클라이언트에서 보내는 메시지입니다.');
client.write(message);
});
// 데이터 수신 이벤트
client.on('data', (data) => {
console.log('서버로부터 수신된 데이터 (Buffer):', data);
console.log('서버로부터 수신된 데이터 (문자열):', data.toString());
// 연결 종료
client.end();
});
// 연결 종료 이벤트
client.on('end', () => {
console.log('서버와의 연결이 종료되었습니다.');
});
4. 코드 설명
- 클라이언트 → 서버로 데이터 전송:
- 클라이언트는 Buffer.from()을 사용해 문자열을 Buffer 객체로 변환합니다.
- 이 버퍼 데이터를 client.write()로 서버에 전송합니다.
- 서버에서 데이터 수신:
- 서버는 socket.on('data') 이벤트를 통해 버퍼 데이터를 수신합니다.
- 받은 데이터를 data.toString()으로 변환해 사람이 읽을 수 있는 문자열로 출력합니다.
- 서버 → 클라이언트로 응답 전송:
- 서버는 응답 메시지를 Buffer.from()으로 생성한 뒤, socket.write()로 클라이언트에 전송합니다.
- 클라이언트에서 데이터 수신:
- 클라이언트는 client.on('data') 이벤트를 통해 서버의 응답 메시지를 버퍼로 수신합니다.
- 역시 data.toString()으로 변환해 출력합니다.
5. 버퍼 객체의 주요 메서드
데이터 생성:
const buf = Buffer.from('Hello'); // 문자열을 버퍼로 변환
console.log(buf); // <Buffer 48 65 6c 6c 6f>
데이터 읽기:
console.log(buf.toString()); // 'Hello' (문자열로 변환)
console.log(buf[0]); // 72 ('H'의 ASCII 값)
데이터 수정:
buf[0] = 65; // 'A'의 ASCII 값으로 변경
console.log(buf.toString()); // 'Aello'
데이터 병합:
const buf1 = Buffer.from('Hello ');
const buf2 = Buffer.from('World');
const merged = Buffer.concat([buf1, buf2]);
console.log(merged.toString()); // 'Hello World'
6. 실제 실행 결과
서버 출력:
서버가 8080 포트에서 실행 중입니다.
클라이언트가 연결되었습니다.
클라이언트로부터 수신된 데이터 (Buffer): <Buffer ec 81 b4 eb 9d bc ec 9d b4 ec 96 b8 ed 8a b8 eb 8f 84 20 eb b3 b4 eb 82 98 eb 8a 94 20 eb a9 94 ec 8b 9c ec a7 80 ec 9e 85 eb 8b 88 eb 8b a4>
클라이언트로부터 수신된 데이터 (문자열): 클라이언트에서 보내는 메시지입니다.
클라이언트 출력:
서버에 연결되었습니다.
서버로부터 수신된 데이터 (Buffer): <Buffer ec 84 bc eb b2 84 ec 97 90 ec 84 9c 20 eb b3 b4 eb 82 98 eb 8a 94 20 eb a9 94 ec 8b 9c ec a7 80 ec 9e 85 eb 8b 88 eb 8b a4>
서버로부터 수신된 데이터 (문자열): 서버에서 보내는 메시지입니다.
서버와의 연결이 종료되었습니다.
7. 버퍼 활용의 장점
- 바이너리 데이터 지원:
- 텍스트 외에도 이미지, 파일 등의 전송이 가능.
- 효율적인 메모리 사용:
- 고정 크기의 메모리를 사용해 속도가 빠름.
- 유니코드 및 인코딩 처리:
- 다양한 문자 인코딩을 지원하여 데이터의 변환과 처리가 용이.