강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

쉽지않네님의 프로필 이미지
쉽지않네

작성한 질문수

스프링 부트 - 핵심 원리와 활용

외부설정 사용 - @ConfigurationProperties 검증

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

작성

·

33

·

수정됨

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

 

 

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

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

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

0

안녕하세요, 인프런 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 통해 확인 가능합니다.

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

쉽지않네님의 프로필 이미지
쉽지않네

작성한 질문수

질문하기