Java 어플리케이션에서 입력 값을 검증하는 작업은 데이터 무결성을 보장하고 예상치 못한 오류를 방지하는데 매우 중요하다 !
@Valid와 @Validated는 둘 다 Java 어플리케이션에서 입력 값을 검증할 때 사용하는 어노테이션인데 오늘은 배운 내용을 복습하며 둘의 차이점을 정리해 볼 예정이다.
@Valid는 주로 컨트롤러 레이어에서 요청 객체의 필드를 검증할 때 사용된다. 이를 통해 HTTP 요청으로 들어온 데이터가 올바른지 검사할 수 있다. 예른 들면, 이름이 NotNull인지, 공백이 있는지, 이메일 형식이 맞는지 등등
외에도 수많은 검증 어노테이션들이 있으니 상황에 맞게 찾아보면서 사용하면 좋을 것 같다.
공식 문서 :
https://jakarta.ee/specifications/bean-validation/3.0/apidocs/
@Validated는 Spring에서 제공하는 어노테이션으로 특정 그룹에 기반하여 유효성 검증을 수행할 수 있게 한다. @Validated는 @Valid와 유사하지만 주로 서비스 레이어에서 그룹 기반 검증을 수행할 때 사용된다. 예를 들면, 생성할 때는 일부 필드만 검증하고 수정할 때는 다른 필드를 검증해야 한다면 @Validated를 사용할 수 있다. (그룹은 클래스나 인터페이스로 정의하며, 유효성 검증 어노테이션에 groups 속성을 사용하여 지정할 수 있다)
// 저장용 group
public interface SaveCheck {
}
// 수정용 group
public interface UpdateCheck {
}
@Data
public class ProductRequestDtoV2 {
// 저장, 수정 @NotBlank Validation 적용
@NotBlank(groups = {SaveCheck.class, UpdateCheck.class})
private String name;
// 사용하는 모든곳에서 @NotNull Validation 적용
@NotNull
// 저장만 @Range 반영
@Range(min = 10, max = 10000, groups = SaveCheck.class)
private Integer price;
@NotNull
@Range(min = 1, max = 999)
private Integer count;
}
@Slf4j
@RestController
public class ProductController {
@PostMapping("/v2/product")
public String save(
// 저장 속성값 설정
@Validated(SaveCheck.class) @ModelAttribute ProductRequestDtoV2 requestDtoV2
) {
log.info("생성 API가 호출 되었습니다.");
// Validation 성공시 repository 저장로직 호출
return "상품 생성이 완료되었습니다";
}
@PutMapping("/v2/product/{id}")
public String update(
@PathVariable Long id,
// 수정 속성값 설정
@Validated(UpdateCheck.class) @ModelAttribute ProductRequestDto test
) {
log.info("수정 API가 호출 되었습니다.");
// Validation 성공시 repository 수정로직 호출
return "상품 수정이 완료되었습니다.";
}
}
기본 검증 vs 그룹 기반 검증 : @Valid는 일반적인 객체 검증에 사용되며 그룹을 지정할 수 없다. 반면에 @Validated는 그룹 기반 검증이 가능하다.
사용 위치 : @Valid는 주로 컨트롤러에서 요청 객체를 검증할 때 사용하고, @Validated는 서비스 레이어에서 다양한 상황에 따라 유효성 검증을 나누고 싶을 때 사용한다.
어노테이션 | 설명 | 사용 위치 | 그룹 검증 |
---|---|---|---|
@Valid | 기본 유효성 검증 수행 | 주로 컨트롤러 | 불가능 |
@Validated | 그룹 기반 유효성 검증 가능 | 서비스 레이어 | 가능 |