ex) 데이터 등록할 때와 수정할 때 요구사항이 변경되었다.
등록 시 요구사항
- 타입 검증
- 가격,수량에 문자가 들어가면 검증 오류 처리- 필드 검증
- 상품명 : 필수, 공백 X
- 가격 : 1000원 이상, 1000000원 이하
- 수량 : 최대 9999
- 특정 필드의 범위를 넘어서는 검증
- 가격 * 수량의 합은 10000원 이상
수정 시 요구사항
- 수량 = 무제한
- 수정 시 id값 필수
public class Item {
@NotNull // 수정 요구 사항 추가
private Long id;
@NotBlank
private String itemName;
@NotNull
@Range(min= 1000, max= 1000000)
private Integer price;
@NotNull
// @Max(9999) 수정 요구 사항 추가
private Integer quantity;
}
다음과 같이 수정 사항을 추가하면 수정할 때는 문제가 없지만 등록할 때는 요구사항이 변경되었기 때문에 오류가 생길 수 있다.
ex) 등록할 때는 Id가 없음 but id는 현재 @NotNull 상태이기 때문에 오류 발생
ex) 초창기 수량은 9999개 제한이였지만 현재는 수량이 무제한이기 때문에 문제 발생
해결책
1. Bean Validation의 groups 기능 사용
2. Entity 대신 폼 전송을 위한 별도의 모델 객체 사용
public interface SaveCheck {
}
...
public interface UpdateCheck {
}
public class Item {
@NotNull(groups = UpdateCheck.class)
private Long id;
@NotBlank(groups = {SaveCheck.class, UpdateCheck.class})
private String itemName;
@NotNull(groups = {SaveCheck.class, UpdateCheck.class})
@Range(min= 1000, max= 1000000, groups = {SaveCheck.class, UpdateCheck.class})
private Integer price;
@NotNull(groups = {SaveCheck.class, UpdateCheck.class})
@Max(value = 9999, groups = SaveCheck.class)
private Integer quantity;
ex) 등록 Controller
@PostMapping("/add")
public String addItemV2(@Validated(SaveCheck.class)
@ModelAttribute Item item, BindingResult bindingResult,
RedirectAttributes redirectAttributes, Model model) {
ex) 수정 Controller
@PostMapping("/{itemId}/edit")
public String editV2(@Validated(UpdateCheck.class), @PathVariable Long itemId,
@ModelAttribute Item item, BindingResult bindingResult) {
등록시에는 SaveCheck에 해당하는 Valid 어노테이션만 검증이 적용되고 수정시에는 UpdateCheck에 해당하는 Valid 어노테이션만 검증이 적용된다.
@Valid에는 groups 기능이 존재하지 않아 사용할 수 없다.
또한 groups 기능 보다는 폼 전송을 위한 별도의 모델 객체 사용하는 것을 권장한다.
참고 : 스프링 MVC 2편 : 백엔드 웹 개발 활용 기술