Spring - Bean Validation - 한계

현시기얌·2021년 7월 20일
0

Bean Validation

목록 보기
4/5

1. Bean Validation - 한계

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 대신 폼 전송을 위한 별도의 모델 객체 사용

2. Bean Validation - groups

사용법

1. 등록용, 수정용 Interface를 생성한다.

public interface SaveCheck {

}
...
public interface UpdateCheck {

}

2. Entity에 Valid 어노테이션에 위에서 생성한 인터페이스를 groups로 지정한다.

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;

3. Controller에서 @Validated에 각 해당 인터페이스를 지정한다.

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편 : 백엔드 웹 개발 활용 기술

profile
현시깁니다

0개의 댓글

관련 채용 정보