[Spring] Validation API 유효성 체크
Validation이란?
어떤 데이터의 값이 유효한지, 잘못된 내용이 있는지 확인하는 단계를 뜻합니다. 예를들어 휴대폰 번호의 포멧은 "010-1234-1234"이여야 하는데, 포멧과 맞지않는 값이 들어온다면 해당 값의 저장을 막을 수 있습니다.
(휴대 폰 번호 막고도 최소길이, 최대길이, 이전날짜, 이후날짜 등 다양하게 유효성 체크를 할 수 있습니다)
Validation API 사용
의존성 추가
Validation API를 사용하기 위해서는 먼저 아래와 같이 라이브러리를 추가 해주어야 합니다.
## maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>3.0.2</version>
</dependency>
## gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'
VO(DTO)에서 어노테이션을 통해 체크하고 @Valid 어노테이션을 통해 간단히 유효성 체크를 할 수 있습니다.
@Size | 값이 min고 max사이에 해당하는지 확인 |
@NotNull | Null을 허용하지 않음 |
@NotEmpty | Null을 허용하지 않으면 공백 문자열을 허용하지 않음 |
@NotBlank | Null을 허용하지 않으며 문자가 한 개 이상 폼하되어야함(공백제외) |
@Past | 과거 날짜인지 확인 |
@PastOrPresent | 오늘이거나 과거 날짜인지 확인 |
@Future | 미래 날짜인지 확인 |
@FutureOrPresent | 오늘이거나 미래 날짜인지 확인 |
@Pattern | 적용된 정규식 확 |
@Max | 값이 최대값(Max)보다 큰지 확인 |
@Min | 값이 최소값(Min)보다 작은지 확인 |
@AssertTure / False | True / False 인지 확인 |
@Valid | 해당 VO(DTO) 유효성 체크 실시 |
유효성 체크 예제 소스
VO(DTO)에 어노테이션을 통해 유효성 체크 할 부분을 명시해 줍니다.
@Data
@AllArgsConstructor
public class User {
private Integer id;
@NotBlank(message="이름을 입력해주세요.")
@Size(min = 2, message = "Name은 2글자 이상 입력해 주세요.")
private String name;
@Min(0, "나이는 0보다 커야 합니다.")
private int age;
@Email("이메일 형식이 잘못되었습니다.")
private int email;
@Past(message = "등록일은 미래 날짜를 입력하실 수 없습니다.")
private Date joinDate;
}
Controller에서 유효성이 필요한 부분에서 주로 @RequestBody 앞에 @Valid 어노테이션 입력해 줍니다.
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
User savedUser = userDaoService.save(user);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedUser.getId())
.toUri();
// 반환 값을 201 Created 준다. 인자로 location을 넘겨주면, 헤더에 Location이 추가된다.
return ResponseEntity.created(location).build();
}
VO(DTO)에서 명시해 놓은 값에서 문제가 발생 했을 경우 예외처리를 통해 결과 값을 받아 보실 수 있습니다.
@ControllerAdvice 어노테이션을 통해 Controller에서 발생한 예외처리를 진행합니다.
@ControllerAdvice를 간단히 설명하면 Controller에서 @RequestMapping가 달린 메서드 실행 중 발생한 예외를 가로채는 exceptions interceptor라고 생각 하시면 됩니다.
또한 ResponseEntity에서 발생된 예외상황을 처리하기위해 ResponseEntityExceptionHandler 상속 받고
예외 응답 객체를 만들어 ResponseEntity에 담아 처리해주면 조금 더 상세하게 유효성 체크를 할 수 있습니다.
@ControllerAdvice
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), "Validation failed", ex.getBindingResult().toString());
return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
}
}
이번 포스팅에는 SpringBoot에서 유효성 체크 하는 방법을 정리 해보았는데요
해당 Full Source는 아래 Git주소를 통해서 확인 부탁드립니다!!
여기까지 지루한 글 읽어주셔서 감사합니다ㅎㅎ
https://github.com/LuckyStrike1989/restful-web-service