스프링 부트 - 핵심 원리와 활용 - 섹션7. 외부설정과 프로필2
CS/김영한 스프링 강의

스프링 부트 - 핵심 원리와 활용 - 섹션7. 외부설정과 프로필2

이번엔 이 외부설정을 주로 어떻게 읽는지 알아볼거다.

 

새로운 프로젝트로 시작한다.

 

 

전에 나온 Environment로 가져와서 읽으면 된다.

 

근데 일일히 env.getProperty 하기 싫어서 @Value라는게 나옴

 

@Slf4j
@Configuration
public class MyDataSourceValueConfig {
    @Value("${my.datasource.url}")
    private String url;
    @Value("${my.datasource.username}")
    private String username;
    @Value("${my.datasource.password}")
    private String password;
    @Value("${my.datasource.etc.max-connection}")
    private int maxConnection;
    @Value("${my.datasource.etc.timeout}")
    private Duration timeout;
    @Value("${my.datasource.etc.options}")
    private List<String> options;
    @Bean
    public MyDataSource myDataSource1() {
        return new MyDataSource(url, username, password, maxConnection,
                timeout, options);
    }
    @Bean
    public MyDataSource myDataSource2(
            @Value("${my.datasource.url}") String url,
            @Value("${my.datasource.username}") String username,
            @Value("${my.datasource.password}") String password,
            @Value("${my.datasource.etc.max-connection}") int maxConnection,
            @Value("${my.datasource.etc.timeout}") Duration timeout,
            @Value("${my.datasource.etc.options}") List<String> options) {
        return new MyDataSource(url, username, password, maxConnection,
                timeout, options);
    }
}

이 @Value는 필드나 생성자에서도 받을 수 있다.

기본값은 뒤에 :로 지정 가능하다.

 

근데 이 @Value 안에 같은 환경변수 묶음들인것 같은데 이렇게 일일히 치기 귀찮아서 @ConfigurationProperties가 나왔다.

 

 

특징은 타입을 여기서 한번 체크해주기 때문에, 이 프로퍼티에서 나온 환경변수의 타입은 보장된다. 틀리게 매칭하면 에러뜸. 또 다른건 케밥표기법으로 max-connection으로 했는데 자바 코드 내에선 그냥 maxConnection으로 했는데도 매칭됨. 이는 스프링이 알아서 변환해주기 때문. 

 

근데 이 등록된 프로퍼티 사용한다고 일일히 @EnableConfigurationProperties할 필요 없이 메인서 스캔하여 등록하면 바로 사용 가능하다. 그냥 이런것도 있다고. 써도 된다.

 

 

이번엔 이걸 @Data로 정의해서 setter가 정해져있어, 잘 모르는애가 읽어온 환경변수를 setter로 막 바꾸는걸 방지하기 위해 생성자로 받는거

 

@DefaultValue로 기본값을 정할 수 있다. @DefaultValue의 매개변수 조차 없다면 0, null 같은걸로 준다.

 

이번엔 값이 비어있는 것보다 더 심각한 환경변수 값이 잘못된 경우를 방지하기. 타입은 체크 하지만 실제 값은 체크를 못하니까.

 

```

org.springframework.boot:spring-boot-starter-validation

```

을 추가해야 할 수 있다.

 

 

만약 환경변수가 잘못되었다면 에러를 준다.

 

 

yaml

 

각 프로파일 별로 다른걸 주입받으라는 것도 코드 내에 작성할 수 있다.

똑같은 서비스에서 실행하는데 config에서  @Profile에 따라 다른 bean을 등록하게 했기에 결과도 그에 따라서 나온다. 단 default는 진짜 아무것도 없을 때.

 

이게 어떻게 가능하냐면 사실 @Profile 안에도 @Conditional이 있어서 프로파일 글자 일일이 검사한다.