inflearn logo
강의

Course

Instructor

Spring Boot - Core Principles and Applications

Using External Configuration - @ConfigurationProperties Validation

@Validated를 적용해도 빈 검증이 안되는 경우에 대한 조치 공유..

Resolved

101

hyekko92

19 asked

0

[요약]

Spring Boot 3.4 이상을 사용하실 경우 MyDataSourcePropertiesV3의 필드 중 Etc 타입 필드에 @Valid를 적용해야 Etc 클래스 내부에 적용한 유효성 검증 어노테이션이 정상적으로 동작됩니다...

package hello.datasource;

import ...

@Getter
@ConfigurationProperties("my.datasource")
@Validated
public class MyDataSourcePropertiesV3 {

    @NotEmpty
    private String url;

    @NotEmpty
    private String username;

    @NotEmpty
    private String password;

    @Valid // 적용 필요
    private Etc etc;

    public MyDataSourcePropertiesV3(String url, String username, String password, Etc etc) {
        this.url = url;
        this.username = username;
        this.password = password;
        this.etc = etc;
    }

    @Getter
    public static class Etc {
        @Min(1)
        @Max(999)
        final private int maxConnection;

        @DurationMin(seconds = 1)
        @DurationMax(seconds = 60)
        private Duration timeout;

        private List<String> options;

        // 생성자 주입
        public Etc(int maxConnection, Duration timeout, List<String> options) {
            this.maxConnection = maxConnection;
            this.timeout = timeout;
            this.options = options;
        }
    }

}

 

=======================================================================================

스프링 부트 3.4 이전 버전에서는 @ConfigurationProperties가 적용된 클래스에 @Validated만 적용해도 해당 클래스의 필드와 중첩 필드(필드의 타입으로 정의된 클래스 안의 필드)에 대해서도 자동으로 유효성 검증 어노테이션이 동작했다고 합니다.

즉, @ConfigurationProperties가 적용된 MyDataSourcePropertiesV3 클래스에 @Validated를 적용하면 해당 클래스의 필드인 url, username, password, etc 뿐만 아니라 etc 안의 필드인 maxConnection, timeout, options의 유효성 검증 어노테이션이 모두 동작했다고 합니다.

 

그러나 스프링 부트 3.4 이후 버전에서는 @ConfigurationProperties가 적용된 클래스에 @Validated만 적용할 경우 해당 클래스의 필드에 적용된 유효성 검증 어노테이션만 동작하며 중첩 필드에 대하여 유효성 검증 어노테이션이 동작하도록 하기 위해서는 중첩 필드에 @Valid를 명시적으로 적용해야한다고 합니다.

 

image.png

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.4-Release-Notes#bean-validation-of-configuration-properties

 

 

spring spring-boot prometheus grafana

Answer 2

0

yh

쉽지않네님 고맙습니다^^!

다음 버전에 패치할게요^^!

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 쉽지않네님께서 질문해주신 @Validated를 적용했을 때 빈 검증이 제대로 동작하지 않는 문제에 대한 답변입니다.

Spring Boot 3.4 이상 버전에서는 @ConfigurationProperties@Validated를 사용해도 중첩된 필드에 대한 유효성 검증이 자동으로 적용되지 않습니다. 중첩 필드에 대한 유효성 검증을 원하신다면, 중첩 필드에 @Valid 어노테이션을 명시적으로 추가하셔야 합니다. 이는 Spring Boot 3.4 버전의 변경 사항으로, 중첩된 구조의 필드에 대해 검증을 진행하실 때 이러한 부분들을 반드시 고려하셔야 합니다.

기존에는 @Validated 어노테이션을 클래스에 붙이면 모든 중첩 필드의 검증 어노테이션이 자동으로 동작했으나, 버전 3.4 이후에는 중첩된 필드에도 별도로 @Valid를 명시해야만 검증이 수행되는 것으로 변경되었습니다. 그리고 이를 통해 중첩된 객체의 필드를 검증할 수 있습니다.

첨부하신 소스 코드에서 Etc 타입 필드에 @Valid를 적용하여 maxConnection, timeout 등의 중첩 필드들이 제대로 검증될 수 있도록 하셨습니다. 이는 변경된 Spring Boot 버전에 따른 조치로 적절한 방법입니다.

보다 자세한 내용은 다음의 Spring Boot 3.4 릴리즈 노트를 참조하실 수 있습니다.

이미지로 제공해주신 스크린샷에 대한 설명도 이미지 URL 통해 확인 가능합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

보안이 엄격한 데이터

0

73

1

MyProperties 자체를 클라이언트 코드에서 사용

1

43

1

http://localhost:8080/actuator/prometheus

0

85

3

jar 추가에대한 질문드려도될까요?

0

64

1

build.gradle bom link 변경

0

65

2

@Counted 초기화

0

47

1

springboot에서 actuator없이 micrometer를 사용할수 있나요?

0

67

1

@Configuration 질문드립니다.

0

84

2

[공유] 터미널 말고 IDE 에서 jar 실행하기

0

100

1

localhost:8080/hello-servlet 404오류

0

123

2

내장톰캣2 서블릿 톰켓 실행이 안됩니다

1

154

2

최대 Tomcat 스레드 수를 확인하는 지표

0

159

1

mac m2에서 startup.sh 실행후 아무 반응이 없습니다.

0

94

2

내장 톰캣 실행 오류 관련 질문드립니다.

0

157

1

스프링 발전 과정들도 자세히 알아둬야하나요??

1

127

1

스프링부트 ioc 컨테이너 갯수

0

89

1

404 페이지

0

133

3

actuator 호출시 타임스탬프 질문

0

90

1

순수 라이브러리 사용하기 2 - memory-v1

0

125

1

외부설정 @ConfigurationProperties의 내부 클래스에서 static을 사용하는 이유를 알고 싶습니다.

0

105

1

서블릿 컨테이너 초기화1 강의 관련 질문입니다~

0

93

1

Thread Config Max 패널 설정 변경 질문

0

127

1

스프링 액츄에이터 shutdown 엔드포인트 활성화가 안됩니다.

0

107

1

테스트 실행시 동일 오류 3가지 발생

0

183

1