---
title: "Cap'n Proto: Protobuf 만든 사람이 다시 만든 '인코딩 없는' 직렬화 포맷"
published: 2026-01-23T22:47:56.000Z
canonical: https://jeff.news/article/1154
---
# Cap'n Proto: Protobuf 만든 사람이 다시 만든 '인코딩 없는' 직렬화 포맷

Protocol Buffers v2의 핵심 개발자 Kenton Varda가 만든 데이터 직렬화 포맷 겸 RPC 시스템. 인코딩과 메모리 표현이 동일해서 직렬화/역직렬화 비용이 0이며, mmap, 랜덤 액세스, 프로세스 간 공유 메모리 등 다양한 이점을 제공함. Cloudflare Workers에서 실전 사용 중.

- Protocol Buffers v2의 핵심 개발자였던 Kenton Varda가 만든 데이터 직렬화 포맷 + RPC 시스템. Protobuf의 수년간 경험과 사용자 피드백을 바탕으로 설계한 "개선판"임
- 벤치마크에서 Protocol Buffers 대비 **무한 배 빠름**. 물론 불공정한 비교인데, 인코딩/디코딩 과정 자체가 없기 때문

**핵심 아이디어**: 인코딩 포맷과 메모리 내 표현이 동일함. 구조체를 만들면 그 바이트를 그대로 디스크에 쓰면 됨

- 플랫폼 독립적이지만 현대 CPU에 최적화된 설계: 고정 폭, 고정 오프셋, 정렬, 리틀엔디언
- 포인터는 절대 주소가 아닌 오프셋 기반이라 메시지가 위치 독립적
- 하위 호환성: 새 필드는 항상 구조체 끝에 추가되고, 읽는 쪽은 바운드 체크만 하면 됨
- 고정 폭 정수나 패딩이 낭비처럼 보이지만, 어차피 0이라서 "packing"이라는 전용 압축을 걸면 protobuf와 비슷한(오히려 더 작은) 크기 달성 가능

**보안**: 버퍼 포인터를 구조체로 캐스팅하는 짓은 안 함. 접근자 메서드가 포인터를 검증한 후 따라감. Sandstorm.io와 Cloudflare Workers에서 실전 투입 중이고, 퍼징 + 보안 전문가 리뷰를 거침

**기타 장점들**:
- 점진적 읽기: 메시지를 다 받기 전에 처리 시작 가능
- 랜덤 액세스: 전체 파싱 없이 특정 필드만 읽기
- mmap 지원: 대용량 파일을 메모리 매핑해서 접근한 부분만 OS가 읽음
- 언어 간 / 프로세스 간 통신: 같은 메모리 표현을 공유하니까 Java↔C++ 같은 조합에서 별도 변환 없이 동작
- 아레나 할당: Protobuf의 메모리 할당 병목 회피
- 생성 코드가 극도로 작음: 대부분 인라인 접근자 메서드 수준
- **Time-traveling RPC**: 요청이 서버에 도착하기 전에 응답이 클라이언트에 돌아오는 마법 같은 구조 (promise pipelining)

Protobuf을 왜 그렇게 까냐고? 본인이 만든 거라서 까기 편해서라고 함. 구글과는 무관한 프로젝트임

## 핵심 포인트

- 인코딩 포맷 = 메모리 내 표현이라 직렬화/역직렬화 비용 제로
- 플랫폼 독립적이면서 현대 CPU에 최적화된 설계 (고정 폭, 리틀엔디언, 오프셋 기반 포인터)
- packing 압축으로 protobuf과 비슷하거나 더 작은 메시지 크기 달성
- mmap, 랜덤 액세스, 언어 간/프로세스 간 통신 등 다양한 활용 가능
- Time-traveling RPC: promise pipelining으로 응답이 요청보다 먼저 도착하는 구조

## 인사이트

Protobuf의 창시자가 '인코딩 단계 자체를 없애버리면 어떨까'라는 근본적 질문에서 출발한 설계. 제로카피 직렬화의 대표 사례.
