개발 공부/트러블슈팅

@Valid 가 작동하지 않는 원인과 해결방법

빵다희 2024. 8. 26. 21:41

👾 문제식별

요청 객체에 빈 값이 들어오는 걸 방지하려고 요청 dto name필드에는 @NotBlank를 붙이고

컨트롤러에는 @Valid 추가하였다.

@Valid를 통한 유효성 검사에서 문제가 발생하면 MethodArgumentNotValidException이 호출되기에 @ExceptionHandler(MethodArgumentNotValidException.class)를 붙인 핸들러도 생성하였다.

요청 정보
응답정보

 

위 캡쳐본과 같이 name에 빈 스트링객체를 넘겼을때 Exception이 발생해 오류를 뱉을거라는 예상과 달리

저장이 너무 잘되어버린다...


🔍 원인분석

DTO클래스와 컨트롤러에 붙인 @NotBlank 과 @Valid가 제대로 동작하지 않는다고 볼 수 밖에 밖에 없었다. 

 


🤔 해결방법시도

Gradle

RequestDto

 

Controller

 

 

1. validation 어노테이션 전체가 반응이 없는건지 @NotNull, @NotEmpty 붙여봄 : 무반응

2. 혹시나하고 @RequestBody @Valid 위치를 바꿔봄 : 무반응

3. 잘못된 패키지 Import 의심, 검색해보니 @Valid는

 org.springframework.boot:spring-boot-starter-validation 디펜던시만 있으면 된다고 하길래 validation 어노테이션 사용을 위해 추가한 4개의 디펜던시 중 3개를 삭제 하고 재 빌드 : 이전에 import 되었던 패키지와 다른 패키지가 import 되면서 유효성 검사 정상으로 작동.


✅ 최종해결방법

Gradle : 

    implementation ("javax.validation:validation-api:2.0.1.Final") 
    implementation ("org.hibernate.validator:hibernate-validator:6.2.0.Final") 
    implementation ("org.glassfish:javax.el:3.0.0") 

삭제하고 재 빌드.

 

RequestDto : NotBlank 패키지 변경

import javax.validation.constraints.NotBlank; => import jakarta.validation.constraints.NotBlank;

 

Controller :  Vaild 패키지 변경

import javax.validation.constraints.Vaild; => import jakarta.validation.Vaild;

 


 

💡 해결 방법 설명

문제 발생의 원인은 내가 gpt의 말을 철썩 믿어버린 탓이다.

@valid를 쓰고 싶다고 gpt에게 말했더니 그는 이렇게 많은 디펜던시를 추가하라고 했고

    implementation ("javax.validation:validation-api:2.0.1.Final") // 또는 최신 버전
    implementation ("org.hibernate.validator:hibernate-validator:6.2.0.Final") // 또는 최신 버전
    implementation ("org.glassfish:javax.el:3.0.0") // EL API
    implementation ("org.springframework.boot:spring-boot-starter-validation")

 

나는 아무 의심 없이 바로 복붙하고 빌드 하였다.

 

사실 Springboot3.x 버전에서는 spring-boot-starter-validation 하나만 추가하면 제약조건 어노테이션과 검증 어노테이션 모두 사용가능하다.

 

스프링 부트 3.0 마이그레이션 가이드 문서에 따르면 

3.0으로 버전업을 하면서 더이상 javax는 지원하지 않는다고 한다.

javax를 모두 jakarta로 변경하는 걸 권고 하고 있다.

 

Spring Boot 3.0 Migration Guide

Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

github.com

 

하지만 나는 그런사실을 몰랐고..

javax.validation 디펜던시가 추가되면서 어노테이션 사용시 디폴트로  javax.validation 패키지가 import되었다..!

SpringBoot 3.x버전에서는 javax를 지원하지 않기때문에 유효성 검사가 작동하지 되지 않고 계속 저장이 되어버렸다^^

 

결론은 javax => jakarta로 변경

 


📝 재발 방지 대책

디펜던시를 추가할때 가급적 공식문서를 참조 할 것.

나의 개발환경을 잘 고려해서 호환성을 살펴보고 추가하자.

728x90
반응형