Spring Validation

bp.chys·2020년 5월 20일
4

Spring Framework

목록 보기
9/15

Spring Validation이란?

  • 유효성 검사는 보통 객체가 생성될 때 수행되어 값이 보장된 상태에서 객체 생성을 허용하기 위한 용도로 사용한다.
  • 요청을 통해 들어오는 form 객체 (or DTO)에 대해 값의 유효성 검사(validation)하는 것은 많은 이점을 준다.
    • 도메인 규칙과 관련된 validation과 값의 형식에 관한 validation을 분리할 수 있다.
    • 애플리케이션 전체에 분산되어 있는 중복된 validation 코드를 모듈화하여 처리할 수 있다.

Demo

Validation 의존성

  • Java에서는 2009년부터 Bean Validation이라는 데이터 유효성 검사 프레임워크를 제공하고 있다.
  • gradle을 사용한다면 아래와 같이 의존성을 추가하면 된다.
// dependencies..

++ implementation 'org.springframework.boot:spring-boot-starter-validation:2.3.3.RELEASE'

@Valid

  • DTO를 받는 controller의 인자앞에 @Valid 어노테이션을 추가한다.
@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();
}

Validation Condition in DTO

  • DTO에서 validation이 필요한 속성에 어노테이션을 추가하면된다.
  • 값이 지정한 validation 조건을 만족하지 못한다면, 명시한 message와 함께 400 Status code가 응답으로 반환된다.
@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을 잘 활용하면 엔티티 코드의 복잡성을 많이 낮추고 값에 대한 에러발생 가능성을 낮출 수 있을 것이다.

참고자료

controller validation
NotNull vs NotEmpty vs NotBlank

profile
하루에 한걸음씩, 꾸준히

0개의 댓글