..
@Valid와 @Validated 차이점 완벽 비교
1. 개요 (Overview)
사용자의 입력을 검증하는 것은 애플리케이션의 안정성을 위한 필수 과정입니다. 자바 생태계에서는 Bean Validation API를 통해 이를 지원하며, 스프링에서는 @Valid와 @Validated라는 두 가지 핵심 어노테이션을 사용하여 검증을 트리거합니다.
두 어노테이션은 비슷해 보이지만, 소속된 프레임워크와 제공하는 기능의 범위가 다릅니다.
2. @Valid (Java Standard)
- 소속:
jakarta.validation(과거javax.validation) - 용도: 자바 표준 빈 검증 규격입니다. 주로 메소드의 파라미터나 필드 객체의 정합성을 체크할 때 사용합니다.
- 특징: 기본적인 빈 검증 로직을 수행하며, Spring MVC 컨트롤러의 RequestBody나 Form 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를 사용하는 것이 정석입니다.