관리 메뉴

제뉴어리의 모든것

DTO 유효성 검사시 주의 사항 (@NotBlank, @NotEmpty, @NotNull에 대하여) - 매우 중요 본문

Spring Boot

DTO 유효성 검사시 주의 사항 (@NotBlank, @NotEmpty, @NotNull에 대하여) - 매우 중요

제뉴어리맨 2022. 8. 28. 00:30

사전에 알아야 할점

  • @NotBlank
    NULL, "", " ", 다 안됨

  • @NotEmpty
    NULL, "" 만 안됨 (" " 은 됨)

  • @NotNull
    NULL만 안됨 ("", " " 은 됨)

 

@NotBlank 사용시 주의사항

문자열에 대해서 유효성 검사를 하는 애노테이션이다.

그러므로 문자열이 아닌 타입에 해당 애노테이션을 붙인 상태에서,

해당 필드로 사용자의 요청으로 인해 데이터가 들어오려 하면서 유효성 검사를 할때 다음과 같은 에러가 발생한다.

 

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.util.Map<java.lang.String, java.lang.Object>'. Check configuration for '검사하려는 필드명'

 

그러므로, 문자열 타입의 필드에만 붙여주어야 한다.

 

참조 : https://docs.jboss.org/hibernate/validator/4.1/api/org/hibernate/validator/constraints/NotBlank.html

 

NotBlank (Hibernate Validator 4.1.0.Final)

 

docs.jboss.org

 

@NotEmpty 사용시 주의사항

문자열, 컬렉션. 맵,  또는 배열이 null이지 혹은 ""인지 체크한다.

그러므로, 기본타입형이나 사용자정의타입을 @NotEmpty로 유효성 검사를 하려고 하면

아래와 같은 에러가 발생한다.

 

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.Character'. Check configuration for '검사하려는 필드명'

 

그러므로, 문자열, 컬렉션. 맵,  또는 배열 타입을 가진 필드에만 붙여주어야 한다.

 

참조 : https://docs.jboss.org/hibernate/validator/4.1/api/org/hibernate/validator/constraints/NotEmpty.html

 

NotEmpty (Hibernate Validator 4.1.0.Final)

 

docs.jboss.org

 

@NotNull 사용시 주의사항

객체가 Null인지 체크하는 애노테이션이다.

그러므로 모든 객체타입은 다 검사가 가능하다.

 

 

참조 : https://docs.jboss.org/hibernate/validator/4.1/api/org/hibernate/validator/constraints/impl/NotNullValidator.html

 

NotNullValidator (Hibernate Validator 4.1.0.Final)

 

docs.jboss.org

 

그러므로, 객체 타입에만 붙이도록 하자

 

 

추가 주의사항

DTO 내부에 필드중 기본타입형에 @NotNull을 붙이면 무조건 유효성을 통과한다.

왜냐하면 기본타입 멤버필드는 자동으로 초기화가 되기 때문이다.

int형 타입에 @NotNull을 붙이면 원래 0이란 값이 들어가 있기에, 클라이언트가 요청시 아무런 데이터를 보내지 않아도 통과 되는것이다.

아래는 멤버변수 생성시 자동적으로 초기화 되는 기본값 목록이다.

 

  • 멤버변수의 자동초기화 목록

이미지 참조 : https://feastforall.tistory.com/30