[Spring] @Configuration, @Bean
Spring @Configuration과 @Bean에 대해 알아봅시다.
@Configuration
스프링이 Bean Factory를 위한 오브젝트 설정을 담당하는 클래스라고 인식할 수 있도록 한다. (애플리케이션 컨텍스트 또는 빈 팩토리가 사용할 설정정보라는 표시)
@Bean
오브젝트를 만들어주는 메소드에는 @Bean 이라는 애노테이션을 붙여준다. (오브젝트 생성을 담당하는 IoC용 메서드라는 표시)
@Configuration
public class DaoFactory {
@Bean
public UserDao userDao(){
return new UserDao(ConnectionMaker());
}
@Bean
public ConnectionMaker ConnectionMaker() {
return new DConnectionMaker();
}
}
스프링에서는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리(Bean Factory)라고 부른다. 보통 빈 팩토리보다 이를 좀 더 확장한 애플리케이션 컨텍스트(Application Context)를 주로 사용한다. 애플리케이션 컨텍스트는 IoC 방식을 따라 만들어진 일종의 빈 팩토리라고 생각하면 된다. 빈 팩토리와 애플리케이션 컨텍스트를 같다고 생각하면 편하다.
- 빈 팩토리: 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춘 것. 일반적으로 설정정보 (어떤 클래스의 오브젝트를 생성하고 어디에서 사용하도록 연결해줄 것인가 등)가 자바 코드로 만들어져 있다.
- 애플리케이션 컨텍스트: 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진. 별도의 정보를 참고해서 빈(오브젝트)의 생성, 관계설정 등의 제어 작업을 총괄한다. 빈 팩토리의 설정 정보를 직접적으로 담고 있지는 않고, 별도로 설정정보를 담고 있는 무엇인가를 가져와 이를 활용하는 범용적인 IoC 엔진 같은 것이다.
ApplicationContext
ApplicationContext를 구현한 클래스는 여러 가지가 있는데 @Configuration이 붙은 자바코드를 설정정보로 사용하려면 AnnotationConfigApplicationContext를 이용하면 된다. 애플리케이션 컨텍스트를 만들 때 생성자 파라미터로 원하는 팩토리 클래스를 넣어준다. 이렇게 준비된 Application의 getBean()
이라는 메서드를 이용해 아래 예제의 userDao의 오브젝트를 가져올 수 있다.
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao dao = context.getBean("userDao", UserDao.class);
}
getBean()
메서드는 ApplicationContext가 관리하는 오브젝트를 요청하는 메서드다. getBean()
의 파라미터인 “userDao”는 ApplicationContext에 등록된 빈의 이름이다. 위의 DaoFactory에서 userDao
메서드에 @Bean
애노테이션을 붙였는데 이 메서드 이름이 빈의 이름이 된다. userDao
라는 이름의 빈을 가져온다는 것은 DaoFactory
의 userDao()
메서드를 호출해서 그 결과를 가져온다고 생각하면 된다.
UserDao를 가져오는 메서드는 하나뿐인데 왜 굳이 이름을 사용하는 이유는 UserDao를 생성하는 방식이나 구성을 다르게 하는 메서드를 추가할 수 있기 때문이다. 그때는 specialUserDao()라는 메소드로 만들고 getBean("specialUserDao", UserDao.class)
로 가져오면 된다.
출처
토비의 스프링1