Springboot properties ConstructorBinding with Validated

Kevin Park
5 min readApr 6, 2021

--

안녕하세요. kevin 입니다.

스프링부트 2.2.0 부터 지원하고 있는 ConstructorBinding 을 이용하여 불변 properties를 생성하고 생성 시 validation을 통해 보다 안전한 방법으로 사용하는 방법을 추천 드립니다.

properties에 값을 주입하는 방법은 여러 방법이 있으나 ConstructorBinding을 통하여 불변객체로 안전하게 사용 할 수 있습니다.

예제를 통해 살펴 보겠습니다.

spring:
profiles:
active: local

server:
port: 8080

application:
mode: dev
phase: ${spring.profiles.active}
port: ${server.port}
secret:
mysql: mysql_vault
redis: redis_vault

yml 에 appication 이란 properties를 추가 하였고 해당 properties를 주입 받도록 하겠습니다.

@Getter
@ConstructorBinding
@ConfigurationProperties("application")
@Validated
@RequiredArgsConstructor
public class ApplicationProperties {
@NotBlank private final String mode;
@NotBlank private final String phase;
@NotBlank private final String port;
@NotNull private final Secret secret;

@Getter
@RequiredArgsConstructor
public static final class Secret {
@NotBlank private final String mysql;
@NotBlank private final String redis;
}
}

생성 한 ApplicationProperties를 ConfigurationPropertiesScan 을 통해 Bean으로 등록하도록 하겠습니다. ConfigurationPropertiesScan 역시 2.2.0 이상 지원되며 다른 base packages scan 과 동일하게 동작 합니다.

@Configuration(proxyBeanMethods = false)
@ConfigurationPropertiesScan(basePackages = "com.github.underbell.properties.**.properties")
public class PropertiesConfiguration {}

ApplicationReadyEvent를 통해 값을 확인 해보록 하겠습니다.

@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
log
.info("application.mode = {}", applicationProperties.getMode());
log.info("application.phase = {}", applicationProperties.getPhase());
log.info("application.port = {}", applicationProperties.getPort());
log.info("application.secret.mysql = {}", applicationProperties.getSecret().getMysql());
log.info("application.secret.redis = {}", applicationProperties.getSecret().getRedis());
}
2021-04-06 15:26:58.681 INFO 21411 --- [ main] c.g.u.p.event.PropertiesReadyEvent : application.mode = dev
2021-04-06 15:26:58.682 INFO 21411 --- [ main] c.g.u.p.event.PropertiesReadyEvent : application.phase = local
2021-04-06 15:26:58.682 INFO 21411 --- [ main] c.g.u.p.event.PropertiesReadyEvent : application.port = 8080
2021-04-06 15:26:58.682 INFO 21411 --- [ main] c.g.u.p.event.PropertiesReadyEvent : application.secret.mysql = mysql_vault
2021-04-06 15:26:58.682 INFO 21411 --- [ main] c.g.u.p.event.PropertiesReadyEvent : application.secret.redis = redis_vault

값이 모두 정상적으로 주입 되었습니다.

application.secret.redis 에 빈값을 주고 실행 시 아래와 같은 validation fail message를 확인 하실 수 있습니다.

Property: application.secret.redis
Value:
Origin: class path resource [application.yml] - 14:11
Reason: 공백일 수 없습니다

생성자 주입과 validation을 통해 보다 안전한 방법으로 properties를 사용하시는 것을 추천 드립니다.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Kevin Park
Kevin Park

No responses yet

Write a response