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