Spring 에서는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC (Inversion of Control) 컨테이너인 빈 팩토리 (Bean Factory) 가 존재한다. 하지만 실제로는 빈의 생성과 관계설정 외에 추가적인 기능이 필요한데, 이러한 이유로 Spring 에서는 빈 팩토리를 상속받아 확장한 애플리케이션 컨텍스트 (Application Context) 를 주로 사용한다.
애플리케이션 컨텍스트는 별도의 설정 정보를 참고하고 IoC 를 적용하여 빈의 생성, 관계설정 등의 제어 작업을 총괄한다.
애플리케이션 컨텍스트에는 직접 오브젝트를 생성하고 관계를 맺어주는 코드가 없고, 그런 생성 정보와 연관관계 정보에 대한 설정을 읽어 처리한다. 예를 들어 @Configuration 과 같은 어노테이션이 대표적인 IoC 의 설정정보이다.
빈 (Bean) 요청 시 처리 과정
클라이언트에서 해당 빈을 요청하면 애플리케이션 컨텍스트는 다음과 같은 과정을 거쳐 빈을 반환한다.
1. ApplicationContext 는 @Configuration 이 붙은 클래스들을 설정 정보로 등록해두고, @Bean 이 붙은 메소드의 이름으로 빈 목록을 생성한다.
2. 클라이언트가 해당 빈을 요청한다.
3. ApplicationContext 는 자신의 빈 목록에서 요청한 이름이 있는지 찾는다.
4. ApplicationContext 는 설정 클래스로부터 빈 생성을 요청하고, 생성된 빈을 돌려준다.
애플리케이션 컨텍스트는 @Configuration 이 붙은 클래스들을 설정 정보로 등록해두고, @Bean 이 붙은 메소드의 이름으로 빈 목록을 생성한다. 그리고 클라이언트가 해당 빈을 요청한다면 애플리케이션 컨텍스트는 자신의 빈 목록에서 요청한 이름이 있는지 찾고, 있다면 해당 빈 생성 메소드(@Bean) 을 호출하여 객체를 생성하고 돌려준다. (구체적으로는 Spring 내부에서 Reflection API 를 이용해 빈 정의에 나오는 클래스 이름을 이용하거나 또는 빈 팩토리를 통해 빈을 생성한다.)
애플리케이션 컨텍스트 (Application Context) 의 장점
클라이언트는 @Configuration 이 붙은 구체적인 팩토리 클래스를 알 필요가 없다.
-> 애플리케이션이 발전하면 팩토리 클래스가 계속해서 증가할 것이다. 애플리케이션 컨텍스트가 없다면 클라이언트는 원하는 객체를 가져오려면 어떤 팩토리 클래스에 접근해야 하는지 알아야 하는 번거로움이 생긴다. 반면에 애플리케이션 컨텍스트를 사용하면 팩토리가 아무리 많아져도 이에 직접 접근할 필요가 없어진다. 즉, 일관된 방식으로 원하는 빈을 가져올 수 있다.
애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.
-> 애플리케이션 컨텍스트는 객체의 생성과 관계 설정이 다가 아니다. 객체가 만들어지는 방식과 시점 및 전략 등을 다르게 가져갈 수 있고, 그 외에도 후처리나 정보의 조합 인터셉트 등과 같은 다양한 기능이 존재한다.
애플리케이션 컨텍스트를 통해 다양한 빈 검색 방법을 제공할 수 있다.
-> 애플리케이션 컨텍스트에서 빈 목록을 관리하여, 빈의 이름이나 타입 또는 어노테이션 설정 등으로 빈을 찾을 수 있다. 이러한 빈을 직접 찾는 방식은 의존성 검색 (dependency lookup) 으로 불린다.