프레임워크와 라이브러리
- 프레임워크
- 내가 작성한 코드를 제어하고, 대신 실행하면 프레임워크다.
- 라이브러리
- 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 그것은 라이브러리다.
IOC
DI
- 의존성 주입 -> 의존성을 주입 받는다.
- Dependency + Injection 도 있는 구조
- 내가 Control은 하지만 관리하는 컨테이너에서 받아(Inversion) 사용해야 함
- 의존 관계 주입, Dependency Injection
- 의존 관계는 정적인 클래스 의존 관계와, 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계 둘을 불리해서 생각해야 한다.
- 아래 코드를 보면 OrderServiceImpl 은 memberRepository 와 discountPolicy 에 의존한다는 것을 알 수 있지만 실제로 어떤 객체가 OrderServiceImpl에 주입될지는 모른다.
- 정적인 클래스 의존 관계
- 클래스가 사용하는 import 코드만 보고 의존 관계를 쉽게 판단할 수 있다.
- 동적인 객체 의존 관계
- 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존 관계
- 실행 시점(런타임) 에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존 관계가 연결되는 것을 의존 관계 주입이라 한다.
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
IOC 컨테이너, DI 컨테이너
- 객체를 생성하고 관리하면서 의존관계를 연결해주는 역할!
스프링 컨테이너
스프링 빈
회고
- IOC, DI 많이 들어는 봤는데 너무 추상적 느낌이 강했었다. 그런데 IOC는 DI를 통해 발생하는 추상적인 개념일 뿐이라 추상적인 느낌이 드는 게 당연한 단어였던 거 같다. 하지만 DI는 전보다 좀 더 알겠다. 스프링 컨테이너 안에 스프링 빈으로 불리는 객체들이 들어있고, 스프링이 대신해서 의존 관계를 주입해준다. 그 덕분에 확장에는 열려 있고 기존 코드의 변경에는 닫혀 있게 만들어주는 것이다.