본문 바로가기
Spring/Basic

AppConfig의 관심사 분리

by JHyun0302 2023. 8. 1.
728x90

[본 포스팅은 인프런 스프링 핵심 원리 - 기본 편을 기반으로 작성하였습니다.]

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com

 

 

 

 

객체지향 코딩을 위해서는 SOILD 5가지 원칙을 준수해야 한다.

 

문제 상황

- 현재 사용 중인 FixDiscountPolicy() 메서드를 RateDiscountPolicy()로 변경하고자 할 때 OrderServcieImpl 코드를 수정해야한다.

 

public class OrderServiceImpl implements OrderService {
  //    private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
      private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
  }

 

즉, OCP, DIP를 위반했다.

OCP: 코드를 확장해서 변경하면 위의 코드에 영향이 미친다.

DIP: 추상(인터페이스)와 구체(구현) 클래스 모두 의존함.

 

 

문제 상황 의존 관계

 

 

 

해결 방법: 관심사의 분리(AppConfig)

인터페이스에만 의존하도록 설계

 

수정된 OrderServiceImpl: 여기서는 추상(인터페이스) 클래스만 사용한다.

public class OrderServiceImpl implements OrderService {
      //private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
      private DiscountPolicy discountPolicy;
}
 

 

AppConfig: 각각의 return 값에서 새로운 인스턴스를 생성함과 동시에 어떤 구현(구체) 클래스를 사용할지 결정한다.

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

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

 

 

결론

orderServiceImpl은 자신의 로직만 돌릴 뿐 자신이 어떤 구체 클래스를 사용할지 모른다.

이렇듯 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)라 한다.

추가적으로 AppConfig 처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 IoC 컨테이너 또는 DI 컨테이너라 한다.

 

반응형

'Spring > Basic' 카테고리의 다른 글

빈 생명주기 콜백  (0) 2023.08.02
조회 대상 빈이 2개 이상 - 문제  (0) 2023.08.02
롬복과 최신 트랜드  (0) 2023.08.02
의존관계 자동 주입  (0) 2023.08.02
왜 싱글톤 패턴을 이용하는가?  (0) 2023.08.02