인프런 커뮤니티 질문&답변
@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를 명시적으로 적용해야한다고 합니다.

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





