https://github.com/jin-hyojoo/study_spring
관심사의 분리
APP이 하나의 드라마일 때, 각 인터페이스를 배역이라 생각하면 배우 선택은 누가?
착남 서은기, 강마루역을 누가 할지는 배우들이 정하는게 아닌데 아래 예제는 서은기 역할(인터페이스)의 문채원(구현체)이 강마루 역에 송중기를 직접 캐스팅하는 것과 동일. 배우 문채원에게 다양한 책임 존재
OrderSerivceImpl.java
private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); // 서은기역 문채원
private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); // 강마루역 송중기
따라서 관심사 분리가 필요!
- 문채원은 강마루역에 누가 캐스팅 됐든 똑같이 연기할 수 있어야 함
- 드라마 구성, 담당배우 섭외, 캐스팅 책임을 담당하는 별도의 기획자 필요
- 기획자를 만들어 배우/기획자의 책임을 확실히 분리하자
<aside> 💡 AppConfig 등장
app의 전체동작 방식을 구성하기 위해, 구현객체를 생성하고 연결하는 책임을 가지는 별도의 설정 클래스를 만들자
</aside>
예시)
MemberServiceImpl에선 추상화에만 의존하고 어떤 구현 객체를 주입할지는 오직 외부 AppConfig에서 결정 ⇒ MemberServiceImpl은 고민(about 의존 관계) 외부에 맡기고 오직 실행에만 집중 ⇒ 제어의 역전 달성 (IoC_Inversion of Control)
MemberServiceImpl.java
// 추상화에만 의존
private final MemberRepository memberRepository;
// 생성자 (생성자 주입)
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// ** DIP 완성 '~'
AppConfig.java
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
// 어떤 구현객체를 주입할지(연결)
@Bean
public static MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
IoC, DI, 컨테이너
프레임워크 Vs 라이브러리
2가지로 분리해서 생각해야 할 의존관계
정적인 클래스 의존관계
실행시점에 결정되는 동적객체(인스턴스) 의존관계
정적인 클래스 의존관계 클래스가 사용하는 import 코드로 의존관계 쉽게 판단 App 실행하지 않고도 분석 가능

정적인 클래스 의존관계 클래스 다이어그램
⇒ 어떤 객체가 OrderServiceImpl에 주입 될지 알 수 X
동적 객체(인스턴스) 의존관계 ⇒ 실행시점에 결정되는

객체 다이어그램
*️⃣ 의존관계 주입
⇒ 클라이언트 코드 변경 없이 클라이언트 호출 대상의 타입 인스턴스 변경 가능 ⇒ 정적클래스 의존관계 변경 없이 동적 객체 인스턴스의 손쉬운 의존관계 변경 가능
스프링 전환