1.5.2 컨테이너 인프라 빈을 위한 자바 코드 메타정보
스프링의 빈을 역할에 따라 세가지로 구분하려는 이유는 세가지 종류의 빈은 빈 설정 메타정보를 작성하는 방법과 전략을 각각 다르게 가져갈 수 있기 때문이다.
IoC/DI 설정 방법의 발전
스프링 1.x
- XML을 이용한 빈 등록 방법을 주로 사용
- <bean> 태그만을 사용할수 있어서 세가지 종류의 빈이 모드 <bean> 태그로 등록
- 성격이 다른 빈들이 한데 모여있어서 규모가 커지고 빈의 개수가 증가하면 XML 설정파일을 보고 애플리케이션의 구성을 파악하기가 어려움
- 컨테이너 인프라 빈은 클래스 이름이나 속성을 보고 동작 방식을 이해하기 어려움
스프링 2.0
- 까다로운 컨테이너 인프라 빈을 쉽게 사용할수 있도록 스키마와 네임스페이스를 가진 전용 태그를 제공, 직접 커스텀 태그를 만들어서 사용 가능
<aop:config>
,<tx:advice>
처럼 짧고 직관적인 태그를 사용해 컨테이너 인프라 빈을 등록 가능
스프링2.5
- 빈 스캐너와 스트레오타입 애노테이션을 이용한 빈 자동등록 방식과 애노티에션 기반의 의존관계 설정 방법이 등장
- XML 같은 집중된 설정정보 파일에 <bean>을 사용해 등록할 필요 없이 애플리케이션 로직 클래스에 직접
@Component
류의 애노테이션을 부여하는 것만으로 빈이 등록
- XML 설정파일에는 주로 애플리케이션 인프라 빈과 전용태그를 사용해 정의하는 컨테이너 인프라 빈만 남게 됐고, 애플리케이션 로직 빈의 설정 메타정보는 애노테이션을 이용해 자바 코드로 작성
DataSourceTransactionManager
같이 외부에 라이브러리 클래스에는@Component
를 부여하거나 프로퍼티에 @Autowired를 넣을 수 없어 XML <bean> 등록 방법이 필요
스프링 3.0
- 자바 코드를 이용해 빈 설정정보 또는 빈 설정 코드를 만드는 일이 가능
- 코드를 이용해 직접 빈 오브젝트를 생성하고 프로퍼티 지정이 가능
- 하지만 컨테이너 인프라 빈 등록에는 XML의 전용 태그가 필요
스프링3.1
- 컨테이너 인프라 빈도 자바 코드로 등록이 가능
- XML의 전용 태그에 대응되는 새로운 자바 코드 메타정보 작성 방법이 제공
- 모든 빈을 XML에 정의할 수 있고, XML 없이 자바 코드만으로 빈 설정 메타정보 작성도 가능, 물론 두가지 방법을 적절히 혼용도 가능
버전 | 애플리케이션 로직 빈 | 애플리케이션 인프라 빈 | 컨테이너 인프라 빈 |
---|---|---|---|
스프링 1.x | <bean> | <bean> | <bean> |
스프링 2.0 | <bean> | <bean> | 전용태그 |
스프링 2.5 | <bean>, 빈 스캔 | <bean> | 전용태그 |
스프링 3.0 | <bean>, 빈 스캔, 자바코드 | <bean>, 자바코드 | 전용태그 |
스프링 3.1 | <bean>, 빈 스캔, 자바코드 | <bean>, 자바코드 | 전용태그, 자바코드 |
자바 코드를 이용한 컨테이너 인프라 빈 등록
- XML에서는 컨테이너 인프라 빈을 여러 카테고리로 분류하고 각기 다른 네임스페이스를 가진 스키마에 전용 태그로 정의
- 트랜잭션은 tx 네임스페이스 태그, 애플리케이션 컨텍스트는 context 네임스페이스
- 자바 코드에서는 전용 애노테이션과 자바 코드를 사용
- 자바 코드 설정을 사용하는 것이므로 기본적으로 @Configuration이 붙은 클래스가 필요
- 스프링3.0에서는 @Bean 메소드를 넣기위해 필요했지만, 스프링 3.1에서는 @Bean 메소드가 없어도 컨테이너 인프라 빈 설정을 위해 사용이 가능
@ComponentScan
@Configuration
이 붙은 클래스에@ComponentScan
을 추가하면 XML에<context:component-scan>
을 사용한 것처럼 스트레오타입 애노테이션이 붙은 빈을 자동으로 스캔해서 등록
@Configuration
@ComponentScan("springbook.learningtest.spring31.ioc.scanner")
public class AppConfig {}
- @ComponentScan의 기본 값은 빈을 스캔할 기반 패키지
- 패키지 여러개 지정도 가능, 패키지 이름 대신 마커 클래스나 인터페이스 사용도 가능
public interface ServiceMarker {}
- 패키지 이름 대신 마커 클래스, 인터페이스의 패키지가 빈 스캐닝의 기준 패키지로 적용
@Configuration
@ComponentScan(basePackageClasses=ServiceMarker.class)
public class AppConfig {}
- 마커 클래스나 인터페이스를 이용해 패키지를 지정하는 방식에 여러 장점
- 패키지 이름의 오타, 패키지가 긴 경우, 경로가 옮겨지는 경우들의 문제를 해결
- 클래스 이름을 잘못 지정하면 컴파일 과정에서 걸러지므로 실수가 적어짐
- 스캔할 패키지를 대상에서 제외하고 싶은 경우 exclude 엘리먼트를 사용
//패키지 예시
myproject
-- config
-- dao
-- service
-- web
- 스캔하기 가장 쉬운 방법은 myproject인 최상위 패키지를 스캔
@Configuration
이 붙은 클래스에서@ComponentScan
을 이용해 빈 스캔을 지정하는데 자기 자신이 다시 스캔돼서 등록되면 곤란, 이럴때@Configuration
이 붙은 클래스를 대상 제외
@Configuration
@ComponentScan(basePackages="myproejct",
excludeFilters=@Filter(Configuration.class)
)
public class AppConfig {}
- 스캔에서 제외할 대상은
excludeFilters
앨리먼트에@Filter
를 사용해서 지정
Configuration.class
로 지정해서AppConfig
자신을 포함해@Configuration
이 붙은 클래스들이 빈 스캔에서 제외
@Filter
의 type 앨리먼트를FilterType.ASSIGNABLE_TYPE
으로 주면 애노티에션 대신 특정 클래스를 직접 제외 대상으로 지정가능
@Configuration
@ComponentScan(basePackages="myproejct",
excludeFilters=@Filter(type=FilterType.ASSIGNABLE_TYPE, value=AppConfig.class)
)
public class AppConfig {}
- 기반 패키지를
basePackages
대신basePackageClasses
를 사용해 마커 인터페이스로 지정하는 경우에도excludeFilters
를 같은 방법으로 사용
@Import
- 다른 @Configuration 클래스를 빈 메타정보에 추가할 때 사용
@Configuration
클래스인AppConfig
에서 데이터 엑세스 기술과 관련된 빈만 모아놓은DataConfig
@Configuration
클래스의 빈 정보를 포함하고 싶다면 사용
@Configuration
@Import(DataConfig.class)
public class AppConfig {
}
@Configuration
public class DataConfig {
}
- @Import는 @Enable로 시작하는 컨테이너 인프라 빈을 위한 전용 애노테이션을 만들 때 더 많이 사용되며 @Import에는 단순히 @Configuration 파일을 하나 추가하는 것 이상으로 다양한 기능이 존재
- @Import를 활용해 전용 애노테이션을 만드는 방법과 활용 전략은 7장에서 소개
@ImportResource
- XML이 꼭 필요한 빈 설정만 별도의 파일로 작성한 뒤에 @Configuration 클래스에서 @ImportResource를 이용해 XML 파일의 빈 설정을 가져오는 것이 가능
- 예시) 스프링 시큐리티 보안 관련 전용 태그를 사용할때 XML빈 설정을 사용해야한다면 다음과 같이 @ImportResource를 사용해 XML 파일의 위치를 지정
@Configuration
@ImportResource("/myproejct/config/security.xml")
public class AppConfig {}
@EnableTransactionManagerment
- @Configuration 클래스에 사용할 수 있는 애노테이션
- XML의
<tx:annotation-driven />
태그와 동일한 기능을 수행
- @Transactional로 트랜잭션 속성을 지정할 수 있게 해주는 AOP 관련 빈을 등록해 줌
- 이 외에도 스프링 3.1에서 XML의 전용태그를 대체할 수 있는 애노테이션 설정 방법들
- @EnableAspectJAutoProxy
- @EnableAsync
- @EnableCaching
- @EnableLoadTimeWeaving
- @EnableScheduling
- @EnableSpringConfiguraed
- @EnableWebMvc
'개발서적 > 토비 스프링 3.1-Vol.2' 카테고리의 다른 글
[토비의 스프링 - Vol.2] 1장 - 1.5.4 런타임 환경 추상화와 프로파일 (0) | 2022.01.17 |
---|---|
[토비의 스프링 - Vol.2] 1장 - 1.5.3 웹 애플리케이션의 새로운 IoC 컨테이너 구성 (0) | 2022.01.17 |
[토비의 스프링 - Vol.2] 1장 - 1.5 스프링 3.1의 IoC 컨테이너와 DI (0) | 2022.01.17 |
[토비의 스프링 - Vol.2] 1장 - 1.4 기타 빈 설정 메타정보 (0) | 2022.01.17 |
[토비의 스프링 - Vol.2] 1장 - 1.3 프로토타입과 스코프 (0) | 2022.01.17 |