스프링은 애플리케이션 개발의 다양한 영역과 기술에 관여하고, 해당 부분에 대한 많은 기능을 제공한다.
스프링의 핵심 : 빈 팩토리 또는 애플리케이션 컨텍스트
위 두가지는 이전 장에서 만든 DaoFactory가 하는 일을 일반화한 것이라고 설명할 수 있다.
factory (팩토리)
객체의 생성 방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 역할을 하는 오브젝트
Bean (빈) : 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
Spring Bean (스프링 빈) : 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전이 적용된 오브젝트
Bean Factory (빈 팩토리) : 스프링에서 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트
Application Context (애플리케이션 컨텍스트) : IoC 방식을 따라 만들어진 일종의 빈 팩토리.
애플리케이션 컨텍스트는 별도의 정보를 참고해서 빈의 생성, 관계설정 등의 제어 작업을 총괄한다.
(설정 정보를 직접 갖고 있지 않는다.)
컨테이너 또는 IoC 컨테이너 : IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC 컨테이너 라고도 한다.
스프링 프레임워크 : IoC 컨테이너, 애플리케이션 컨텍스트를 포함해서 스프링이 제공하는 모든 기능을 통틀어 말할 때 주로 사용한다.
이전장에서 설계도에 해당하는 부분이 애플리케이션 컨텍스트 + 설정 정보 이다.
스프링에서는 빈 팩토리 보다는 빈 팩토리를 확장한 애플리케이션 컨텍스트를 주로 사용한다.
Dao Factory Class를 스프링의 빈 팩토리가 사용할 수 있는 설정 정보로 만들어보자.
@Configuration : 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스임을 나타낸다.
@Bean : 개발자가 직접 제어(수정) 불가능한 외부 라이브러리 등을 Bean으로 만들 때 사용
name 속성으로 Bean의 이름을 설정 가능하다.
이름 지정 안할 시, 클래스 이름이 Bean의 이름이 된다.
@Configuration // 애플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정정보라는 표시
public class DaoFactory {
@Bean // 오브젝트 생성을 담당하는 IoC용 메소드라는 표시
public UserDao userDao() {
UserDao userDao = new UserDao(connectionMaker());
return userDao;
}
@Bean
public ConnectionMaker connectionMaker() {
return new DConnectionMaker();
}
}
이제 DaoFactory를 설정정보로 사용하는 애플리케이션 컨텍스트를 만들어보자.
이렇게 준비된 애플리케이션 컨텍스트의 getBean( )이라는 메소드를 사용하여 생성되어있는 UserDao의 오브젝트를 가져올 수 있다.
public class main {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao userDao = context.getBean("userDao", UserDao.class);
...
}
}
getBean( ) 메소드는 애플리케이션 컨텍스트가 관리하는 오브젝트를 요청하는 메소드이다.
스프링을 사용하기 위해 프로젝트에 필요한 라이브러리를 추가해야 한다.
라이브러리 목록
애플리케이션 컨텍스트는 ApplicationContext 인터페이스를 구현한다.
ApplicationContext 인터페이스는 빈 팩토리가 구현하는 BeanFactory 인터페이스를 상속한다.
즉, 애플리케이션 컨텍스트는 일종의 빈 팩토리인 셈이다.
오브젝트 팩토리 VS 애플리케이션 컨텍스트
애플리케이션 컨텍스트는 @Configuration이 붙은 설정 정보를 등록해둔다.
또한 @Bean이 붙은 메소드의 이름을 가져와 Bean 목록을 만들어 둔다.
클라이언트가 getBean( )메소드를 호출하면, 자신의 Bean 목록에서 요청한 이름을 찾아서 해당 메소드를 호출하여 오브젝트를 생성 후 클라이언트에게 돌려준다.
내부적으로는 애플리케이션 컨텍스트가 DaoFactory의 userDao( ) 메소드를 호출해서 가져온 오브젝트를 클라이언트가 getBean( )으로 요청할 때 전달해준다.
애플리케이션 컨텍스트를 사용하였을때 장점
클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.
애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.
소스코드 : github