Notice
suyeonme
[Spring] @Valid로 객체의 유효성 검사하기 본문
@Valid, @Validated
javax.validation 패키지에 있는 @Valid 어노테이션을 사용하여 @RequestBody 객체의 유효성을 검사할 수 있다.
스프링부트 2.3버전 이상의 버전에서는 spring-boot-starter-web의 의존성이였던 validation이 제거되었다. 따라서 직접 의존성을 추가해주어야한다.
// build.gradle
dependencies {
//...
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation'
}
@Valid
- javax.validation 패키지에 속하는 어노테이션으로 JSR-303 자바 표준 스펙이다.
- Controller의 메소드에 대한 유효성을 검증한다. (ArgumentResolver를 통해 진행)
- 유효성 검증에 실패할 경우, MethodArgumentNotValidException 예외가 발생한다.
// Controller
@PostMapping
public ResponseEntity<UserResponse> createUser(@Valid @RequestBody UserRequest userRequest) {
// ...
return new ResponseEntity<UserResponse>(user, HttpStatus.OK);
}
// UserRequest 객체
@Getter @Setter
public class UserDetailRequest {
@NotNull(message = "Firstname cannot be null.")
private String firstName;
@NotNull(message = "Lastname cannot be null.")
private String lastName;
@NotNull(message = "Email cannot be null.")
@Email
private String email;
@NotNull(message = "Password cannot be null.")
@Size(min = 8, max = 16, message = "Password must be equal or grater than 8 characters and less than 16 characters.")
private String password;
}
@Validated
- org.springframework.validation.annotation에 속하는 어노테이션으로, 스프링 프레임워크에서 제공한다.
- @Valid의 기능을 포함하며 추가적으로 유효성을 검사할 옵션에 대한 그룹을 지정할 수 있다.
- AOP(Aspect Oriented Programming)를 기반으로 메서드의 요청을 가로채서 유효성 검사를 한다. 스프링 빈의 유효성 검증을 위해 사용되며 클래스에는 @Validated를, 메소드에는 @Valid를 붙여주어야 한다.
- 유효성 검증에 실패할 경우, ConstraintViolationException 예외가 발생한다.
@Service
@Validated
public class UserService {
public void createUser(@Valid UserRequest user) {
//...
}
}
유효성 검사 어노테이션 종류
유효성 검사를 위한 javax.constraint의 어노테이션 목록이다.
어노테이션 | 종류 | 설명 | 예시 |
@NotBlank | String | null이 아니며 공백이 아닌 문자를 하나 이상 포함한다. | |
@NotEmpty | String | null 이거나 빈 문자열이 아니어야 한다. | |
@NotNull | 모두 | null이 아닌 값이다. | |
@Null | 모두 | null값이다. | |
@Max | int | 해당값보다 작거나 같아야한다. | @Max(value = 100) |
@Min | int | 해당값보다 크거나 같아야한다. | @Max(value = 1) |
@DecimalMax | String | 해당값보다 작거나 같아야한다. | @DecimalMax(value = "100") |
@DecimalMin | String | 해당값보다 크거나 같아야한다. | @DecimalMin(value = "1") |
@Positive | int | 양수인 값이다. | |
@PositiveOrZero | int | 0이거나 양수인 값이다. | |
@Negative | int | 음수인 값이다. | |
@NegativeOrZero | int | 0이거나 음수인 값이다. | |
String | 올바른 형식의 이메일 주소여야한다. | ||
@Future | Date | Now 보다 미래의 날짜, 시간이어야 한다. | |
@FutureOrPresent | Date | Now 거나 미래의 날짜, 시간이어야 한다. | |
@Past | Date | Now 보다 과거 의의 날짜, 시간이어야 한다. | |
@PastOrPresent | Date | Now 거나 과거의 날짜, 시간이어야 한다. | |
@AssertTrue | boolean | 값이 항상 True여야 한다. | |
@AssertFalse | boolean | 값이 항상 False여야 한다. | |
@Size | int | 값이 min과 max사이에 있어야한다. | @Size(max = 10, min = 1) |
'프로그래밍👩🏻💻 > Spring' 카테고리의 다른 글
[Spring Cloud] Eureka란? (0) | 2023.01.24 |
---|---|
[Spring Boot] @ControllerAdvice, @ExceptionHandler로 Exception Handling하기 (0) | 2023.01.10 |
[Spring Boot] 로그(Log) (0) | 2022.11.08 |
[Spring] Bean Scope 종류 (0) | 2022.06.05 |
[Spring] Controller의 요청/응답 관련 애노테이션 (0) | 2022.06.05 |
Comments