JAVA/JAVA | Spring 학습기록

[230327] javax.validation:validation-api에서 @Valid가 먹히지 않을 때 (feat. spring-boot-starter-validation)

kth990303 2023. 3. 27. 19:40
반응형

사이드 프로젝트에서 코드리뷰를 하면서 아래와 같은 의문점이 생겨났다.

스프링부트를 사용하는 보통의 경우 `spring-boot-starter-validation`을 사용하는데, 팀원이 javax.validation:validation-api` 의존성을 삽입했길래 해당 관련 궁금증이 생겼다.

 

spring-boot-startger-validation은 평상시에 많이 사용했었기 때문에 javax.validation:validation-api 의존성에 대해서 Maven Repository를 찾아보았다.

우측 하단의 Date에서 알 수 있듯이, javax.validation.validation-api 의존성의 마지막 updated가 2017년이다. 

뭔가 deprecated의 냄새가 진동했지만, 해당 PR의 중점 내용이 validation이 아니기도 했고, 생각보다 관련 문서가 많이 나오지 않아 일단 해당 PR을 머지하고 넘어갔다.


문제 발생 상황

 

그러나 문제는 그 이후에 발생했다!

request DTO에서의 `@Valid` 어노테이션이 아예 먹히지가 않는 것이다!

왼쪽 사진은 회원가입 시에 request로 보내는 DTO에 포함된 @Valid 검증 어노테이션을 포함한 모습이다. email 필드를 보면 알 수 있듯이, 올바르지 않은 이메일 형식이면 예외를 발생시켜야 한다. 

오른쪽 사진은 올바르지 않은 이메일 형식으로 보냈음에도 불구하고 200 OK가 뜨면서 성공적으로 회원가입이 완료된 모습을 나타낸다.

 

분명 의존성 외에는 다른 코드가 아예 없었기 때문에 해당 이슈 관련 구글링을 진행해보았다.

그 결과, 아래 스택오버플로우 글을 찾을 수 있었다.

https://stackoverflow.com/questions/48614773/spring-boot-validation-annotations-valid-and-notblank-not-working

 

Spring boot validation annotations @Valid and @NotBlank not working

Given below is my main controller from which I am calling the getPDFDetails method. @RequestMapping(value=PATH_PRINT_CONTRACTS, method=RequestMethod.POST) public ResponseEntity<?>

stackoverflow.com

스프링부트 2.3.0 부터 spring-boot-starter-validation을 추가하지 않고 javax.validation:validation-api만 사용할 경우, @Valid 어노테이션이 작동하지 않는다고 한다. JSR 사양은 제공하지만 구현을 제공하지 않기 때문이라고 한다. 

 

출처: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#validation-starter-no-longer-included-in-web-starters

심지어 spring-boot 공식 repository에서도 위와 같이 소개가 되어있다.

 

spring-boot-starter-validation 의존성은 최근까지도 업데이트가 활발히 진행되고 있다

그냥 spring-boot-starter-validation 을 쓰는 것이 마음이 편할 듯하다.

반응형