IoC(Inversion of Control)
- 제어의 역행
- 객체지향 언어에서 Object간의 연결 관계를 런타임에 결정
- 객체 간의 관계가 느슨하게 연결됨(Loose Coupling)
- IoC의 구현 방법 중 하나가 DI
Dependency Lookup
- 컨테이너가 lookup context를 통해 필요한 리소스나 객체를 얻는 방식
- Lookup한 객체를 필요한 타입으로 캐스팅 해줘야 한다.
- Naming Exception을 처리하기 위한 로직이 필요
Dependency Injection
- 객체에 lookup 코드를 사용하지 않고 컨테이너가 직접 의존 구조를 객체에 설정하는 방식
- 객체가 컨테이너의 존재여부를 알 필요가 없다
- Setter Injection과 Contructor Inject
Container
Container?
- 객체의 생성, 소멸, 사용에 해당하는 라이프사이클 담당
- 라이프사이클을 기본으로 애플리케이션 사용에 필요한 주요 기능을 제공해준다.
Container 기능
- 라이프사이클 관리
- Dependency 객체 제공
- 스레드 관리
- 기타 애플리케이션 실행에 필요한 환경
Container 필요성
- 비즈니스 로직 외 부가적인 기능들에 대해서는 독립적으로 관리되도록 하기 위함이다.
- 일관성
- 서비스 객체를 사용하기 위해 각각 Factory 또는 싱클톤 패턴을 직접 구현하지 않아도 된다.
Ioc Container
- 객체의 생성과 관계설정, 사용, 제거 등의 작업을 독립된 컨테이너가 담당
- 컨테이너가 코드 대신 객체에 대한 제어권을 갖고 있어 IoC라고 부른다.
Spring DI Container
- Spring DI Container가 관리하는 객체를 빈(Bean)이라 하고, 이 객체들의 라이프사이클을 관리하는 의미로 BeanFactory라 한다.
- BeanFactory에 여러가지 컨테이너 기능을 추가한 것은 ApplicationContext라 한다.