@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;
숫자에 대해 최댓값, 최소값 등을 지정할 수 있습니다.
참고자료
728x90
'# Back-End > Spring' 카테고리의 다른 글
Multi module 프로젝트 구성 (0) | 2022.04.10 |
---|---|
[Spring] 인텔리 J에 환경변수, VMware Option 설정 (0) | 2022.03.19 |
@ControllerAdvice를 이용한 예외처리 (2) | 2022.01.24 |
@Secured, @PreAuthorized를 이용한 메소드 수준의 권한 적용 (0) | 2022.01.23 |
Role Enum 클래스를 이용한 인가 (0) | 2022.01.23 |
Spring Security란? (0) | 2022.01.23 |
JWT란? (0) | 2022.01.23 |