인프런/스프링핵심원리(기본)

8)★ AppConfig 리팩토링 , 할인정책 변경(구현클래스 변경) , DIP 준수 , OCP 준수 , 배웠던거 전체 흐름 정리

backend dev 2022. 12. 9.

AppConfig 리팩토링

 

기대하는그림

역할과 구현이 깔끔하게 보인다.

수정전 AppConfig

public class AppConfig {

    public MemberService memberService() {
        return new MemberServiceImpl(new MemoryMemberRepository());
    }

    public OrderService orderService() {
        return new OrderServiceImpl(new MemoryMemberRepository(), new RateDiscountPolicy());
    }

}

구현이 잘 안보이고(메모리멤버리포지토리)

오더서비스 구현체 만들때, 멤버서비스 구현체 만들때 메모리멤버리포지토리 생성이 중복이 된다.

그리고 만약 멤버리포지토리 구현체가 바뀌게 된다면 멤버리포지토리 구현체를 적은곳 수만큼 코드수정이 생긴다.

 

Extract Method 단축키

메소드 추출

컨트롤 + 알트 + m

리턴 타입은 구현체가 아닌 인터페이스로 해야한다.

수정후 AppConfig

public class AppConfig {

    public MemberService memberService() {
        return new MemberServiceImpl(MemberRepository());
    }

    private MemberRepository MemberRepository() {
        return new MemoryMemberRepository();
    }

    public OrderService orderService() {
        return new OrderServiceImpl(MemberRepository(), DiscountPolicy());
    }

    private DiscountPolicy DiscountPolicy() {
        return new RateDiscountPolicy();
    }

}

이렇게 수정함으로써

메소드 명과 리턴타입으로 어떤 역할인지 보인다. (구현체가 어떤 역할을 할지) ,

메소드 내용에서 어떤 구현체를 리턴하는지 쉽게 확인할 수 있다.

구현체의 변경이 있을시 수정이 쉽게된다.

ex) 메모리 리포지토리 에서 DB리포지토리로 바꾼다고 했을때 return new DB리포지토리로 단 한줄만수정하면된다.

 

수정전 AppConfig에서는 메모리리포지토리가 사용된곳마다 수정이 있었어야했다.

 

 

 

새로운 할인정책 적용

AppConfig를 추가했고, 아직 새로운 할인정책을 적용하지않은 그림

AppConfig 덕분에 사용영역과 , 객체를 생성하고 구성(환경설정)하는 영역으로 분리됨!

 

할인정책 적용 후 그림

AppConfig를 사용함으로서 쉽게 변경이 가능하다.

 

AppConfig 내부코드 수정해서 할인정책(구현체 변경)

private DiscountPolicy DiscountPolicy() {
    return new RateDiscountPolicy();
}

AppConfig 덕분에 간단하게 수정가능하다. (테스트도 잘 통과)

 

사용영역의 어떤 코드도 변경할 필요없이 구성영역의 코드만 수정 하면된다 

 

DIP 준수, OCP 준수

 

DIP도 준수 (추상화에 의존하고, 구체화에 의존하지않는다 -> AppConfig에서 의존성 주입을 해줘서 추상화에만 의존하면된다. 구현체는 외부에서 의존관계를 주입해줌)

 

OCP도 준수 (확장에는 열려있고 변경에는 닫혀있다 -> 구현체변경을 할때 사용영역의 코드 수정은 없고 구성영역의 코드 수정만 필요하다 ( AppConfig를 사용함으로서)   [클라이언트 코드 수정이 불필요]

 

 

 

 

배웠던거 전체 흐름 정리

 

새로운 할인 정책 개발

다형성 덕분에 새로운 정률 할인 정책 코드를 추가로 개발하는 것 자체는 아무 문제가 없음

(인터페이스를 이용해서 구현클래스를 만들면 되니까 == 다형성 )

 

새로운 할인 정책 적용과 문제점

새로 개발한 정률 할인 정책을 적용하려고 하니 클라이언트 코드인 주문 서비스 구현체도 함께 변경해야함
주문 서비스 클라이언트가 인터페이스인 DiscountPolicy 뿐만 아니라구체 클래스
FixDiscountPolicy 도 함께 의존 DIP 위반

 

 

관심사의 분리

 

AppConfig 리팩토링

 

새로운 구조와 할인 정책 적용

 

 

 

 

 

 

 

댓글