Spring Boot Validated
TMT@Valid
와 @Validated
는 Spring Boot에서 **유효성 검증(Validation)**을 수행할 때 사용되는 애노테이션이지만, 목적과 동작 방식에서 차이가 있습니다.
아래에서 각각의 특징과 사용법을 비교해 설명드리겠습니다.
1. @Valid
(JSR-303/349 표준)
- 패키지:
javax.validation.Valid
- 목적: 객체 그래프의 유효성 검증을 트리거합니다.
- 주요 특징:
- 컨트롤러 레벨에서 주로 사용됩니다 (예:
@RequestBody
검증). - 중첩된 객체(Nested Object)의 검증을 자동으로 수행합니다.
- 그룹 검증(Group Validation)을 지원하지 않습니다.
- 컨트롤러 레벨에서 주로 사용됩니다 (예:
- 예시:
@PostMapping("/users") public ResponseEntity<?> createUser(@Valid @RequestBody UserDto userDto) { // 유효성 검증 후 로직 실행 }
2. @Validated
(Spring 프레임워크 확장)
- 패키지:
org.springframework.validation.annotation.Validated
- 목적: 메서드/파라미터 레벨 유효성 검증과 그룹 검증을 지원합니다.
- 주요 특징:
- 클래스/메서드 레벨에 적용 가능합니다.
- **검증 그룹(Validation Groups)**을 지정할 수 있습니다.
public interface BasicInfo {} public interface DetailInfo {}
- 컨트롤러 외부(서비스, 리포지토리)에서 메서드 파라미터 검증이 가능합니다.
- 중첩 객체 검증을 위해
@Valid
와 함께 사용해야 합니다.
- 예시:
@Service @Validated // 클래스 레벨에서 활성화 public class UserService { public void updateUser( @Min(1) Long userId, @Valid @NotNull UserDto userDto // 중첩 객체 검증 ) { // 메서드 파라미터 유효성 검증 } }
3. @Valid
vs @Validated
비교표
구분 | @Valid | @Validated |
---|---|---|
출처 | JSR-303/349 (Bean Validation) | Spring Framework |
적용 레벨 | 메서드 파라미터 | 클래스, 메서드 |
그룹 검증 | ❌ 미지원 | ✔️ 지원 |
중첩 객체 검증 | ✔️ 자동으로 활성화 | ❌ @Valid 와 함께 사용해야 함 |
메서드 검증 | ❌ 컨트롤러 외부에서 사용 불가 | ✔️ 서비스/리포지토리에서 사용 가능 |
4. 그룹 검증(Validation Groups) 예시
- 그룹 인터페이스 정의:
public interface UserValidationGroup { interface BasicInfo {} interface DetailInfo {} }
- DTO에 그룹 지정:
public class UserDto { @NotBlank(groups = BasicInfo.class) private String name; @Email(groups = DetailInfo.class) private String email; }
- 컨트롤러에서 그룹 적용:
@PostMapping("/users/basic") public ResponseEntity<?> createBasicUser( @Validated(UserValidationGroup.BasicInfo.class) @RequestBody UserDto userDto ) { // BasicInfo 그룹만 검증 }
5. 주의사항
@Validated
없이 메서드 검증 불가:
서비스 계층에서 메서드 파라미터 검증을 하려면 반드시 클래스에@Validated
를 추가해야 합니다.@Service @Validated // 필수! public class UserService { public void getUser(@Min(1) Long userId) { ... } }
- 커스텀 유효성 검사기:
Validator
인터페이스를 구현하여 복잡한 검증 로직을 추가할 수 있습니다.
6. 결론
@Valid
- 기본적인 DTO 검증 (컨트롤러 레벨).
- 중첩 객체 검증이 필요한 경우.
@Validated
- 그룹 검증이 필요한 경우.
- 서비스/리포지토리 계층에서 메서드 파라미터 검증.
- Spring의 유연한 검증이 필요한 모든 시나리오.