Bean과 IoC 컨테이너

  • Bean: 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 객체다.
  • BeanFactory: Bean의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트로 인터페이스다.
  • ApplicationContext: BeanFactory를 상속한 인터페이스다. 애플리케이션 전반에 걸쳐 모든 구성요소의 제어를 담당하는 IoC 엔진이다. ApplicationContext를 IoC 컨테이터라고도 부른다. 이 클래스를 구현한 객체는 보통 하나의 애플리케이션에서 여러 개가 만들어져 사용된다. 이를 통틀어서 스프링 컨테이너라고 부른다.
  • @Configuration: 설정 정보라고 부른다. BeanFactory를 위한 오브젝트 설정을 담당하는 클래스로 지정할 수 있는 어노테이션이다. IoC 컨테이너에 어떤 기능을 세팅하거나 조정하는 경우에도 사용하지만, 그보다는 IoC 컨테이너에 의해 관리되는 애플리케이션 오브젝트(Bean)를 생성하고 구성할 때 사용한다. 클래스 내에 @Bean이 붙은 메소드의 이름을 가져와 빈 목록을 만든다. 클라이언트가 ApplicationContextgetBean()메서드를 호출하면 자신의 빈 목록에서 요청한 이름이 있는지 찾고, 있다면 빈을 생성하는 메서도를 호출해서 오브젝트를 생성시킨 후 클라이언트에 돌려준다.
  • AnnotationConfigApplicationContext: @Configuration이 붙은 클래스를 설정정보로 사용하기위한 ApplicationContext의 구현 클래스다.

IoC 컨테이너(ApplicationContext)의 장점

  • 애플리케이션의 컴포넌트 역할을 하는 오브젝트와 애플리케이션의 구조를 결정하는 오브젝트로 관심을 분리할 수 있다.
  • 사용할 컴포넌트를 변경할 때, 컴포넌트 부분의 코드는 수정할 필요가 없으므로 유연성이 증가하며 확장성이 좋아진다.

자동인식을 이용한 Bean 등록

  • XML 문서나, 어노테이션, 자바 코드로 설정 정보를 작성하면 각각의 전용 리더를 통해 BeanDefinition 타입의 오브젝트로 변환된다. IoC 컨테이너는 이 BeanDefinition의 정보를 활용한다.
  • 등록할 모든 Bean을 XML에 일일이 선언하게되면 애플리케이션의 규모가 커진 경우 관리하기 번거로울 수 있다. 이를 해결하기위해 특별한 어노테잇녀을 부여해주면 자동으로 Bean으로 등록해주게 할 수 있다. 이러한 방식을 빈 스캐닝을 통한 자동인식 빈 등록 기능이라고 한다.
  • 이런 스캐닝 작업을 담당하는 객체를 빈 스캐너라고 한다. 빈 스캐너는 지정된 클래스패스 아래에 있는 모든 클래스를 대상으로 필터를 적용해 Bean 등록을 위한 클래스들을 선별한다.
  • 빈 스캐너에 내장된 디폴트 필터는 @Component 또는 @Component를 메타 어노테이션으로 가진 어노테이션이 부여된 클래스를 선택하도록 되어있다.
  • 위에서 언급한 AnnotationConfigApplicationContext는 빈 스캐너를 내장하고 있다.

XML 기반 Bean 등록 vs 어노테이션 기반 Bean 등록

  • XML
    • 장점: 애플리케이션을 구성하는 Bean과 의존관계, 설정 등을 통제하고 관리하기 쉽다.
    • 단점: XML 문서를 관리하기 때문에 개발 속도가 느려진다.
  • 어노테이션
    • 장점: 복잡한 XML 문서 생성과 관리가 필요없이 개발 속도를 향상 시킬 수 있다.
    • 단점: XML처럼 상세한 메타정보 항목을 지정할 수 없고, 클래스 당 한 개 이상의 Bean을 등록할 수 없다.
  • 개발 중에는 생산성을 위해 빈 스캐닝 기능을 사용해서 빈을 등록하지만, 개발이 어느 정도 마무리되고 세밀한 관리와 제어가 필요한 운영 시점이 되면 다시 XML 형태의 Bean 선언을 적용하는 것도 좋은 전략이다.

참고 자료

토비의 스프링 3.1 (이일민)

https://junroot.github.io/programming/Spring-Core/

댓글남기기