// dependencies..
++ implementation 'org.springframework.boot:spring-boot-starter-validation:2.3.3.RELEASE'
@PostMapping("/api/users")
public ResponseEntity<Void> createUser(@Valid @RequestBody UserCreateRequest request) {
Long userId = userService.save(request);
return ResponseEntity
.created(URI.create(String.format("/api/users/%d", userId))
.build();
}
@NoArgsConstructor
@Data
public class UserCreateRequest {
@NotBlank(message = "이름은 필수 입력입니다.")
@Length(max = 20)
private String username;
@NotBlank(message = "비밀번호는 필수 입력입니다.")
private String password;
@NotBlank(message = "이메일은 필수 입력입니다.")
@email(message = "이메일 형식을 지켜주세요.")
private String email;
}
NotNull vs NotEmpty vs NotBlank ?
- NotNull : 값이 진짜 null인지만 체크를 한다. NotNull 클래스의 isValid 메서드는 다음과 같다.
public boolean isValid(Object object) { return object != null; }
- NotEmpty : 값이 진짜 공백인지를 확인한다. NotEmpty 클래스의 isValid 메서드는 다음과 같다.
public boolean isValid(CharSequence charSequence) { return charSequence.toString().trim().length() > 0; }
- @NotBlank : 값이 null인지를 체크함과 동시에 공백인지 여부도 확인해서 유효성 검사를 한다.
public boolean isValid( CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext ) { if (charSequence == null ) { return true; } return charSequence.toString().trim().length() > 0; }
Spring Validation은 POST 요청으로 넘어오는 form 객체나 DTO에 대해서 값의 형식에 대한 유효성 검증을 가능하게 해준다. 이는 도메인 규칙이 가득한 엔티티 객체가 복잡해지는 것을 막아주고, 곳곳에 분산된 중복 validation 코드를 제거해주는 장점이 있다.
대부분은 값의 유무를 확인하는 validation을 많이 사용한다. 유저가 요청한 값이 공백이 아니어야 한다면 @NotBlank
를 쓰는 것이 일석이조의 수확을 누릴 수 있을 것이다.
validation은 이밖에도, size, min, max, digits, future, negative 등등의 유효성검증 도구를 제공한다. 상황에 맞는 validation을 잘 활용하면 엔티티 코드의 복잡성을 많이 낮추고 값에 대한 에러발생 가능성을 낮출 수 있을 것이다.