새로운 할인 정책 개발
정률 할인 정책 : 10%로 지정
새로운 할인 정책 적용과 문제점
할인 정책을 고정에서 정률로 변경하려면
>> 클라이언트인 OrderServiceImpl 코드를 고쳐야 함
역할과 구현을 분리 : Good
다형성 활용, 인터페이스와 구현 객체 분리 : Good
DIP : 주문서비스 클라이언트가 인터페이스에 의존하면서 DIP를 지킨 것 같지만
>> 추상(인터페이스) 뿐만 아니라 구체(구현) 클래스에도 의존
OCP : 위반
>> 기능을 확장해서 변경하면 클라이언트 코드에 영향을 줌
해결을 위해
인터페이스에만 의존하도록 코드 변경
하지만 구현체가 없는데 어떻게 코드 실행?
>> NPE(Null Pointer Exception) 발생
누군가가 클라이언트인 OrderServiceImpl에 DiscountPolicy의 구현 객체를
>> 대신 생성하고 주입해주어야 함
AppConfig 등장
구현 객체를 생성하고 연결하는 별도의 설정 클래스
MemberServiceImpl은 MemoryMemberRepository를 의존하지 않고 MemberRepository 인터페이스만 의존
생성자를 통해 어떤 구현 객체가 주입될지 알 수 없음
>> 오직 외부(AppConfig)에서 결정
MemberServiceImple은 이제 의존관계에 대한 고민은 외부에 맡기고 실행에만 집중
클래스 다이어그램
객체의 생성과 연결은 AppConfig가 담당
DIP 완성 : MemberServiceImpl은 추상에만 의존, 구체 클래스 몰라도 됨
관심사의 분리 : 객체를 생성하고 연겨하는 역할과 실행하는 역할이 명확히 분리
회원 객체 인스턴스 다이어그램
appConfig 객체는 memoryMemberRepository 객체를 생성하고
>> 참조값을 memberServiceImpl을 생성하면서 생성자로 전달
클라이언트 입장에서 의존관계를 마치 외부에서 주입해주는 것 같음
>> DI(Dependency Injection) 의존관계 주입, 의존성 주입
AppConfig 리팩토링
현재 중복이 있고, 역할에 따른 구현이 잘 안보임
애플리케이션 전체 구성이 어떻게 되어있는지 빠르게 파악 가능
새로운 구조와 할인 정책 적용
AppConfig의 등장으로 애플리케이션이
>> 사용 영역과 객체를 생성하고 구성하는 영역으로 분리
할인 정책을 변경해도 구성 역할을 담당하는 AppConfig만 변경하면 됨
출처 : 김영한, 스프링 핵심 원리 - 기본편
'Spring' 카테고리의 다른 글
Spring / 싱글톤 컨테이너 (0) | 2025.03.23 |
---|---|
Spring / 스프링 컨테이너와 빈 (0) | 2025.03.23 |
Spring / 비즈니스 요구사항 예제 (0) | 2025.03.22 |
Spring / 객체 지향 설계와 스프링 (0) | 2025.03.21 |
Spring / AOP (0) | 2025.03.19 |