@Configuration 애노테이션
적용 범위
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Configuration
- 클래스에 해당하는 타입에 붙일 수 있다.
설명
- 클래스에 적용되어 빈을 생성하는 클래스임을 표기한다.
- 이 클래스는 한개 혹은 그 이상의
@Bean메서드를 선언함을 표기한다. - 런타임 중에 Bean Definition 을 생성하고 해당 빈들에 대한 서비스 요청을 생성한다. 이는 보통 스프링 컨테이너에 의해 처리된다.
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
// instantiate, configure and return bean ...
}
}
@Bean애노테이션을 가진myBean()메서드에 의해 빈이 생성되어 스프링 컨테이너에 올라갈 것이다.
@Configuration 클래스, 부트스트래핑 하기
부트스트래핑이란 컴퓨터의 부팅과 비슷한 의미로, 외부의 작용 없이 스스로 시작되는 동작(과정)을 의미한다. (self-starting process) 위키백과 정의@Configuration 클래스를 부트스트래핑한다는 것은 내부에 정의된 빈을 스프링 컨테이너로 올리는 것을 말한다.
AnnotaitonApplicationContext 를 통해
스프링에서 제공하는 타입인 ApplicationConfigApplicationContext 혹은 ApplicationConfigWebApplicationContext 를 통해 가능하다.
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class);
ctx.refresh();
MyBean myBean = ctx.getBean(MyBean.class);
// use myBean ...
AppConfig 는 이전에 정의한 @Configuration 이 붙은 클래스를 말한다.
Spring XML 을 통해
<beans>
<context:annotation-config/>
<bean class="com.acme.AppConfig"/>
</beans>
컴포넌트 스캐닝을 통해
@Configuration
public class AppConfig {
private final SomeBean someBean;
public AppConfig(SomeBean someBean) {
this.someBean = someBean;
}
// @Bean definition using "SomeBean"
}
@Configuration애노테이션에는 내부적으로@Component가 포함되어 컴포넌트 스캐닝의 후보가 된다.- 위의 코드는 단일 생성자가 있으며,
final로 선언된 빈 타입의 멤버가 있다.- 이 특성에 의해 autowiring 이 적용되어
SomeBean타입이 스프링 컨테이너에 올라가 있다면, 자동으로 주입될 것이다.
- 이 특성에 의해 autowiring 이 적용되어
@Configuration
@ComponentScan("com.acme.app.services")
public class AppConfig {
// various @Bean definitions ...
}
- 컴포넌트 스캔이 설정되어 있지 않다면, 자동 검출되지 않기 때문에 컴포넌트 스캐닝이 안된다면, 위처럼 컴포넌트 스캔을 설정해주어야 한다.
- 스프링 부트에서는 자동으로 생성되는
@SpringBootApplication애노테이션 내부에@ComponentScan애노테이션이 포함되어 있어서 따로 설정할 필요 없다.
@Configuraiton 클래스, 외부화된 값 이용하기
외부화된 값을 이용한다는 것은 application.properties 처럼 외부 프로퍼티 등에서 받는 값을 이용한다는 뜻이다.
이렇게 값을 외부로 공개해놓으면, 추가적인 작업이 필요할 때, 빌드 없이 간단히 내가 원하는 환경 값을 변경하거나 프로그램 실행 시 인수를 변경하는 등 유연한 애플리케이션을 구성할 수 있다.
이를테면, 3000 번 포트에서 돌아가는 서버 프로그램을 5000 번 포트에서 돌아가도록 빌드 없이 쉽게 수정할 수 있다.
Environment API 사용하기
@Configuration
public class AppConfig {
@Autowired Environment env;
@Bean
public MyBean myBean() {
MyBean myBean = new MyBean();
myBean.setName(env.getProperty("bean.name"));
return myBean;
}
}
@Autowired애노테이션을 사용하여, 스프링Environment를 주입시킬 수 있다.- 이를 이용해
Environment를 통해 프로퍼티 값을 가져온다.
- 이를 이용해
@PropertySource 애노테이션 사용하기
@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {
@Inject Environment env;
@Bean
public MyBean myBean() {
return new MyBean(env.getProperty("bean.name"));
}
}
@PropertySource를 통해서 프로퍼티의 위치를 특정하여 사용할 수도 있다.
@Value 애노테이션 사용하기
@Configuration
@PropertySource("classpath:/com/acme/app.properties")
public class AppConfig {
@Value("${bean.name}") String beanName;
@Bean
public MyBean myBean() {
return new MyBean(beanName);
}
}
PropertySourcesPlaceholderConfigurer와 함께 자주 쓰인다.- XML 에서는
<context:property-placeholder/>처럼 표현된다.
- XML 에서는
@Configuration 클래스 구성(Composing)하기
@Configuration 클래스를 구성 (Composing) 한다는 것은 내 입맛대로 어떤 @Configuration 조합을 합치거나, 아니면 실행 환경 (로컬, 개발, 프로덕트) 에 따라서 원하는 @Configuration 정보만 가져오거나 하는 것을 말한다.
@Import 애노테이션 이용하기
@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return DataSource
}
}
@Configuration
@Import(DatabaseConfig.class)
public class AppConfig {
private final DatabaseConfig dataConfig;
public AppConfig(DatabaseConfig dataConfig) {
this.dataConfig = dataConfig;
}
@Bean
public MyBean myBean() {
// reference the dataSource() bean method
return new MyBean(dataConfig.dataSource());
}
}
@Import를 이용해 여러 개의@Configuration을 하나로 모을 수 있다.- XML 에서는
<import>가 있다.
@Profile 애노테이션 이용하기
@Profile("development")
@Configuration
public class EmbeddedDatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return embedded DataSource
}
}
@Profile("production")
@Configuration
public class ProductionDatabaseConfig {
@Bean
public DataSource dataSource() {
// instantiate, configure and return production DataSource
}
}
- 실행 환경인
Profile조건에 따라 다르게 설정할 수 있다.- 개발할 때는 개발 DB 를 불러오고 운영 서버에서는 운영 DB 를 불러오는 작업을 별다른 추가적인 소스코드 수정 없이 가능하다.
레퍼런스
'Java > 자바 잡지식' 카테고리의 다른 글
| Lombok 을 사용할 때 주의해야 하는 점들 정리 (0) | 2022.04.23 |
|---|---|
| 스프링 @Bean 애노테이션 정리 (0) | 2022.04.23 |
| 자바 @Retention 애노테이션 정리 (0) | 2022.04.23 |
| 자바 EE 란? (0) | 2022.04.20 |
| 클린 아키텍처 (by Robert C. Martin) 번역 (0) | 2022.04.14 |