[Spring] AppConfig

안지현·2024년 2월 7일
0

Spring

목록 보기
1/1

[인프런 스프링 핵심 원리 - 기본편 참고]

AppConfig

애플리케이션의 전체 동작 방식을 구성(config) 하기 위해, 구현 객체를 생성하고, 연결하는 책임을 가지는 별도의 책임 클래스

public class OrderServiceImpl implements OrderService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();
    private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
}

기존에 작성된 코드

  • FixDiscountPolicy에서 RateDiscountPolicy로 변경하기 의해서 OrderServiceImpl의 소스 코드도 함께 변경해야 한다.
    -> OCP 위반
  • 클라이언트 코드인 OrderServiceImplDiscountPolicy의 인터페이스 뿐만 아니라 구체 클래스(FixDiscountPolicy)도 함께 의존하고 있다.
    그래서 구체 클래스를 변경할 때 클라이언트 코드도 함께 변경해야 한다.
    -> DIP 위반. 추상에만 의존하도록 변경할 필요가 있다.(인터페이스에만 의존)

관심사를 분리하자

AppConfig를 사용하여 DIP,OCP를 위반하지 않게 할 수 있다.
AppConfig.java

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

    public OrderService orderService(){
        return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
    }
    public
}
  • AppConfig는 애플리케이션의 실제 동작에 필요한 구현 객체를 생성한다.
  • MemberServiceImpl
  • MemoryMemberRepository
  • OrderServiceImpl
  • FixDiscountPolicy
  • AppConfig는 생성한 객체 인스턴스의 참조(레퍼런스)를 생성자를 통해서 주입(연결) 한다.

OrderServiceImpl.java

public class OrderServiceImpl implements OrderService {
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
}
  • MemberServiceImpl은 구현체에 의존하지 않는다. -> DIP 지킴
  • MemberServiceImpl은 의존관계에 대한 고민은 외부에 맡기고 실행에만 집중하면 된다.

AppConfig 실행

OrderApp.java

public class OrderApp {
    public static void main(String[] args) {
        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        OrderService orderService = appConfig.orderService();

        //MemberService memberService = new MemberServiceImpl();
        //OrderService orderService = new OrderServiceImpl();

        Long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);

        Order order = orderService.createOrder(memberId, "itemA", 10000);

        System.out.println("order = " + order);
    }
}

0개의 댓글