스프링 MVC 2편(백엔드 웹 개발 활용 기술)

Ch05. 검증(Bean Validation) - Bean Validation(groups)

webmaster 2022. 3. 16. 12:18
728x90
  • 두 가지 방법을 통해 수정 요구사항과 등록 요구사항에 각각 다른 검증을 실행할 수 있다.
    • BeanValidation의 groups 기능을 사용한다.
    • Item을 직접 사용하지 않고, ItemSaveForm, ItemUpdateForm 같은 폼 전송을 위한 별도의 모델 객체를 만들어서 사용한다.
  • BeanValidation을 Groups를 사용해보자

check용 인터페이스

public interface UpdateCheck {

}
public interface SaveCheck {

}

Check용 인터페이스 마다 다르게 동작하도록 Validation 정의

@Data
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;

    public Item() {
    }

    public Item(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
}

각각의 검증이 다른 Group에서 동작하도록 설정

@PostMapping("/add")
public String addItem2(@Validated(SaveCheck.class) @ModelAttribute Item item, BindingResult bindingResult,
    RedirectAttributes redirectAttributes, Model model) { 
    //SaveCheck 에 관련된거만 적용된다
    //groups 기능을 사용하기 위해서는 @Validated 를 사용해야한다
    
}

@PostMapping("/{itemId}/edit")
public String editV2(@PathVariable Long itemId, @Validated(UpdateCheck.class) @ModelAttribute Item item, BindingResult bindingResult) {
    //특정 필드가 아닌 복합 룰 검증
}
  • @Valid 에는 groups를 적용할 수 있는 기능이 없다. 따라서 groups를 사용하려면 @Validated를 사용해야 한다
  • groups 기능을 사용해서 등록과 수정시에 각각 다르게 검증을 할 수 있었다. 그런데 groups 기능을 사용하니 Item 은 물론이고, 전반적으로 복잡도가 올라갔다.
  • 사실 groups 기능은 실제 잘 사용되지는 않는데, 그 이유는 실무에서는 주로 다음에 등장하는 등록용 폼 객체와 수정용 폼 객체를 분리해서 사용하기 때문이다
728x90