
외부 설정들은 스프링이 제공하는 Environment 를 통해서 일관된 방식으로 조회할 수 있다.
@Value 를 사용하면 외부 설정값을 편리하게 주입받을 수 있다.
참고로 @Value 도 내부에서는 Environment 를 사용한다
@Value("${my.datasource.url}")
private String url;
...
@Value("${my.datasource.etc.max-connection:1}")
//key 가 없는 경우 1 을 사용한다.
스프링은 외부 설정의 묶음 정보를 객체로 변환하는 기능을 제공하는데 이것을 타입 안전한 설정 속성이라고 한다. 객체를 사용했을 때 다음과 같은 장점이 있다.
@Data
@ConfigurationProperties("my.datasource")
public class MyDataSourcePropertiesV1 {
...
}
@ConfigurationProperties 이 있으면 외부 설정을 주입 받는 객체라는 뜻이다. 여기에 외부 설정 KEY의 묶음 시작점인 my.datasource 를 적어준다.@EnableConfigurationProperties(MyDataSourcePropertiesV1.class)
public class MyDataSourceConfigV1 {
private final MyDataSourcePropertiesV1 properties;
...
}
@ConfigurationProperties 를 지정해주어야 한다. @ConstructorBinding
스프링 부트 3.0 이전에는 생성자 바인딩 시에@ConstructorBinding애노테이션을 필수로 사용해야 했다.
스프링 부트 3.0 부터는 생성자가 하나일 때는 생략할 수 있다. 생성자가 둘 이상인 경우에는 사용할 생성자에
@ConstructorBinding애노테이션을 적용하면 된다
jakarta.validation.constraints.Max
jakarta.validation 으로 시작하는 것은 자바 표준 검증기에서 지원하는 기능이다.
org.hibernate.validator.constraints.time.DurationMax
org.hibernate.validator 로 시작하는 것은 자바 표준 검증기에서 아직 표준화 된 기능은 아니고, 하이버네이트 검증기라는 표준 검증기의 구현체에서 직접 제공하는 기능이다. 대부분 하이버네이트 검증기를 사용하므로 이 부분이 크게 문제가 되지는 않는다.
가장 좋은 예외는 컴파일 예외, 그리고 애플리케이션 로딩 시점에 발생하는 예외이다. 가장 나쁜 예외는 고객 서비스 중에 발생하는 런타임 예외이다.
@Profile 애노테이션을 사용하면 해당 프로필이 활성화된 경우에만 빈을 등록한다. 이러한 기능을 할 수 있는 이유는 @Conditional 이 있기 때문이다.
package org.springframework.context.annotation;
...
@Conditional(ProfileCondition.class)
public @interface Profile {
String[] value();
}
@Profile 을 사용하면 각 환경 별로 외부 설정 값을 분리하는 것을 넘어서, 등록되는 스프링 빈도 분리할 수 있다