여러 프로퍼티를 묶어서 하나의 빈으로 등록하기
프로퍼티 value들을 클래스 멤버 필드로 오토 바인딩
- 프로퍼티 클래스에 @ConfigurationProperties("key") 선언
- 프로퍼티 클래스에 @Component 선언
- 바인딩할 프로퍼티 값들을 멤버 필드
- (생략 가능) 어노테이션 프로세서 플러그인 추가
- 프로젝트 빌드 시 메타정보 생성
- 프로퍼티 파일에서 IDE의 자동완성 가이드 사용가능 by 메타정보
- (생략 가능) 어플리케이션 클래스에 @EnableConfigurationProperties(프로퍼티클래스.class) 선언
- 스프링부트에서 자동으로 추가해주므로 생략해도 됨
//application.properties
kkambi.name=kkambi
kkambi.age=${random.int(0,10)}
kkambi.fullName=${kkambi.name} babo
//Property Class
@Component
@ConfigurationProperties("kkabmi")
public class KkambiProperties{
private String name;
private int age;
private String fullName;
//getter
}
@Value보다 @ConfigurationProperties를 사용하자
장점1. Type-Safe
- @Value로 사용하는 곳에서 프로퍼티 값을 주입받을 경우, 타입 문제
- @Configuration 사용 시 타입이 하나로 고정
- @Value를 사용할 때 발생하는 문제 코드
public class KkambiOne{
@Value("${kkambi.age}")
private String age;
}
public class KKambiTwo{
@Value("${kkambi.age}")
private int age;
}
장점2. 융통성 있는 바인딩 (Relaxed Binding)
- 프로퍼티 정의할 때, Snake_case / Kebab-case 로 적어도 맵핑
- kkambi.full_name / kkambi.full-name도 private String fullName에 주입
장점3. 프로퍼티 타입 컨버전
- 프로퍼티 파일에서 정의한 값은 모두 문자열
- ${random.int(0,10)}을 사용하더라도 문자열
- 스프링이 제공하는 컨버전 서비스에 의해 int 타입 변수에 바인딩할 시, 자동 컨버젼
장점4. 프로퍼티 값 검증
- 프로퍼티 클래스에 @Validated 선언
- 멤버 필드 @NotEmpty, @NotNull, @NotBlank, @Size, ...
스프링 부트의 독특한 Duration 컨버전
Duration Type으로 컨버전
- @DurationUnit 으로 시간 종류 설정 가능
- @DurationUnit 없이, 프로퍼티 파일에서 직접 시간 종류 설정 가능
- Duration.ofSeconds(30)처럼 프로퍼티 값이 없을 시, 기본값 설정 가능
//application.properties
kkambi.sessionTimeout=25
kkabmi.connectionTimeout=60s
//Property Class
@Component
@ConfigurationProperties("kkabmi")
public class KkambiProperties{
@DurationUnit(ChronoUnit.SECONDS)
private Duration sessionTimeout = Duration.ofSeconds(30); // default 30s
private Duration connectionTimeout; // 60s에 의해 sec로 바인딩
//getter
}
프로퍼티가 어플리케이션 내에 없을 때
spring-boot-autoconfigure의 ServerProperties처럼 다른 JAR파일 안에 있는 경우
- 프로퍼티 클래스를 @Component로 등록 불가능
컴포넌트 스캔 이후, 자동설정이 등록되잖아! - @Bean으로 해당 프로퍼티 인스턴스 반환하는 메소드 구현 후, @ConfigurationProperties("key") 선언
- rare한 경우
'학습 > Spring' 카테고리의 다른 글
[spring] 스프링부트의 로깅 (0) | 2020.04.16 |
---|---|
[spring] 스프링의 @Configuration과 @Profile (0) | 2020.04.15 |
[spring] 스프링부트의 외부 설정 (개념) (0) | 2020.04.11 |
[spring] 스프링부트의 SpringApplication 객체 활용하기 (0) | 2020.04.10 |
[spring] 독립적으로 실행 가능한 JAR (Executable Jar) (0) | 2020.04.08 |
댓글