유효성 검증은 요청한 데이터가 설정해둔 조건에 충족하는지 확인하는 작업이다.
프론트에서만 유효성 검사를 하는 것은 보안상 위험하므로, 프론트와 백엔드 모두 해주는 것이 좋다.
유효성 검사가 필요한 Request객체에 어노테이션을 사용해 유효성 검사를 적용할 수 있다.
1. @Valid
빈 검증기를 이용해 객체의 제약 조건을 검증하도록 지시하는 어노테이션이다. 객체의 필드에 달린 어노테이션으로 편리하게 검증을 한다.
@Valid를 사용하기 위해서는 의존성 설정을 해주어야 한다.
implementation 'org.springframework.boot:spring-boot-starter-validation'
컨트롤러 메소드에 @Valid를 붙여주면 유효성 검증이 진행된다.
@PostMapping("/register")
public ResponseEntity<Void> register(@RequestBody @Valid UserRequest userRequest) {
}
@Valid는 ArgumentResolver를 통해 진행되기 때문에 기본적으로 컨트롤러에서만 동작하며, 다른 계층에서는 검증이 되지 않는다. 다른 계층에서 파라미터를 검증하려면 @Validated와 결합하여야 한다.
유효성 검증에 실패하면 MethodArgumentNotValidException이 발생한다.
* 제약 조건 어노테이션
@NotNull : null인지 아닌지
@NotEmpty : null, 빈스트링인지 아닌지 (""은 허용)
@NotBlank : null, 빈스트링, 공백 아닌지
@AssertTrue : true인지
@Size : 주어진 값 사이에 해당하는지
@Min : 해당값이 주어진 값보다 작지 않은지
@Max : 해당값이 주어진 값보다 큰지
@Pattern : 해당값이 주어진 패턴과 일치하는지
2. @Validated
유효성 검증은 컨트롤러에서 최대한 처리하는 것이 좋지만, 다른 곳에서 검증해야할 수 있다. 이때 @Validated는 AOP 기반으로 메소드 요청을 가로채서 유효성 검증을 진행한다. JSR 표준 기술이 아니며 Spring 프레임워크에서 제공하는 어노테이션이다.
@Service
@Validated
public class UserService
public void register(@Valid UserRequest userRequest) {
}
}
클래스에는 @Validated를 붙여주고, 메소드에는 @Valid를 붙여준다.
유효성 검증에 실패하면 ConstraintViolationException이 발생한다.