@Valid는 주로 Request Body 를 검증하는 데 사용된다.
Controller 단에서 파라미터를 받을 때 @Valid 를 적용한 해당 파라미터의 값이 유효한 지 검증한다.
// Controller
@PostMapping()
public String signUp(@Valid @RequestBody final UserRequestDto request) {
...
}
// DTO
public record UserRequestDto (
@Email
String email,
@NotBlank
String password,
@NotNull
Address address
){
}
위와 같이 구현되었다고 가정할 때 아래와 같은 Request DTO 가 들어오면 Address 의 값이 null 이더라도 정상적인 요청으로 받아드린다.
{
"email": "test@test.com",
"password": "test",
"address": {
"city": "",
"zipCode": null
}
}
여기서 Nested DTO 를 검증하려면 Address 에 NotNull 대신 @Valid 을 붙이면 정상적으로 동작한다.
※ Nested DTO 는 DTO 안에 또 다른 DTO 를 말한다.
// DTO
public record UserRequestDto (
@Email
String email,
@NotBlank
String password,
@Valid // Valid 로 수정!!
Address address
){
}
@Validated는 주로 쿼리 스트링이나 쿼리 파라미터, request body 에서 사용된다.
쿼리 스트링이나 파라미터를 검증해야 할 경우가 있다고 가정해보자. 아래와 같이 Validated 는 클래스 레벨에 선언 후 유효성 검사하는 어노테이션을 추가하는 형식이다. 만약 클래스 레벨에 @Validated 이 없다면, @Min 은 동작하지 않는다.
// Controller
@RestController
@RequestMapping("/api/users")
@Validated
public class UserController {
@GetMapping("/{userId}")
public String find(@PathVariable @Min(1) final Long id) {
...
}
}
만약 Controller 가 아닌 Service 단에서 검증을 한다고 가정해보자. 이때는 Service 단에 Validated 를 선언하고 파라미터에 Valid 를 적용하면 된다.
// Service
@Service
@Validated
@Transactional
public class UserService {
@Transactional
public void singUp(@Valid final UserRequestDto request) {
...
}
}
✓ 클래스 레벨은 → @Validated / 메소드에는 → @Valid 을 사용한다.
@Valid@Validated