241112 TIL - @Valid와 @Validated의 차이점

J_log·3일 전
0
post-thumbnail

Java 어플리케이션에서 입력 값을 검증하는 작업은 데이터 무결성을 보장하고 예상치 못한 오류를 방지하는데 매우 중요하다 !
@Valid와 @Validated는 둘 다 Java 어플리케이션에서 입력 값을 검증할 때 사용하는 어노테이션인데 오늘은 배운 내용을 복습하며 둘의 차이점을 정리해 볼 예정이다.

@Valid

@Valid는 주로 컨트롤러 레이어에서 요청 객체의 필드를 검증할 때 사용된다. 이를 통해 HTTP 요청으로 들어온 데이터가 올바른지 검사할 수 있다. 예른 들면, 이름이 NotNull인지, 공백이 있는지, 이메일 형식이 맞는지 등등

자주 사용되는 검증 어노테이션

  • @NotNull : 필드가 null이 아닌지 확인.
  • @NotBlank : 문자열 필드가 null이 아니고 공백이 아닌지 확인.
  • @Size(min=, max=) : 필드의 길이나 크기를 제한.
  • @Email : 이메일 형식이 유효한지 확인.

외에도 수많은 검증 어노테이션들이 있으니 상황에 맞게 찾아보면서 사용하면 좋을 것 같다.
공식 문서 :
https://jakarta.ee/specifications/bean-validation/3.0/apidocs/


@Validated

@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 "상품 수정이 완료되었습니다.";
    }

}

@Valid와 @Validated의 차이점

  • 기본 검증 vs 그룹 기반 검증 : @Valid는 일반적인 객체 검증에 사용되며 그룹을 지정할 수 없다. 반면에 @Validated는 그룹 기반 검증이 가능하다.

  • 사용 위치 : @Valid는 주로 컨트롤러에서 요청 객체를 검증할 때 사용하고, @Validated는 서비스 레이어에서 다양한 상황에 따라 유효성 검증을 나누고 싶을 때 사용한다.

    어노테이션설명사용 위치그룹 검증
    @Valid기본 유효성 검증 수행주로 컨트롤러불가능
    @Validated그룹 기반 유효성 검증 가능서비스 레이어가능
post-custom-banner

0개의 댓글