# Back-End/Spring

@Vaild를 이용한 Validation 검증

@Valid 어노테이션이란?

Validation이란 어떤 데이터가 조건에 충족하는 지 확인하는 작업을 말합니다. 유효성 검사는 Front-end와 Back-end 양쪽에서 하는 것이 좋습니다. @Valid 어노테이션은 값에 제약조건을 설정하고, 이에 맞지 않은 데이터가 들어왔을 때 예외를 발생하는 어노테이션으로, DTO에 적용하면 쉽게 Validation을 진행할 수 있습니다.

 

 

실행 환경

의존성

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

 

패키지

import javax.validation.constraints.*;

 

 

@Valid 적용 방법

@RequestMapping(value = "/api/sample")
@RestController
@RequiredArgsConstructor
public class SomethingApiController {
		
    @GetMapping("/hello")
    public APIResult hello(@RequestBody @Valid TestRequestDto requestDto){
        return APIResult.OK("처리 성공");
    }

    @GetMapping("/world")
    public APIResult world(@RequestParam @Valid @Email String email){
        return APIResult.OK("처리 성공");
    }

}

 

요청을 받는 컨트롤러에서 들어오는 값(DTO 혹은 ReqeustParam)에 대해 @Valid 어노테이션을 적용합니다.

 

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TestRequestDto {

    @NotNull
    private String name;
    
    @Email
    private String email;
}

 

DTO의 각각 필드에 대해 맞는 어노테이션을 적용합니다.

 

 

@Valid 제약조건이 맞지 않을 때의 예외 처리

    /**
     *  @Valid 어노테이션으로 인한 제약조건 예외 처리
     */
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Header handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        log.error("handleMethodArgumentNotValidException", e);

        BindingResult bindingResult = e.getBindingResult();

        StringBuilder builder = new StringBuilder();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            builder.append("[");
            builder.append(fieldError.getField());
            builder.append("](은)는 ");
            builder.append(fieldError.getDefaultMessage());
            builder.append(" 입력된 값: [");
            builder.append(fieldError.getRejectedValue());
            builder.append("]");
        }

        return Header.ERROR(
                ErrorCode.INVALID_INPUT_VALUE.getResultCode(),
                ErrorCode.INVALID_INPUT_VALUE.getDescription(),
                builder.toString()
        );
    }

@Valid에서 제약조건에 맞지 않는 데이터가 들어왔을 때는 MethodArgumentNotValidException 예외가 발생하게 됩니다.

이때의 예외를 처리하기 위해 ControllerAdvice에 Handler를 정의하여 처리하도록 했습니다.

 

 

 

주로 사용하는 제약조건

문자열

  null "" " "(공백)
@NotNull Invalid Valid Valid
@NotEmpty Invalid Invalid Valid
@NotBlank Invalid Invalid Invalid

 

숫자

    @DecimalMax(value = "1000000000")
    private BigInteger decimalMax;
    
    @DecimalMax(value = "1")
    private BigInteger decimalMin;
    
    @Max(value = 1000)
    private Integer max;
    
    @Max(value = 1)
    private Integer min;

숫자에 대해 최댓값, 최소값 등을 지정할 수 있습니다.

 

 

참고자료

Validation 어디까지 해봤니? : NHN Cloud Meetup

728x90