피드로 돌아가기
Dev.toBackend
원문 읽기
DIP 기반 Abstraction 도입을 통한 결합도 제거 및 테스트 가능성 확보
Mastering Design Principles: Dependency Inversion in Kotlin
AI 요약
Context
고수준 비즈니스 로직이 저수준 구현체에 직접 의존하는 Tight Coupling 구조로 인한 시스템 취약성 발생. 외부 API 변경이나 결제 수단 추가 시 기존 코드의 수정이 불가피하며 Unit Test 수행 시 실제 네트워크 호출이 강제되는 한계점 보유.
Technical Solution
- PaymentGateway 인터페이스 정의를 통한 고수준-저수준 모듈 간의 계약 기반 상호작용 설계
- OrderProcessor가 구체 클래스가 아닌 Abstraction에 의존하도록 Dependency Inversion 적용
- Constructor Injection 방식을 통한 런타임 시점에 Concrete Implementation(PayPal, Stripe 등)을 동적으로 주입하는 구조 채택
- 비즈니스 로직과 세부 구현 상세를 분리하여 외부 라이브러리 변경이 내부 로직에 영향을 주지 않는 구조 설계
- Mock implementation 주입 가능 구조를 통한 네트워크 의존성 제거 및 격리된 Unit Test 환경 구축
실천 포인트
1. 클래스 생성자 내에서 `new` 키워드로 직접 구현체를 생성하고 있지는 않은가?
2. 외부 API나 DB 접근 로직을 인터페이스로 추상화하여 교체 가능성을 확보했는가?
3. 테스트 코드 작성 시 Mock 객체 주입이 불가능한 Tight Coupling 지점이 존재하는가?
4. 새로운 기능을 추가할 때 기존 클래스의 코드를 수정해야 하는 OCP 위반 사례가 있는가?