[토비의 스프링 3.1 Vol 1] 07장.스프링 핵심 기술의 응용
7.1 빈 스캐닝과 자동 와이어링
7.1.1 @Autowired를 이용한 자동와이어링
@Autowired는 자동와이어링 기법을 이용해서 조건에 맞는 빈을 찾아 자동으로 수정자 메소드나 필드엔 넣어준다. 컨테이너가 자동으로 주입할 빈을 결정하기 어려운 경우, 직접 프로퍼티에 주입할 대상을 지정하는 방법을 병행하면 된다.
단순히 필드에 값을 저장하는 수정자 메소드라도 @Autowired를 필드에 직접 부여했다고 메소드를 생략하면 안 되는 경우가 있다. 스프링과 무관하게 직접 오브젝트를 생성하고 다른 오브젝트를 주입해서 테스트하는 순수한 단위 테스트를 만드는 경우에는 수정자 메소드가 필요하다.
7.1.2 @Component를 이용한 자동 빈 등록
@Component가 붙은 클래스는 빈 스캐너를 통해 자동으로 빈으로 등록된다.
👆 @Bean 어노테이션과의 차이
@Bean 어노테이션은 보통 @Configuration이 붙은 클래스에서 사용되며, 이 클래스는 스프링 설정 클래스로 동작한다. 스프링 관리하에 있는 클래스를 빈으로 등록할 때 사용하는 @Configuration과 달리, @Bean은 외부 라이브러리나 수동 객체 생성을 빈으로 등록할 때 사용한다.
@Component 애노테이션이 달린 클래스를 자동으로 찾아서 빈을 등록해주게 하려면 빈 스캔 기능을 사용하겠다는 애노테이션 정의가 필요하다. 프로젝트 내의 모든 클래스 패스를 다 뒤져서 @Component 애노테이션이 달린 클래스를 찾는 것은 부담이 많이 가는 작업이다. 그래서 특정 패키지 아래서만 찾도록 기준이 되는 패키지를 지정해줄 필요가 있다. 이때 사용되는 애노테이션은 @CompenentScan이다.
7.2 프로파일
테스트환경과 운영환경에서 각기 다른 빈 정의가 필요한 경우가 종종 있다. 즉, 운영 환경과 테스트 환경에 모두 필요하면서 빈의 내용이 달라져야하는 경우에는 작성이 곤란해진다.
7.2.1 @Profile
스프링 3.1은 환경에 따라서 다른 설정 정보를 구성할 수 있는 방법을 제공한다. @Profile 애너테이션을 사용하면, 빈 등록을 조건부로 제어할 수 있다.
@Profile("dev")
@Component
public class DevDataSourceConfig implements DataSourceConfig {
// 개발용 DB 설정
}
@Profile("prod")
@Component
public class ProdDataSourceConfig implements DataSourceConfig {
// 운영용 DB 설정
}
그리고 해당 프로파일이 사용되도록 @ActiveProfiles를 넣어주면 된다. (혹은 외부 설정 파일 application.yml에서 profile.active 속성 설정)
7.2.2 프로퍼티 소스
DB 연결 정보와 같이 외부 서비스 연결에 필요한 정보는 환경에 따라 다르게 설정될 수 있어야 한다. 또한, 빌드 작업이 따로 필요 없는 xml이나 프로퍼티 파일 같은 텍스트 파일에 저장해두는 편이 낫다.
Spring Boot는 기본적으로 다음 파일들을 자동으로 읽고 프로퍼티 소스로 등록한다. :
- application.properties
- application.yml
- application-{profile}.yml (예: application-dev.yml)
이 파일들의 내용은 내부적으로 Environment 객체에 저장되어, @Value 등의 애노테이션으로 주입할 수 있다.