controller로 들어온 request에 대해 검증할 때
@PostMapping
public ResponseEntity<LineCreateResponse> createLine(@Valid @RequestBody LineCreateRequest request) {
Line createdLine = lineService.createNewLine(request.toDto());
LineCreateResponse response = LineCreateResponse.from(createdLine);
return ResponseEntity.created(URI.create("/lines/" + createdLine.getId())).body(response);
}
이런식으로 검증하고자 하는 객체 앞에 @Valid
를 붙여주기도 하지만,
@PostMapping
public ResponseEntity<LineCreateResponse> createLine(@Validated @RequestBody LineCreateRequest request) {
Line createdLine = lineService.createNewLine(request.toDto());
LineCreateResponse response = LineCreateResponse.from(createdLine);
return ResponseEntity.created(URI.create("/lines/" + createdLine.getId())).body(response);
}
이런식으로 @Validated
를 붙여주기도 한다.
미션을 진행하다보니 이 두 어노테이션이 어떤 차이가 있는지 궁금해졌다.
이번 글에서는 @Valid
와 @Validated
의 차이에 대해 알아보려 한다!
둘 다 Validator를 이용해 객체의 제약 조건을 검증하도록 지시하는 어노테이션이다.
아마 다들 직접 Validator를 만들기 보다는 Bean Validation
을 이용해 편하게 검증을 처리하는 것에 익숙할 것이다.
(스프링 부트는 LocalValidatorFactoryBean을 자동으로 글로벌 Validator로 등록한다.
이 Validator는 @NotNull과 같은 어노테이션을 보고 검증을 수행한다.)
참고) Bean Validation : 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화 한 것. 애노테이션만으로 검증 로직을 매우 편리하게 적용할 수 있다.
public class Item {
private Long id;
@NotBlank // "" or " " or null 불가
private String itemName;
@NotNull // null 불가
@Range(min = 1000, max = 1000000) // 1000 <= x <= 1000000
private Integer price;
@NotNull
@Max(9999) // x <= 9999
private Integer quantity;
public Item() {
}
public Item(String itemName, Integer price, Integer quantity) {
this.itemName = itemName;
this.price = price;
this.quantity = quantity;
}
...
}
우리가 미션에서 자주 사용한 저 @NotNull, @NotBlank 등이 다 Bean Validation이 제공하는 어노테이션이다!
@Controller
public class UserController {
@PostMapping("/")
public String add(@Valid Request request) {
...
}
}
@Service
@Validated
public class UserService {
public void addUser(@Valid AddUserRequest addUserRequest) {
...
}
}
@Validated기반이기 때문에~
@Valid기반이기 때문에~
+) @RequestBody여도 @Validated를 클래스 레벨에 붙이면 ConstratinVoilationException이 발생하는지 확인해봤는데, 그대로 MethodArgumentNotValidException이 터졌다.
@Service
@Validated
public class UserService {
public void addUser(@Valid AddUserRequest addUserRequest) {
...
}
}
@Controller
public class UserController {
@PostMapping("/")
public String add(@Valid Request request) {
...
}
}
https://mangkyu.tistory.com/174
https://kdhyo98.tistory.com/81
https://bepoz-study-diary.tistory.com/413
https://kapentaz.github.io/spring/Spring-Boo-Bean-Validation-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90/#
https://doomdevlog.tistory.com/22
https://meetup.nhncloud.com/posts/223
정리 너무 잘해주셨네요.... 감동입니다