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의 유연한 검증이 필요한 모든 시나리오.
Edit this page

On this Page