[Go 공식문서 한국어 정리] ①4⑥. JSON-RPC: 인터페이스 이야기
JSON-RPC: 인터페이스 이야기
https://go.dev/blog/json-rpc
Go의 인터페이스를 활용하여 기존 net/rpc 패키지를 Gob에서 JSON으로 쉽게 전환한 사례입니다. 구성(Composition) 지향 설계가 코드를 어떻게 유연하고 확장 가능하게 만드는지 보여줍니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① 서론
표준 라이브러리의 RPC 패키지는 원래 Gob이라는 커스텀 와이어 포맷을 사용했습니다. 특정 애플리케이션에서 JSON을 대체 와이어 포맷으로 사용하고 싶었고, Go의 인터페이스를 활용하여 이를 쉽게 구현했습니다.
② 핵심 개념
1. ServerCodec 인터페이스: 와이어 포맷의 기능을 추상화한 인터페이스입니다.
2. 구성 지향 설계: 상속 대신 인터페이스를 조합하여 기능을 확장합니다.
3. 리팩토링 용이성: 기존 gob.Encoder를 ServerCodec 인터페이스로 교체하는 것만으로 새로운 포맷을 지원합니다.
③ 주요 내용 상세
ServerCodec 인터페이스
type ServerCodec interface {
ReadRequestHeader(*Request) error
ReadRequestBody(interface{}) error
WriteResponse(*Response, interface{}) error
Close() error
}
리팩토링 과정
1. 기존 함수 시그니처에서 gob.Encoder를 ServerCodec 인터페이스로 변경
2. gobServerCodec 래퍼를 작성하여 기존 기능 유지
3. jsonServerCodec을 새로 구현
4. 클라이언트 측도 유사하게 변경
이 모든 작업이 약 20분 만에 완료되었습니다.
상속 vs 구성
Java나 C++에서는 RPC 클래스를 일반화하고 JsonRPC, GobRPC 서브클래스를 만드는 방식을 사용할 것입니다. 하지만 이 방식은 계층 구조와 직교하는 또 다른 일반화(예: 다른 RPC 표준 구현)를 추가하기 어렵습니다. Go의 인터페이스 기반 접근은 개념적으로 더 단순하고 더 적은 코드 변경을 필요로 합니다.
④ 실전 활용
- 새로운 직렬화 포맷(예: MessagePack, Protobuf)을 RPC에 추가할 때 동일한 패턴을 적용할 수 있습니다.
- 인터페이스를 먼저 정의하고 구현을 분리하면 테스트가 용이해집니다.
- 기존 코드를 변경하지 않고도 새로운 기능을 추가할 수 있습니다(개방-폐쇄 원칙).
- Go의 인터페이스는 암묵적 구현(implicit interface)이므로 기존 타입에 대한 어댑터를 쉽게 작성할 수 있습니다.
⑤ 정리
Go의 가벼운 구성 지향 타입 시스템은 코드를 쉽게 적응시키고 깔끔하게 유지할 수 있는 수단을 제공합니다. 인터페이스를 활용하면 상속 계층의 복잡성 없이도 기능을 유연하게 확장할 수 있습니다. 이 사례는 Go의 인터페이스가 실제 리팩토링에서 어떤 힘을 발휘하는지 보여주는 좋은 예입니다.
#Go #Golang #JSONRPC #Interface #인터페이스 #리팩토링 #구성 #Composition #공식문서

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