피드로 돌아가기
Composition over Inheritance in Go: The Design Choice That Makes Microservices Boring in the Best Way
Dev.toDev.to
Backend

Hierarchy를 배제한 Composition 기반 설계로 Microservices 유지보수성 극대화

Composition over Inheritance in Go: The Design Choice That Makes Microservices Boring in the Best Way

amir2026년 5월 21일25intermediate

Context

전통적인 OOP의 Inheritance 구조는 클래스 계층 심화에 따른 강한 결합(Tight Coupling)을 유발함. 특히 비즈니스 요구사항 변경 시 상위 클래스의 수정이 하위 모든 타입에 영향을 주는 Side Effect와 불필요한 기능 상속 문제가 병목으로 작용함.

Technical Solution

  • Taxonomy 기반의 계층 구조 대신 객체가 수행해야 할 행위 중심의 Capability 모델링 채택
  • Struct Embedding을 통한 데이터와 메서드의 명시적 조합으로 Inheritance의 코드 재사용성 확보
  • Implicit Contract 기반의 Interface 설계를 통해 타입 간 의존성을 최소화하고 결합도 분리
  • Dependency Injection 패턴을 활용하여 Logger, Repository 등 필요한 구성 요소를 외부에서 주입하는 구조 설계
  • context.Context 전파를 통한 Concurrency 및 Cancellation 제어를 아키텍처 레벨에서 표준화
  • 작은 단위의 Capability 인터페이스를 연결하여 복잡한 Saga Workflow 및 Outbox 패턴을 유연하게 구현

- 상속 계층을 설계하기 전, 해당 기능이 여러 타입에서 공통적으로 필요한 'Capability'인지 검토 - Interface를 정의할 때 메서드 개수를 최소화하여 구현체의 부담을 줄이고 재사용성 향상 - 클래스 계층 구조가 복잡해지는 시점에 Composition으로 전환하여 의존성 그래프를 단순화 - 명시적인 주입(Injection)을 통해 객체 간의 관계를 가시화하고 테스트 가능성 확보

원문 읽기