Spring/SpringBoot

[SpringBoot] @Validated DTO를 이용한 유효성 검사 및 groups 설정

이나피스 2023. 3. 22. 13:27
반응형

유효성 검사는 당연히 JS 영역에서 하는거라고 생각했다.

이번에 유효성 검사를 해야하는 부분이 있었는데, 찾아보니 Controller, DTO 하기 나름이라더라..

특히 JS에서만 유효성 검사를 하는 것은 안전하지 않기 때문에 백단에서 해주는게 좋다고 하는것 같았다.

 

내가 이번에 맡은 부분 중 추가/수정 모달창에 입력한 값에 대한 유효성 검사를 해야했다.

추가/수정 모두 한개의 DTO를 사용하고 있는데,

추가할 경우는 필수값이지만 수정할 경우는 display:none으로 값을 받지 않는 컬럼값이 있어서 이부분에서 좀 오~~~래 해맸다.

 

결론으로는 @Validated와 DTO 유효성 설정시 groups를 나누는 것이 핵심!

 

 

pom.xml

(Spring Boot 2.3 버전 이후인 경우)

우선 @Validated 어노테이션을 사용하기 위해서 dependency를 추가해야한다.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
   <version>3.0.2</version>
</dependency>

 

DTO interface

생성, 수정할때의 유효성 검사가 다르기 때문에 interface 변수를 별도로 선언한다.

package com.beige0905.test.dto;

public class UserValidGroups {
    public interface createValid {};
    public interface modifyValid {};
}

 

DTO

유효성 검사 변수는 아래와 같이 설정했으며, address는 유효성 검사 제외이다.

생성시 : userType, userName, userCode

수정시 : userType, userName

변수에 선언한 유효성검사 어노테이션의 groups에 위에서 선언해둔 interface 클래스를 넣는다.

package com.beige0905.test.dto;

import lombok.*;

import javax.validation.constraints.*;

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {

   @NotNull(message = "학생/교사 중에서 선택하세요"
         ,groups = {UserValidGroups.createValid.class, UserValidGroups.modifyValid.class})
   String userType;

   @Pattern(regexp = "^([ㄱ-ㅎ가-힣A-Za-z])(\\s?[ㄱ-ㅎ가-힣A-Za-z])*$", message = "한글, 영문만 입력 가능합니다."
         ,groups = {UserValidGroups.createValid.class, UserValidGroups.modifyValid.class})
   @NotEmpty(message = "이름을 입력해 주세요."
         ,groups = {UserValidGroups.createValid.class, UserValidGroups.modifyValid.class})
   String userName;

   @Pattern(regexp = "^([0-9])(\\s?[0-9])*$", message = "숫자만 입력 가능합니다."
         ,groups = {UserValidGroups.createValid.class})
   @NotEmpty(message = "인증코드를 입력해주세요."
         ,groups = {UserValidGroups.createValid.class})
   String userCode;
   
   String address;
}

 

Controller

컨트롤러에 가져올 매개변수 앞에 @Validated(interface명) 어노테이션을 달아준다. 

유효성검사에 에러를 가져오기 위해 BindingResult 매개변수를 추가해주면 getFieldErrors() 메소드로 에러를 가져올수 있다.

@PostMapping(path = "/add-valid-check-catalog", consumes = {MediaType.APPLICATION_JSON_VALUE})
public List<FieldError> postAddValidCheckUser(@Validated(UserValidGroups.createValid.class) @RequestBody User userInfo, BindingResult bindingResult) {
   List<FieldError> allErrors = new ArrayList<>();
   if(bindingResult.hasErrors()){
      allErrors = bindingResult.getFieldErrors();
   }
   return allErrors;
}
@PostMapping(path = "/modify-valid-check-catalog", consumes = {MediaType.APPLICATION_JSON_VALUE})
public List<FieldError> postModifyValidCheckUser(@Validated(UserValidGroups.modifyValid.class) @RequestBody User userInfo, BindingResult bindingResult) {
   List<FieldError> allErrors = new ArrayList<>();
   if(bindingResult.hasErrors()){
      allErrors = bindingResult.getFieldErrors();
   }
   return allErrors;
}

 

 

참고 자료

https://wildeveloperetrain.tistory.com/25

 

Spring Boot Validation 적용하는 법, @Valid 작동 안되는 이유

* @Valid 어노테이션이 작동이 안 한다면? spring boot 2.3 version 이상부터는 spring-boot-starter-web 의존성 내부에 있던 validation이 사라졌습니다. 때문에 사용하시는 spring boot version이 2.3 이상이라면 validatio

wildeveloperetrain.tistory.com

https://me-analyzingdata.tistory.com/entry/Spring-Controller-request-%EC%9C%A0%ED%9A%A8%EC%84%B1-%EA%B2%80%EC%82%AC?category=1034382 

 

[Spring] Controller request 유효성 검사

Request 유효성 검사 서버는 client로 부터 값을 받아서 사용할 때 client로 받은 정보가 서버에서 원하는 형식 혹은 값의 조건에 맞는지 검사를 해야한다. 이를 유효성 검사라고 한다. 이러한 유효성

me-analyzingdata.tistory.com

 

반응형