2021. 3. 18. 00:11ㆍ개발공부/스프링 철저 입문
지난 글에 이어 의존성 주입(DI)를 마무리 짓는 글입니다. Bean이 같은 타입(이름)으로 여러 개 있을 때 설정, Component 타입, Bean 스코프/생성주기 그리고 Spring Profile 기능까지 다뤄보겠습니다.
@Autowired
어노테이션을 통해 의존성 주입하는 방식입니다. DI 컨테이너가 자동으로 필요로 하는 의존 Component를 주입하게 합니다. 예시로 필수 조건을 완화해서 필드 인젝션한 코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
@Autowired(required = false)
PasswordEncoder passwordEncoder;
//스프링 4부터는 Optional을 사용할 수 있다.
@Autowired
Optional<PasswordEncoder> passwordEncoder;
public void createUser(User user, String rawPassword) {
String encodedPassword = passwordEncoder.map(x -> x.encode(rawPassword))
.orElse(rawPassword);
//...
}
|
cs |
@Qualifier
같은 타입(이름)의 빈 여러 개가 설정돼있다면 Qualifier(name="[name]")으로 구분지을 수 있습니다. name은 클래스 이름이 아닌 용도에 맞춰 지어야 DI의 의미가 있다고 합니다. 예를 들어(lightweight). 참고로 @Primary를 사용하면 같은 빈이 호출되었을 때 우선순위로 빈이 호출됩니다.
Bean 스코프
Bean 스코프는 인스턴스가 생성되는 방식에 따라 종류가 나뉩니다. 대표적으로 Spring 기본 설정인 singleton과 멀티 스레드에 사용하는 prototype이 있습니다.
- singleton : 하나의 인스턴스가 만들어지고 이후부턴 그 인스턴스를 공유하는 방식입니다.
- prototype : 빈을 요청할 때마다 새로운 빈 인스턴스가 만들어집니다. 멀티 스레드 환경이라면 prototype을 사용해야 합니다. 사용방법은 @Scope("prototype") 입니다.
- Bean 생성 후 초기화 작업 : Annotation 기반 설정을 사용할 때 @PostConstruct 애너테이션이 붙은 메서드가 우선순위 상위권입니다.
- Bean 종료 단계 : 전처리 수행은 @PreDestory로 사용할 수 있습니다. 단 prototype 스코프의 빈에서는 동작하지 않습니다.
- Bean 설정 분할 : DI 컨테이너에서 관리하는 빈이 많아질 수록 설정 내용이 많아져 관리하기가 어려워 집니다. 설정 범위를 명확히 하고 목적에 맞게 분할하는 것이 좋습니다. @Import({DomainConfig.class, InfrastructureConfig.class}) 분할한 Config 클래스를 어노테이션을 활용해 대표 설정 클래스 AppConfig.class에 주입할 수 있습니다.
Profile별 설정
Spring에선 환경이나 개발 목적에 맞게 설정파일을 선택할 수 있도록 Profile 기능을 제공합니다. 예를 들어 개발 환경용(development), 검증 환경용(staging), 운영 환경용(production) 등을 만들 수 있습니다. 설정 방식은 @Configuration 과 @Profile("[name]") 을 부여해줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Configuration
public class AppConfig {
@Bean(name="dataSource")
@Profile("development")
DataSource dataSourceForDevelopment() {
return null;
}
@Bean(name="dataSource")
@Profile("staging")
DataSource dataSourceForStaging() {
return null;
}
}
|
cs |
애플리케이션 실행 시 Profile을 설정해줄 수 있습니다. Java 커맨드 옵션으로 지정하는 방법과 환경 변수로 지정하는 방법, 그리고 XML로 설정하는 방법 세 가지가 있습니다.
- Java 커맨드 옵션 :
-Dspring.profiles.active=development
* Intellij에서 시도해봤으나 실행이 되지 않았습니다.
- 환경변수로 지정 :
export SPRING_PROFILES_ACTIVE=development
- XML파일로 설정 :
'개발공부 > 스프링 철저 입문' 카테고리의 다른 글
(4) 2장_스프링 코어(DI, AOP) - Resource 추상화, Message 관리 (0) | 2021.03.25 |
---|---|
(3) 2장_스프링 코어(DI, AOP) - AOP, SpEL (0) | 2021.03.22 |
(1) 2장_스프링 코어(DI,AOP) - Bean설정과 의존성 주입 (0) | 2021.03.15 |