-
gRPC Unary 와 REST API 속도 차이 (1) - 직렬화, 역직렬화Back End/gRPC 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