[Spring 3대 요소] 1 .IoC와 DI
1. 제어의 역전 (Inversion of Control)
- 객체 내부에서 직접 필요한 클래스의 객체를 생성하지 않고 다른 객체에 위임함으로써 객체에 대한 제어권, 즉 프로그램의 흐름을 제 3자에게 넘기는 것을 IoC 모델이라고 한다.
- 이러한 모델을 통해서 객체 지향 프로그램에서는 객체를 캡슐화하고, 높은 응집도와 낮은 결합도를 갖춰 변경에 유연하도록 설계하는 것을 지향한다.
- Spring Framework에서는 IoC Container를 통해서 인스턴스의 생성을 일시적으로 진행하고, 인스턴스의 라이프 사이클까지 위임한다.
IoC Container
- 객체의 생성을 책임지고, 의존성을 관리하는 컨테이너
- Application Context or Bean Factory 를 사용한다.
- Bean Factory
- 실질적 IoC Container
- Bean 등록, 생성, 조회, 반환을 관리
- getBean() 메서드로 bean을 조회한다.
- Application Context
- Application Context는 BeanFactory를 상속받은 Sub-Interface이다.
- Bean Factory와 동일하게 Bean의 등록, 생성, 조회, 반환을 관리한다.
- Spring의 각종 부가서비스를 제공한다.
2. 의존성 주입 (Dependency Injection)
- 프로그래밍에서 의존성이란 두 모듈간의 연결을 말하고, 객체지향 언어에서는 두 클래스간의 관계라고 말하기도 한다.
- 의존관계는 항상 방향성이 있어서 두 객체간 의존관계를 표현할 때
A -> B
처럼 화살표로 표현한다.
- 객체의 제어권을 이전함으로써 결합도를 낮추는 것이 위에서 말한 제어의 역전이다.
- 의존성 주입이란 Spring Framework에서 제공하는 IoC 방식을 좀 더 명확하게 설명하기 위한 용어이다.
- 의존성 주입 방법에는 3가지가 있다.
- Field Injection
- 단일 책임 원칙 위반
- 테스트가 어렵다.
- 불변성을 보장하지 못한다.
- Setter Injection
- Constructor Injection