[Go 공식문서 한국어 정리] ⓪13. JSON-RPC와 인터페이스
[Go 공식문서 한국어 정리] ⓪13. JSON-RPC와 인터페이스
원문 제목: JSON-RPC: a tale of interfaces
작성자: Andrew Gerrand
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Go의 인터페이스(interface)는 기존 코드를 리팩토링하여 더 유연하고 확장 가능하게 만드는 데 강력한 도구입니다.
이 글은 표준 라이브러리의 RPC 패키지를 gob에서 JSON으로 확장한 실제 사례를 보여줍니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 2. 핵심 개념
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① 인터페이스로 와이어 포맷 추상화
ServerCodec 인터페이스를 정의하여 gob.Encoder 대신 인터페이스를 받도록 변경합니다.
ReadRequestHeader, ReadRequestBody, WriteResponse, Close 메서드로 코덱 기능을 추상화합니다.
② 기존 코드의 최소 변경
낶부 함수 시그니처를 gob.Encoder에서 ServerCodec 인터페이스로 변경하는 것만으로 확장이 가능합니다.
sendResponse 함수의 인자 타입을 인터페이스로 바꾸면 기존 기능은 래퍼로 유지하면서 새 포맷을 추가할 수 있습니다.
③ 상속 vs 구성
Java나 C++에서는 JsonRPC와 GobRPC 서브클ㄹ래스를 만들어야 합니다.
Go에서는 인터페이스를 통해 계층 구조 없이 독립적인 일반화가 가능합니다.
이는 개념적으로 더 단순하고 코드 변경량도 적습니다.
④ 유지보수성
인터페이스 기반 설계는 요구사항 변경에 쉽게 적응할 수 있습니다.
Go의 가벼운 구성 중심 타입 시스템은 코드베이스의 확장성을 제공합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원래 net/rpc 패키지는 gob라는 커스텀 와이어 포맷을 사용했습니다.
JSON을 대체 포맷으로 사용하고 싶었을 때, 인터페이스를 활용하여 약 20분 만에 리팩토링을 완료했습니다.
type ServerCodec interface {
ReadRequestHeader(*Request) error
ReadRequestBody(interface{}) error
WriteResponse(*Response, interface{}) error
Close() error
}
서버 측에서 기존 함수를 변경했습니다:
func sendResponse(sending *sync.Mutex, req *Request,
reply interface{}, enc *gob.Encoder, errmsg string)
→
func sendResponse(sending *sync.Mutex, req *Request,
reply interface{}, enc ServerCodec, errmsg string)
gobServerCodec 래퍼를 작성하여 기존 기능을 복원하고,
jsonServerCodec을 추가하여 JSON 지원을 구현했습니다.
클ㄹ라이언트 측도 유사한 변경을 거쳤으며,
최종 변경셋은 놀랍도록 작았습니다.
상속 중심 언어에서는 RPC 클래스를 일반화하고 서브클ㄹ래스를 만드는 것이 일반적입니다.
하지만 이 방식은 계층 구조에 직교하는 추가 일반화를 하기 어렵습니다.
Go의 인터페이스는 이런 문제를 우아하게 해결합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 4. 실전 활용 / 예시
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
API 게이트웨이에서 다양한 직렬화 포맷(JSON, MessagePack, Protobuf)을 지원해야 할 때,
인터페이스 기반 코덱 설계를 적용하면 각 포맷을 독립적으로 추가할 수 있습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Go의 인터페이스는 코드 변경 없이 새로운 기능을 끼워 넣을 수 있는 강력한 메커니즘입니다.
상속 대신 구성(composition)을 통해 유연하고 유지보수 가능한 시스템을 구축할 수 있습니다.
이 사례는 20분 만에 RPC 패키지를 JSON을 지원하도록 확장한 실제 경험을 보여줍니다.
📎 출처 링크
https://go.dev/blog/json-rpc
#Go #Golang #JSONRPC #interface #공식문서

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