# MessagePack - JSON과 비슷하지만 작고 빠른 이진 직렬화 포맷

> Clean Markdown view of GeekNews topic #18816. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=18816](https://news.hada.io/topic?id=18816)
- GeekNews Markdown: [https://news.hada.io/topic/18816.md](https://news.hada.io/topic/18816.md)
- Type: news
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2025-01-20T10:46:02+09:00
- Updated: 2025-01-20T10:46:02+09:00
- Original source: [msgpack.org](https://msgpack.org/)
- Points: 13
- Comments: 4

## Summary

MessagePack은 효율적인 이진 직렬화 포맷으로, JSON처럼 여러 언어 간 데이터 교환이 가능하며, 작은 정수와 짧은 문자열을 효율적으로 인코딩합니다. Redis, Fluentd, Treasure Data, Pinterest 등 다양한 사용 사례에서 데이터 직렬화와 고속 처리를 위해 활용되고 있습니다. MessagePack은 데이터 크기를 최소화하고 속도를 최적화하여, 기존 JSON 기반 애플리케이션을 대체하거나 개선하는 데 유리합니다.

## Topic Body

- 효율적인 Binary Serialization 포맷   
- JSON처럼 여러 언어 간 데이터 교환 가능  
- 작은 정수는 단일 바이트로 인코딩, 짧은 문자열은 문자열 자체에 추가 바이트가 하나만 더 필요  
- 50개 이상의 프로그래밍 언어 및 환경에서 지원  
- 사용 사례:  
  - Redis: Lua용 MessagePack C 확장을 추가해 데이터 직렬화에 활용  
  - Fluentd: 내부 데이터 표현에 MessagePack 사용, 고속 처리 가능  
  - Treasure Data: 분석 쿼리에 최적화된 다중 테넌트 데이터베이스 구축  
  - Pinterest: MessagePack과 Memcache로 피드 캐시 압축 및 빠른 처리  
### 두개의 컨셉 : "Type System" 과 "Format"  
- 타입 시스템  
  - **Integer**: 정수  
  - **Nil**: `null` 값  
  - **Boolean**: `true` 또는 `false`  
  - **Float**: IEEE 754 부동 소수점  
  - **Raw**: 문자열 또는 바이트 배열  
  - **Array**: 객체 배열  
  - **Map**: 키-값 쌍  
  - **Extension**: 사용자 정의 타입  
    - **Timestamp**: 시간 정보  
- 포맷  
  - positive fixint, negative fixint, fixmap, fixarray  
  - nil, false, true  
  - bin 8/16/32, ext 8/16/32, float 32/64  
  - uint 8/16/32/64, int 8/16/32/64, fixext 1/2/4/8/16, str 8/16/32  
  - array 16/32, map 16/32  
  - 포맷 예시  
    - `fixint`: 7비트 정수 (양수는 0x00–0x7F, 음수는 0xE0–0xFF)  
    - `fixstr`: 최대 31바이트 문자열  
    - `array 16`: 최대 (2^16)-1 요소를 가진 배열  
    - `map 16`: 최대 (2^16)-1 키-값 쌍  
  
### MessagePack의 장점  
- 데이터 크기 최소화 및 속도 최적화  
- 기존 JSON 기반 애플리케이션의 대체 및 개선  
- 간단한 구현으로 다양한 환경에서 유연하게 활용 가능

## Comments



### Comment 33702

- Author: wedding
- Created: 2025-01-21T22:38:06+09:00
- Points: 1

게임 서버랑 통신 할 때 MessagePack을 적용하려고 했는데.. 설명처럼 다양한 환경에서의 유연화가 잘 안되더라구요. 그래서 protobuf 썼습니다.

### Comment 33643

- Author: ifmkl
- Created: 2025-01-20T16:53:22+09:00
- Points: 1

제가 잘 몰라서 그런지는 모르겠는데.. json 대신 크기랑 속도를 위해 hex로 직렬화 할거면.. 그냥 바이너리 직렬화 쓰던 때랑 뭐가 ...다른거죠?

### Comment 33647

- Author: cichol
- Created: 2025-01-20T18:02:49+09:00
- Points: 1
- Parent comment: 33643
- Depth: 1

그냥 바이너리로 뽑으면 그걸 뽑은 언어와 런타임에서만 유효하지만 저런 포맷은 대체로 다른 언어 다른 환경과 주고받는걸 가정하고 만들어집니다

### Comment 33656

- Author: ifmkl
- Created: 2025-01-21T08:10:48+09:00
- Points: 1
- Parent comment: 33647
- Depth: 2

아하. 그렇군요. 답변 감사합니다.
