Back End/gRPC
gRPC Unary 와 REST API 속도 차이 (1) - 직렬화, 역직렬화
DevPing9_
2025. 7. 17. 10:13
직렬화 포맷 (Protocol Buffers vs JSON)
조금만 검색해보아도 gRPC 는 데이터 직렬화를 바이너리로 하니 더 빠르다는 정보를 찾을 수 있다.
JSON 도 직렬화하면 바이너리로 변환되는데 무슨 차이점이 있을까?
그래서, 정확히 어떤 방식으로 데이터가 직렬화 되기에 페이로드가 짧아지는지 알아보자.
JSON 직렬화
JSON 문자열을 바이너리로 바꾼다는 건, 해당 문자열을 UTF-8 바이트 시퀀스로 변환하는 것을 말한다.
{
"name": "Alice",
"age": 30
}
위 데이터를 바이트 시퀀스(16진수)로 직렬화하면
7b 22 6e 61 6d 65 22 3a 22 41 6c 69 63 65 22 2c 22 61 67 65 22 3a 33 30 7d
총 25 bytes
| JSON 문자열 | 바이트 |
| { | 7b |
| "name": | 22 6e 61 6d 65 22 3a |
| "Alice" | 22 41 6c 69 63 65 22 |
| , | 2c |
| "age": | 22 61 67 65 22 3a |
| 30 | 33 30 |
| } | 7d |
Protobuf 직렬화
미리 정의된 스키마를 기반으로 필드 번호와 타입, 값만 이진 규격에 맞게 바이트 시퀀스로 변환한다.
message Person {
string name = 1;
int32 age = 2;
}
위 데이터를 바이트 시퀀스(16진수)로 직렬화하면
0a 05 41 6c 69 63 65 10 1e
총 9 bytes
| Protobuf 직렬화 | 바이트 |
| field 1 (name), wire type 2 | 0a |
| 문자열 길이 5 | 05 |
| 'A' 'l' 'i' 'c' 'e' (ASCII) | 41 6c 69 63 65 |
| field 2 (age), wire type 0 | 10 |
| 숫자 30 (varint 인코딩) | 1e |
직렬화 비교
| JSON 문자열 | 바이트 | Protobuf 직렬화 | 바이트 |
| { | 7b | ||
| "name": | 22 6e 61 6d 65 22 3a | field 1 (name), wire type 2 | 0a |
| "Alice" | 22 41 6c 69 63 65 22 | 'A' 'l' 'i' 'c' 'e' (ASCII) | 41 6c 69 63 65 |
| , | 2c | ||
| "age": | 22 61 67 65 22 3a | field 2 (age), wire type 0 | 10 |
| 30 | 33 30 | 숫자 30 (varint 인코딩) | 1e |
| } | 7d |
728x90