@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.");
}
}
- 여기서
@Valid
는Person
객체의 필드들이 유효한지 검사하며, 유효하지 않으면 오류를 발생시킵니다. @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 |