본문 바로가기
Spring Framework

@Valid와 @Validated

by xogns93 2024. 10. 14.

@Valid@Validated는 모두 Spring에서 유효성 검사를 할 때 사용되는 애노테이션이지만, 적용 범위와 사용 방식에서 차이가 있습니다. 각 애노테이션의 차이점과 사용 방법에 대해 설명하겠습니다.

1. @Valid

@Valid는 자바 표준 유효성 검사(JSR-303, JSR-380)에서 사용되는 애노테이션입니다. 이 애노테이션은 Spring에서 자주 사용되며, Bean Validation API를 통해 객체의 필드 값들을 검사할 수 있습니다.

  • 주 용도: 자바 Bean의 필드에 대해 정의된 제약 조건(예: @NotNull, @Size, @Email 등)을 검사합니다.
  • 위치: 주로 컨트롤러 메서드의 매개변수에 사용하거나 객체 내부의 필드 검증에 사용합니다.
  • 적용 대상: 자바 표준 유효성 검사 애노테이션을 사용한 클래스나 객체의 유효성 검사에 사용됩니다.

예시

import javax.validation.constraints.NotNull;

public class Person {
    @NotNull(message = "Name cannot be null")
    private String name;

    // getters and setters
}

@RestController
public class PersonController {

    @PostMapping("/createPerson")
    public ResponseEntity<String> createPerson(@Valid @RequestBody Person person, BindingResult result) {
        if (result.hasErrors()) {
            return ResponseEntity.badRequest().body("Validation errors occurred.");
        }
        return ResponseEntity.ok("Person created successfully.");
    }
}
  • 여기서 @ValidPerson 객체의 필드들이 유효한지 검사하며, 유효하지 않으면 오류를 발생시킵니다.
  • @NotNull 같은 유효성 검사 애노테이션이 사용된 필드를 검사합니다.

2. @Validated

@Validated는 Spring에서 제공하는 유효성 검사 애노테이션입니다. 이 애노테이션은 Spring의 유효성 검사 기능과 함께 사용할 수 있으며, 특정 검증 그룹을 지원하는 것이 주요 차이점입니다.

  • 주 용도: Spring의 유효성 검사 지원을 위한 애노테이션으로, 그룹 기반 검증이 가능하고, 좀 더 세밀한 유효성 검사 로직을 제어할 수 있습니다.
  • 위치: 클래스나 메서드 매개변수에서 사용할 수 있습니다.
  • 적용 대상: JSR-303/JSR-380 유효성 검사를 사용하는 것 외에, 검증 그룹을 사용하거나 서비스/비즈니스 로직에서 유효성 검사를 적용하고자 할 때 유용합니다.

예시

import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;

public class Person {

    @NotNull(message = "Name cannot be null", groups = Default.class)
    private String name;

    // getters and setters
}

@RestController
@Validated
public class PersonController {

    @PostMapping("/createPerson")
    public ResponseEntity<String> createPerson(@Validated @RequestBody Person person, BindingResult result) {
        if (result.hasErrors()) {
            return ResponseEntity.badRequest().body("Validation errors occurred.");
        }
        return ResponseEntity.ok("Person created successfully.");
    }
}

또는 그룹 기반 유효성 검사를 할 때:

import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;

public class Person {

    @NotNull(message = "Name cannot be null", groups = Default.class)
    private String name;

    @NotNull(message = "Age cannot be null", groups = AdvancedChecks.class)
    private Integer age;

    // getters and setters
}

@RestController
@Validated
public class PersonController {

    // 특정 검증 그룹을 명시하여 그룹 기반 검증 수행
    @PostMapping("/createPerson")
    public ResponseEntity<String> createPerson(@Validated(AdvancedChecks.class) @RequestBody Person person, BindingResult result) {
        if (result.hasErrors()) {
            return ResponseEntity.badRequest().body("Validation errors occurred.");
        }
        return ResponseEntity.ok("Person created successfully.");
    }
}
  • @Validated(AdvancedChecks.class)처럼 특정 검증 그룹을 지정하여 더 세밀한 검증을 수행할 수 있습니다.
  • @Validated를 클래스 레벨에 선언하면 해당 클래스의 모든 메서드가 유효성 검사를 사용할 수 있게 됩니다.

차이점 요약

특징 @Valid @Validated
표준 JSR-303, JSR-380 (Bean Validation) Spring의 유효성 검사 기능
검증 그룹 지원하지 않음 검증 그룹을 지원
적용 위치 메서드 매개변수, 필드 클래스나 메서드 매개변수
주 사용처 컨트롤러 매개변수, DTO/VO 검증 그룹 검증을 사용하는 경우

결론

  • @Valid는 자바 표준 유효성 검사를 위해 사용됩니다. 주로 단순한 객체의 필드 검증에 적합합니다.
  • @Validated는 Spring에서 제공하는 애노테이션으로, 검증 그룹을 지원하며 더 유연하게 유효성 검사를 제어할 수 있습니다. 검증 그룹이 필요하거나 서비스 레이어에서도 유효성 검사를 하고자 할 때 유용합니다.

'Spring Framework' 카테고리의 다른 글

ResponseEntity  (1) 2024.10.14
XMLHttpRequest(XHR) - 비동기 자바스크립트  (3) 2024.10.14
프록시와 어댑터  (0) 2024.10.08
스프링 웹 MVC  (0) 2024.10.08
필터와 밸브  (0) 2024.10.08