programming study/B-Spring

SOLID 원칙 적용

gu9gu 2022. 9. 29. 16:15

SOLID 원칙 적용 안된 예시

클라이언트 객체가 추상화된 인터페이스뿐만 아니라 구현 클래스도 의존하고 있는 상황. -> DIP 위반, SRP 위반

기능 추가시 클라이언트에서 구현클래스 사용부분을 새로운 구현 클래스로 갈아 끼워야 해서 클라이언트 객체도 수정해야함. -> OCP 위반

OrderServiceImpl.java에서 FixDiscountPolicy 부분을 주석처리하고  RateDisCountPolicy 구현체를 사용하도록 수정해야함

// DiscountPolicy disCountPolicy = new FixDiscountPolicy();

DiscountPolicy disCountPolicy = new RateDiscountPolicy();  

 

SOLID 원칙 적용 예시

클라이언트 객체에 있던 구현클래스를 생성하는 부분을 따로 분리하면 SRP를 지키고

클라이언트 객체는 인터페이스만을 의존하게 해서 DIP 위반을 하지 않게하고

기능 추가시 클라이언트 객체는 변경하지 않고 구현클래스 생성 부분만 변경하면 되므로 OCP위반도 하지 않게 된다.

OrderServiceImpl.java  ( 클라이언트 클래스)

       수정 없음

DiscountPolicy disCountPolicy;

public OrderServiceImpl(DiscountPolicy disCountPolicy) {

   this.disCountPolicy = disCountPolicy;

}

public Order createOrder(.......) {

   ...

  disCountPolicy.discount();  // 외부에서 주입해준 객체를 사용함.

   ....

}

 

AppConfig.java ( 구현체 생성하는 기능을 담당하는 클래스)

        설정부분을 수정

        //return new FixDiscountPolicy();
        return new RateDiscountPolicy(); 

public class AppConfig {

    // 각 인터페이스별 구현체를 한눈에 볼 수 있음.
    public MemberService memberService() {
        return new MemberServiceImpl(getMemberRepository());
    }

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

    public OrderService orderService() {
        return new OrderServiceImpl(getMemberRepository(), getDiscountPolicy());
    }

    private DiscountPolicy getDiscountPolicy() {
        //return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}

 

OrderApp.java ( 사용처 )

AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
OrderService orderService = appConfig.orderService();

Order oder = orderService.createOrder(memberId, "itemA", 20000);