..

@Valid와 @Validated 차이점 완벽 비교

1. 개요 (Overview)

사용자의 입력을 검증하는 것은 애플리케이션의 안정성을 위한 필수 과정입니다. 자바 생태계에서는 Bean Validation API를 통해 이를 지원하며, 스프링에서는 @Valid@Validated라는 두 가지 핵심 어노테이션을 사용하여 검증을 트리거합니다.

두 어노테이션은 비슷해 보이지만, 소속된 프레임워크와 제공하는 기능의 범위가 다릅니다.

2. @Valid (Java Standard)

  • 소속: jakarta.validation (과거 javax.validation)
  • 용도: 자바 표준 빈 검증 규격입니다. 주로 메소드의 파라미터나 필드 객체의 정합성을 체크할 때 사용합니다.
  • 특징: 기본적인 빈 검증 로직을 수행하며, Spring MVC 컨트롤러의 RequestBodyForm Data를 검증하는 가장 기본적인 도구입니다.
@PostMapping("/user")
public ResponseEntity<?> create(@Valid @RequestBody UserDTO user) {
    return ResponseEntity.ok("Valid User");
}

3. @Validated (Spring Framework)

  • 소속: org.springframework.validation.annotation
  • 용도: 스프링에서 제공하는 전용 어노테이션으로, 표준 @Valid 기능 위에 확장 기능을 덧붙인 것입니다.
  • 핵심 기능 (Validation Groups): 동일한 객체라도 상황에 따라 다른 검증 규칙을 적용해야 할 때가 있습니다. (예: 등록 시엔 필수지만, 수정 시엔 선택인 필드 등) @Validated는 이 그룹화 검증을 지원합니다.
// 등록 그룹인 경우에만 검증 수행
@PostMapping("/register")
public ResponseEntity<?> register(@Validated(CreateGroup.class) @RequestBody UserDTO user) {
    return ResponseEntity.ok("Registered");
}

4. 주요 차이점 한눈에 보기

구분 @Valid @Validated
소속 자바 표준 (Jakarta/Javax) 스프링 프레임워크
그룹 검증 지원하지 않음 지원함
사용 위치 아규먼트, 필드 등 컨트롤러, 서비스, 리포지토리 등
동작 원리 ArgumentResolver에 의한 처리 AOP 프록시 기반의 처리 가능

일반적인 컨트롤러 단의 단순 검증이라면 @Valid로 충분합니다. 하지만 서비스 레이어에서 검증을 수행하거나, 특정 그룹별로 다른 검증 룰을 적용해야 하는 고급 시나리오라면 @Validated를 사용하는 것이 정석입니다.