(2) 2장_스프링 코어(DI, AOP) - Bean 스코프, Profile

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파일로 설정 :

1
2
3
4
<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>production</param-value>
</context-param>
cs

 

출처: 스프링 철저 입문