IoC/DI를 위한 빈 설정 메타정보 작성
IoC컨테이너의 기본적인 역할은 코드를 대신해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리하는 것이다.(POJO로 만들어진 애플리케이션 클래스와 서비스 오브젝트들이 그 대상)
빈을 만들기 위한 설정 메타정보는 파일이나 애노테이션 같은 리소스로부터 전용 리더를 통해 BeanDefinition 타입의 오브젝트로 변환된다. 이 BeanDefinition정보를 IoC컨테이너가 활용하게 된다.
빈 등록은 빈 메타정보를 작성해서 컨테이너에게 건네주면 된다.
=> XML 문서, 프로퍼티 파일, 소스코드 애노테이션과 같은 외부 리소스로 빈 메타정보를 작성하고 이를 적절한 리더나 변환기를 통해 애플리케이션 컨텍스트가 사용할 수 있는 정보로 변환해주는 방법을 사용
빈 메타정보 작성법
1. XML : <bean> 태그
<bean> 태그는 <beans> 라는 루트 엘리먼트를 갖는 XML 문서에 포함된다.
1 2 3 | <bean id="hello" class="com.spring.testHello"> <property name="printer" ref="..."/> </bean> | cs |
id와 class 두 개의 애트리뷰트가 필요
2.자동인식을 이용한 빈 등록 : 스테레오타입 애노테이션과 빈 스캐너
모든 bean을 XML에 일일이 선언하는 것은 나중에 규모가 커졌을때 관리하기 번거로울 수가 있다.
빈으로 사용될 클래스에 특별한 애노테이션을 부여해주면 이런 클래스를 자동으로 찾아서 빈으로 등록해줄 수 있다.
이러한 빈을 찾아서 등록해주는 방식을 빈 스캐닝(scanning)이라 한다. (스캐닝 작업을 담당하는 오브젝트를 빈스캐너라고 한다.)
지정된 클래스패스 아래에 있는 모든 패키지의 클래스를 대상으로 필터를 적용하여 빈등록을 위한 클래스들을 선별해낸다.
스프링에서는 디폴트 필터에 적용되는 애노테이션을 스트레오(stereotype) 애노테이션이라고 부른다.
(AnnotationConfigApplicationContext는 빈 스캐너를 내장하고 있는 애플리케이션 컨텍스트 구현 클래스)
자동인식을 통한 빈등록은 2가지 방법이 존재한다.
1. XML을 이용한 빈 스캐너 등록
- context 스키마의 전용 태그를 넣어서 등록가능 <context:component-scan base-package="package 경로" />
- 웹에서라면 AnnotationConfigWebApplicationContext를 루트 컨텍스트나 서블릿 컨텍스트가 사용하도록 컨텍스트 파라미터로 변경해주면 된다.
- 123456789<context-param><param-name>contextClass</param-name><param-value>org.springframework.context.support.AnnotationConfigWebApplicationContext</param-value></context-param><context-param><param-name>contextConfigLocation</param-name><param-value>spring.test .....스캔페키지 지정</param-value></context-param>
cs
스트레오타입 애노테이션 종류
=> @Repository, @Service, @Controller 등등
3. 자바코드에 의한 빈 등록 : @Configuration 클래스의 @Bean 메소드
의존관계 내에 있지 않은 제3의 오브젝트를 만들어 의존관계를 가진 오브젝트를 생성하고 메소드 주입을 통해 의존관계를 만든다.
오브젝트 생성과 의존관계 주입을 담당하는 오브젝트를 오브젝트 팩토리
오브젝트 팩토리의 기능을 일반화해서 컨테이너로 만든 것이 스프링 컨테이너(빈 팩토리)
빈 설정 메타정보를 담고 있는 자바 코드는 @Configuration 애노테이션이 달린 클래스를 이용해 작성한다. @Bean 메소드를 통해 빈을 정의할 수 있다.
<beans>를 @Configuration 클래스로, 각 <bean>을 @Bean 메소드로 대응해서 생각하면 쉽다.
1 2 3 4 5 6 7 | @Configuration public class AnnotatedHelloConfig{ @Bean public HelloBean helloBean(){ // 메소드 이름이 등록되는 빈의 이름이 된다. return new HelloBean(); // 컨테이너는 이 리턴 오브젝트를 빈으로 활용 } } | cs |
ApplicationContext ctx = new AnnotationConfigApplicationContext(AnnotatedHelloConfig.class); 로 사용이 가능하다.
설정을 담은 자바 코드(AnnotatedHelloConfig)클래스 자체도 하나의 빈으로 등록된다.
new로 생성하지만 싱글톤으로 bean이 생성된다.
@Configuration 클래스는 빈 스캐닝을 통해 자동등록될 수 있다. @Configuration의 메타 어노테이션에 @Component가 있기 때문에 빈 스캐너의 어노테이션 필터를 통과한다.
=> 단순한 빈 스캐닝을 통한 자동인식으로는 등록하기 힘든 기술 서비스 빈의 등록이나 컨테이너 설정용 빈을 XML없이 등록할때 사용
dataSource를 java코드를 이용해서 bean 설정할때
1 2 3 4 5 6 7 8 9 10 11 12 | @Configuration public class ServiceConfig{ @Bean public DataSource dataSource(){ SimpleDriverDataSource dataSource = new SimpleDriverDataSource(); dataSource.setDriverClass(com.mysql.jdbc.Driver.class); dataSource.setUrl("..."); dataSource.setUsername("aaa"); dataSource.setPassword("bbb"); return dataSource; } } |
자바코드가 유용한점
- 컴파일러나 IDE를 통한 타입 검증이 가능
- 자동완성과 같은 IDE 지원 기능을 최대한 이용가능
- 이해하기 쉬움
- 복잡한 빈 설정이나 초기화 작업을 손쉽게 적용
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] 프로퍼티(properties) 다루기 (0) | 2018.09.07 |
---|---|
[Spring] IoC(InversionOfControl) 컨테이너 6 (빈 등록 메타정보 구성 전략) (0) | 2018.08.28 |
[Spring] IoC(InversionOfControl) 컨테이너 4 (0) | 2018.08.27 |
[Spring] IoC(InversionOfControl) 컨테이너 3 (0) | 2018.08.08 |
[Spring] IoC(InversionOfControl) 컨테이너 2 (0) | 2018.08.08 |