본문 바로가기
Java

[Java] 의존관계 주입과 OCP, DIP 준수하기 (feat. Config)

by happyhelen 2021. 11. 20.

 

** 공유가 아닌 개인 공부에 목적을 둔 글입니다

** 설명이 불충분할 수 있으며 잘 정리된 글이 아닐 수도 있습니다

 

 

 

이전에 공부했던 DI 를 이번에는 예제로써 이해도를 높였다

 

2021.08.28 - [Spring] - [Spring] DI : Dependency Injection

 

[Spring] DI : Dependency Injection

DI 를 사용하는 이유와 생성자 주입을 선호하는 이유는 여러가지가 있지만 본 예제에서 DI 사용 이유는 테스트 코드를 작성함에 있어 MemoryMemberRepository() 의 객체 생성이 MemberSerivice 와 MemberSeriviceT

programming-hyerim.tistory.com

 

 

 

위 코드에서 MemberRepository 나 FixDiscountPolicy 를 다른 저장소 혹은 다른 할인 정책으로 바꾸기 원한다면

 

아래와 같이 OrderServiceImpl 클라이언트의 코드를 변경하는 것이 불가피하다 = OCP 위반

 

즉, OrderServiceImpl 클라이언트가 MemberRepository 인터페이스에만 의존하는 것이 아니라

 

MemberRepository 인터페이스와 MemoryMemberRepository 클래스 둘 다에 의존하고 있으며,

 

DiscountPolicy 인터페이스와 FixDiscountPolicy 도 마찬가지이다 = DIP 위반

 


 

우선 인터페이스만을 의존하게 코드를 수정하고 생성자를 만들어주자 = DIP 준수

 

클라이언트가 인터페이스에만 의존하는 DIP 를 지킨 상태

이제 클라이언트에 존재하지 않는 구현객체를 만들어주기 위해

 

인터페이스의 구현객체를 생성하고 연결하면서 관리해 줄 AppConfig 클래스를 따로 만든다

 

AppConfig

 

OrderService 메소드를 통해 OrderServiceImpl 을 생성 및 리턴하면서 MemoryMemberRepository, FixDiscountPolicy 를

 

생성해 파라미터로 넘겨준다

 

이렇게 하면 변경사항이 생겼을 때 직접 클라이언트 클래스를 건드리지 않고 AppConfig 클래스만으로 

 

변경사항을 반영할 수 있다 = OCP 준수

 


 

같은 방식으로 MemberServiceImpl 도 수정해주자

 

수정 전

 


 

 

수정 후
AppConfig

'Java' 카테고리의 다른 글

[Java] 기술면접  (0) 2024.04.03
[Java] Collections(2-1)_Map 반복문 도는 여러방식  (0) 2021.11.03
[Java] DTO (Data transfer Object) 란?  (0) 2021.09.13
[Java] StringTokenizer  (0) 2021.08.26
[Java] Collections(2)_Map 인터페이스  (0) 2021.08.24