본문 바로가기

개발/Spring

[Spring] @Valiated, BindingResult 사용하여 데이터 유효성 검증하기

반응형

서버에서 데이터를 바인딩할때, 데이터의 유효성을 검증하기 위해 @Validated 어노테이션을 이용할 수 있다. 

BingdingResult 를 함께 사용하여 유효성 검증 오류를 처리할 수 있다.

@Valid 와 @Validated 의 차이는 이전 글을 작성해뒀다!  

 

[Spring] @Valid 와 @Validated 차이

기존에 스프링은 유효성 검증을 위해 @Valid 어노테이션을 제공했음. 그런데 같은 객체 내의 파라미터들을 그룹핑하여 특정 상황에 맞게 유효성 검증을 하기 위해 @Validated 가 추가되었다. ex) 회원

jy-note.tistory.com

이번 글에서는 @Validated 에 추가된 기능인 그룹핑을 하여 데이터 유효성 검증하는 걸 정리할 것이다. 만약 그룹핑하지않고 그냥 검증한다면 ValidationGroup의 사용만 빼주면 된다.)

내 프로젝트는 spring boot + gradle 를 사용중이다.

--- 사용법

1. 라이브러리 추가 

implementation 'org.springframework.boot:spring-boot-starter-validation'

annotationProcessor 'jakarta.validation:jakarta.validation-api'

(만약 springboot 2.4.x 버전 이하를 사용하고있다면 org.springframework.boot:spring-boot-starter-validation 은 생략가능하다. springboot 라이브러리에 포함되어있다. 2.3.x 버전부터 빠지게 되었는데 2.4x까지는 포함시켜준다나 뭐라나.,.. 나는 2.6.2 버전을 사용중이므로 추가해줬다.)

2. ValidationGroup class 작성

public class ValidationGroup{
	//사용자 등록
 	public interface userInsertGroup{}
 
 	//사용자 수정
	public interface userUpdateGroup{}
}

 

3. 검증할 데이터 클래스(UserVo)에 조건 추가

public class UserVo{
  //사용자 등록, 수정 시에 빈 값 체크
  @NotBlank(group={ValidationGroup.userInsertGroup.class, ValidationGroup.userUpdateGroup.calss})
  private String userId;
  //사용자 등록시에만 빈 값 체크
  @NotBlank(group={ValidationGroup.userInsertGroup.class})
  private String userName;

  @NotBlank(group={ValidationGroup.userInsertGroup.class, ValidationGroup.userUpdateGroup.calss})
  private String userPwd;
}

 - @NotBlank : null 과 "", " "(빈 공백 문자열)을 허용하지 않음.

 - @NotEmpty : null 과 ""를 허용하지 않음.

 - @NotNull : 모든 데이터 타입에 대해 null을 허용하지 않음.

 - @Max, @Min 등등 더 다양한 유효성 검증 조건이 있으니 필요에 따라 찾아보시길..

4. Controller 의 api 호출 시, 데이터 유효성 검증 및 검증 오류 처리. 

@ResponseBody
@PostMapping("/insert")
public String userInsert(@Validated(ValidationGroup.userInsertGroup.class) UserVo userVo, BindingResult bindingResult){
	result = null;
    //유효성 검증 체크. 실패 시 실패 메세지 전달
    //userInsertGroup을 사용하므로 userId, userName, userPwd 를 모두 체크
    if(bindingResult.hasErrors(){
    	result = "필수 데이터의 정보를 확인해주세요";
        return result;
    }
    
    //이후 등록 로직 진행
}

@ResponseBody
@PostMapping("/update")
public String userUpdate(@Validated(ValidationGroup.userUpdateGroup.class) UserVo userVo, BindingResult bindingResult){
	result = null;
    //유효성 검증 체크. 실패 시 실패 메세지 전달
    //userUpdateGroup 을 사용하므로 userId, userPwd 만 체크
    if(bindingResult.hasErrors(){
    	result = "필수 데이터의 정보를 확인해주세요";
        return result;
    }
    
    //이후 수정 로직 진행
}

 * 주의할 점 : BindingResult 를 검증할 객체(나의 경우 userVo) 바로 뒤에 사용하여야 한다.

 

반응형