[Go 공식문서 한국어 정리] ①4③. Gob 데이터 인코딩
Gob 데이터 인코딩
https://go.dev/blog/gob
Gob은 Go 프로그램 간 데이터를 전송하거나 저장하기 위한 고속 바이너리 인코딩 포맷입니다. JSON이나 XML과 달리 Go에 최적화되어 있어 사용이 간편하고 효율적입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① 서론
네트워크나 파일을 통해 데이터 구조를 전송하려면 인코딩과 디코딩이 필요합니다. Go는 JSON, XML, Protocol Buffers 등을 지원하지만, Go 전용 환경에서는 더 쉽고 효율적인 Gob을 사용할 수 있습니다.
② 핵심 개념
1. 사용 용이성: Go의 리플렉션을 활용하여 별도의 IDL이나 프로토콜 컴파일러가 필요 없습니다. 데이터 구조 자체가 인코딩/디코딩 방법을 결정합니다.
2. 효율성: 텍스트 기반(XML, JSON)보다 바이너리 인코딩이 더 빠릅니다.
3. 자체 기술(Self-describing): 스트림 처음부터 읽으면 내용을 사전에 몰라도 파싱할 수 있습니다.
4. 크기 없는 정수: int8이든 int64이든 값이 같으면 동일한 비트로 전송됩니다. 수신자는 자신의 변수 타입에 맞게 저장합니다.
③ 주요 내용 상세
Protocol Buffers와의 차이
- Gob은 최상위에서도 정수나 배열을 직접 인코딩할 수 있습니다(struct만 가능한 PB와 달리).
- required 필드가 없어 유지보수가 쉽습니다.
- 기본값(default) 개념이 없습니다. Go의 제로값 규칙을 따릅니다.
구조체 확장성
인코더가 별낸 필드만 전송합니다. 수신자의 구조체에 없는 필드는 무시되고, 수신자 구조체에만 있는 필드는 제로값으로 남습니다. 이를 통해 타입이 진화핟도 하위 호환성이 유지됩니다.
포인터 처리
전송 전 모든 포인터가 평탄화됩니다. int8, *int8, **int8 등 모두 동일하게 정수 값으로 전송되며, 수신자가 원하는 포인터 깊이로 복원합니다.
타입 전송
처음 타입을 전송할 때 타입 설명을 별낸 후 고유 번호를 부여합니다. 이후 동일 타입은 번호로 참조하여 효율성을 높입니다.
고속 인코딩
첫 인코딩 시 해당 타입에 특화된 인터프리터 기계를 빌드합니다. 이후 동일 타입은 이미 빌드된 기계를 사용하여 리플렉션 없이 고속으로 처리합니다.
커스텀 인코딩
GobEncoder와 GobDecoder 인터페이스를 구현하면 사용자 정의 인코딩/디코딩 로직을 적용할 수 있습니다.
④ 실전 활용
- 두 Go 서버 간 RPC 통신 시 Gob을 사용하면 효율적입니다.
- 파일에 데이터를 저장할 때 Gob을 사용하면 타입 정보가 포함되어 나중에 쉽게 디코딩할 수 있습니다.
- net/rpc 패키지는 Gob을 기반으로 메서드 호출을 네트워크로 전송합니다.
- JSON보다 빠른 직렬화가 필요할 때 Gob을 고려합니다.
⑤ 정리
Gob은 Go 프로그램 간 데이터 교환을 위한 최적의 바이너리 인코딩입니다. 사용이 간편하고, 자체 기술적이며, 타입 진화에 유연합니다. Go 전용 시스템에서 데이터 전송이나 저장이 필요할 때 Gob을 적극 활용하세요.
#Go #Golang #Gob #인코딩 #직렬화 #바이너리 #RPC #공식문서

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30