피드로 돌아가기
Dev.toBackend
원문 읽기
Go Embedding의 오해 해결을 통한 런타임 버그 및 Observability 누수 방지
Go's Embedding Isn't Inheritance. Stop Treating It Like It Is
AI 요약
Context
Java/C# 등 OOP 언어의 상속 개념을 Go의 Embedding에 투영하여 발생한 설계 오류 분석. 구조적 포함(Composition)을 상속으로 오해하여 Virtual Dispatch와 Super Chain의 부재로 인한 논리적 결함 발생.
Technical Solution
- Name Promotion 기반의 단순 필드/메서드 노출 메커니즘을 통한 상속적 외형 구현
- Virtual Dispatch 부재로 인한 내부 메서드 호출 시 외곽 타입이 아닌 임베디드 타입의 메서드가 실행되는 문제 식별
- Shadowing 발생 시 기본 동작이 확장(Extend)이 아닌 대체(Replace)임을 명시하여 명시적 필드 호출 방식으로 수정
- 인터페이스를 통한 Dynamic Dispatch 설계를 도입하여 외곽 타입의 구체적 동작을 런타임에 결정하도록 구조 변경
- API 표면의 의도치 않은 노출을 방지하기 위해 Embedding 대신 명시적 필드 정의(Hidden Composition) 적용
실천 포인트
- Embedding된 타입의 메서드를 외곽 타입에서 오버라이드한 후, 내부 호출 시 기대하는 동작이 일치하는지 검증 - 부모 메서드 기능을 유지하며 확장해야 하는 경우 `o.Embedded.Foo()` 형태의 명시적 호출 여부 확인 - 외부 API에 노출하고 싶지 않은 메서드가 Embedding을 통해 Public surface에 포함되었는지 점검 - 다형적 행위가 필요한 지점에 Embedding 대신 Interface를 사용했는지 검토