1.5 스프링의 IoC
스프링의 핵심
- 빈 팩토리 또는 애플리케이션 컨텍스트
- DaoFactory가 하는 일을 일반화한 것
1.5.1 오브젝트 팩토리를 이용한 스프링의 IoC
애플리케이션 컨텍스트와 설정정보
빈(Bean)
- 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
- 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 IoC가 적용된 오브젝트
빈 팩토리(Bean Factory)
- 빈의 생성과 관계설정 등의 제어를 담당하는 IoC 오브젝트
- 애플리케이션 컨텍스트(Application Context) : IoC 방식을 따라 만들어진 일종의 빈 팩토리
- 빈 팩토리와 애플리케이션 컨텍스트는 동일하다고 봐도 무방
- 설계도 : 애플리케이션 컨텍스트와 그 설정정보
DaoFactory를 사용하는 애플리케이션 컨텍스트
DaoFactory를 스프링의 빈 팩토리가 사용할 수 있는 설정정보로 변경하기
- @Configuration : 빈 팩토리를 위한 오브젝트 설정하는 담당하는 클래스라고 인식시킴
- @Bean : 오브젝트를 생성하는 메소드
DaoFactory.class
@Configuration // 애플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정정보라는 표시
public class DaoFactory {
@Bean // 오브젝트 생성을 담담하는 IoC용 메소드라는 표시
public UserDao userDao() {
return new UserDao(connectionMaker());
}
@Bean
public ConnectionMaker connectionMaker() {
return new DConnectionMaker();
}
}
애플리케이션 컨텍스트 만들기
- ApplicationContext 타입의 오브젝트
- AnnotationConfigApplicationContext : @Configuration이 붙은 자바 코드를 사용
- 생성자 파라미터 : DaoFactory 클래스
- getBean() : UserDao의 오브젝트를 가져옴
UserDaoTest.class
public class UserDaoTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException{
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao dao = context.getBean("userDao", UserDao.class);
// ...
}
}
getBean("Bean Name", Return Type)
- ApplicationContext가 관리하는 오브젝트를 요청하는 메소드
- "userDao" : ApplicationContext에 등록된 빈의 이름 (메소드의 이름)
- 이름을 사용하는 이유 : UserDao 생성 방식이나 구성을 다양하게 할 수 있음
- ex) getBean("specialUserDao", UserDao.class)
- 리턴 타입이 Object이므로 두 번째 파라미터에 리턴 타입을 주면 깔끔해진다.
1.5.2 애플리케이션 컨텍스트의 동작방식
오브젝트 팩토리 vs 스프링 애플리케이션 컨텍스트
오브젝트 팩토리 | 애플리케이션 컨텍스트 |
---|---|
- | IoC컨테이너 = 스프링컨테이너 = 빈 팩토리 |
UserDao등 Dao오브젝트를 생성하고 관계를 맺어줌 | 애플리케이션 내 IoC를 적용하여 관리할 모든 오브젝트에 대한 생성과 관계설정을 담당 |
오브젝트를 생성하고 관계를 맺는 직접적인 코드가 존재 | 해당 코드는 없고, 정보를 별도의 설정정보를 통해 얻음. 때로는 외부 오브젝트 팩토리에 그 작업을 위임하기도 함 |
애플리케이션 컨텍스트 작동방식
- 애플리케이션 컨텍스트 : DaoFactory 클래스를 설정정보로 등록
- 애플리케이션 컨텍스트 : @Bean이 붙은 메소드의 이름을 가져와 빈 목록을 만들어 둠
- 클라이언트 : getBean() 메소드 호출
- 애플리케이션 컨텍스트 : 빈 목록에 해당 요청이 있는지 확인
- 애플리케이션 컨텍스트 : 있으면 빈 생성 메소드 호출하여 오브젝트 생성 후 돌려줌
애플리케이션 컨테스트 사용 시 장점
- 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
- 오브젝트 팩토리가 아무리 많아져도 이를 알아야하거나 직접 사용할 필요가 없다. (확장에 유연)
- 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공한다.
- 오브젝트의 생성과 다른 오브젝트와의 관계 설정
- 오브젝트의 생성 방식, 시점, 전략의 설정
- 자동 생성, 후처리, 정보의 조합, 설정 방식의 다변화, 인터셉터 등 다양한 기능 제공
- 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.
- 타입만으로 빈을 검색하거나 특별한 애노테이션 설정이 되어있는 빈을 찾을 수 있음
1.5.3 스프링 IoC의 용어 정리
- 빈(Bean)
- 스프링이 IoC방식으로 관리하는 오브젝트
- 관리되는 오브젝트(managed object)라고도 함
- 스프링의 모든 오브젝트가 빈은 아니며, 스프링이 직접 생성과 제어를 관리하는 오브젝트를 의미한다.
- 빈 팩토리(Bean Factory)
- 스프링 IoC를 담당하는 핵심 컨테이너
- 빈의 등록, 생성, 조회, 리턴 등 빈을 관리
- 주로 빈 팩토리를 확장한 애플리케이션 컨텍스트(Application Context)를 이용
- 애플리케이션 컨텍스트(ApplicationContext)
- 빈 팩토리를 확장한 IoC 컨테이너
- 기본 기능은 빈 팩토리와 동일
- 스프링이 제공하는 부가 서비스를 추가로 제공
- 설정정보/설정 메타정보(Configuration Metadata)
- IoC를 적용하기 위해 사용하는 메타정보
- 구성정보 / 형상정보
- 청사진(bluprints)라고도 한다.
- 컨테이너(Container) 또는 IoC 컨테이너
- IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 의미한다.
- 그래서 컨테이너가 무엇?
- 스프링 프레임워크
- IoC 컨테이너, 애플리케이션 컨텍스트를 포함한 스프링이 제공하는 모든 기능을 통틀어 의미
' Spring > 토비의 스프링 3.1' 카테고리의 다른 글
1.7 의존관계 주입(DI) (0) | 2019.01.10 |
---|---|
1.6 싱글톤 레지스트리와 오브젝트 스코프 (0) | 2019.01.09 |
1.4 제어의 역전(IoC) (0) | 2019.01.07 |
1.3 DAO의 확장 (0) | 2019.01.07 |
1.2 DAO의 분리 (0) | 2019.01.03 |