스프링에서는 스프링이 제어권을 가지고 직접 만들며 관계를 부여하는 오브젝트를 빈이라고 부른다.
자바빈과 비슷한 오브젝트 단위이지만, 스프링 빈은 여기에 스프링 컨테이너가 생성하며 관계설정, 사용등을 제어해주는 제어의 역전이 적용된 오브젝트를 말한다.
스프링의 빈 팩토리가 사용할 수 있는 설정정보를 만들어보자.
@Configuration
public class DaoFactory {
@Bean
public UserDao userDao(){
return new UserDao(connectionHelper());
}
@Bean
public ConnectionHelper connectionHelper(){
return new SeungkyuConnection();
}
}
스프링이 빈 팩토리를 위한 오브젝트 설정을 담당하는 클래스라고 인식할 수 있도록 @Configuration annotation을 달아야 한다.
그리고 이 안의 userDao() 메서드는 UserDao 타입 오브젝트를 생성하고 초기화해서 돌려주는 것이기에 @Bean이 붙는다.
다른 부분도 마찬가지로 @Bean을 설정해준다.
이 두가지의 annotation 만으로도 애플리케이션 컨텍스트가 IoC 방식을 제공할 수 있게 된다.
이제 DaoFactory를 설정정보로 사용하는 애플리케이션 컨텍스트를 만들어보자.
ApplicationContext를 구현한 클래스 중에서 Annotation을 사용했기에, AnnotationConfigApplicationContext를 사용했다.
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao userDao = context.getBean("userDao", UserDao.class);
해당 방법으로 Configuration을 ApplicationContext에 등록하고 getBean을 사용해 해당 userDao의 이름의 빈을 UserDao.class로 가져오는 것이다.
같은 타입의 메서드가 여러개 지정되어 있다면, 이 이름을 통해서 빈을 가져올 수 있다.
이렇게 스프링의 ApplicationContext로 기존의 오브젝트 팩토리를 대체했다.
ApplicationContext는 DaoFactory 클래스를 설정정보로 등록해두고 @Bean이 붙은 메서드의 이름을 가져와 빈 목록을 만들어둔다.
클라이언트가 애플리케이션 컨텍스트의 getBean() 메서드를 호출하면 자신의 빈 목록에서 요청한 이름이 있는지 찾고, 있다면 빈을 생성하는 메서드를 호출해서 오브젝트를 생성시킨 후 클라이언트에 돌려준다.
이렇게 IoC 기능으로 ApplicationContext를 사용하면 다음과 같은 장점이 있다.
- 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
프로젝트가 커져가며 Factory들도 점차 많아질텐데, 그러면 클라이언트가 필요한 오브젝트를 가져오기 위해 Factory 클래스들을 찾아야 한다는 문제가 있다. 이를 ApplicationContext에 등록하면 일관된 방식으로 원하는 오브젝트를 가져올 수 있다.
- ApplicationContext는 종합 IoC 서비스를 제공해준다.
ApplicationContext는 단순하게 오브젝트와 관계설정에만 관여하는 것이 아니다. 오브젝트가 만들어지는 방식, 시점과 전략을 다르게 가져갈 수 있다고 한다. 이를 통해 오브젝트를 효과적으로 활용할 수 있는 다양한 기능을 제공한다.
- 애플리케이션 컨텍스트는 빈을 검색하는 다양한 방법을 제공한다.
애플리케이션 컨텍스트의 getBean() 메서드는 빈의 이름을 이용해 빈을 찾아주기에, 특별한 설정이 되어 있는 빈도 찾을 수 있다.
이제 스프링의 IoC 용어를 정리하고 마무리해보겠다.
- 빈(Bean)
빈은 스프링 IoC 방식으로 관리하는 오브젝트라는 뜻이다. 스프링을 사용하는 애플리케이션에서 만들어지는 모든 오브젝트가 빈은 아니다. 그 중에서 스프링이 직접 생성과 제어를 담당하는 오브젝트만을 빈이라고 부른다.
- 빈 팩토리(Bean factory)
스프링의 IoC를 담당하는 핵심 컨테이너를 가리킨다. 빈을 등록하고, 생성하고, 조회하고 돌려주고 그 외의 빈을 관리하는 기능을 담당한다. 하지만 보통은 이를 확장한 ApplicationContext를 사용한다.
- 애플리케이션 컨텍스트(Application Context)
빈 팩토리를 확장한 IoC 컨테이너이다. 기본적인 기능은 빈 팩토리와 동일하며, 여기에 스프링이 제공하는 각종 부가 서비스를 추가로 제공한다. 그렇기에 스프링의 기능을 모두 포함하여 이야기 할 때 Application Context라고 말한다.
- 설정정보(Configuration metadata)
빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다. 컨테이너에 어떤 기능을 세팅하거나 조정하는 경우에도 사용하지만, IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트를 생성하고 구성할 때도 사용된다.
- 컨테이너
IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너라고 한다.
'백엔드 > 토비의 스프링' 카테고리의 다른 글
[토비의 스프링] 1.4 제어의 역전(IoC) (0) | 2025.05.07 |
---|---|
[토비의 스프링] 1.3 Dao의 확장 (0) | 2025.05.07 |
[토비의 스프링] 1.2 Dao의 분리 (0) | 2025.05.07 |
[토비의 스프링] 1.1 초난감 DAO (1) | 2025.05.06 |