@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 |