SPRING/스프링부트

@Valid vs @Validated 차이는?

추억을 백앤드하자 2025. 6. 4. 16:36
728x90
반응형
SMALL

@Valid vs @Validated 차이는?

항목 @Valid @Validated
제공 주체 Java 표준(JSR-303 / 380) Spring Framework
검증 그룹 ❌ 지원하지 않음 ✅ 그룹 검증 지원 (groups = ...)
주 사용처 단순 검증 상황별 조건이 필요한 복잡한 검증
위치 컨트롤러, 메서드 파라미터 등 컨트롤러, 메서드, 클래스, 서비스 등

@Valid는 단순 검증, @Validated는 그룹 검증이 필요할 때 주로 사용됩니다


@Valid 사용 예제

import jakarta.validation.constraints.NotBlank;

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class UserProfileUpdateRequest {
    @NotBlank(message = "전화번호는 필수 입력 값입니다.")
    private String phone;

    private String address;
    private String email;
    private String name;
}

import jakarta.validation.Valid;

@PutMapping
public ResponseEntity<UserProfileUpdateResponse> updateUser(@Valid @RequestBody UserProfileUpdateRequest updateRequest) {
    log.info("request");
    UserProfileUpdateResponse result = userProfileService.updateUser(updateRequest);

    return ResponseEntity.ok(result);
}

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleValidationException(MethodArgumentNotValidException ex) {
    String errorMsg = ex.getBindingResult().getFieldError().getDefaultMessage();
    return ResponseEntity.badRequest().body(errorMsg);
}

@Validate 사용 예제

public interface OnCreate {}
public interface OnUpdate {}

@Getter
@Setter
public class UserCreateRequest {

    @NotBlank(message = "이름은 필수입니다.", groups = OnCreate.class)
    private String name;

    @Email(message = "이메일 형식이 아닙니다.", groups = {OnCreate.class, OnUpdate.class})
    private String email;
}

@PostMapping
public ResponseEntity<String> createUser(
        @Validated(OnCreate.class) @RequestBody UserCreateRequest request) {
    // OnCreate 그룹에 해당하는 유효성 검사만 실행됨
    return ResponseEntity.ok("created");
}

@PutMapping
public ResponseEntity<String> updateUser(
        @Validated(OnUpdate.class) @RequestBody UserCreateRequest request) {
    // OnUpdate 그룹에 해당하는 유효성 검사만 실행됨
    return ResponseEntity.ok("updated");
}

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleValidationException(MethodArgumentNotValidException ex) {
    String errorMsg = ex.getBindingResult().getFieldError().getDefaultMessage();
    return ResponseEntity.badRequest().body(errorMsg);
}
728x90
반응형
LIST