[Spring] 스프링 MVC 2편 5-9. Bean Validation - groups

강우엉·2023년 8월 17일

Spring

목록 보기
181/359

동일한 모델 객체를 등록할 때와 수정할 때 각각 다르게 검증하는 방법을 알아보자.

방법 2가지

  • BeanValidation의 groups 기능을 사용한다.
  • Item을 직접 사용하지 않고, ItemSaveForm, ItemUpdateForm 같은 폼 전송을 위한 별도의 모델 객체를 만들어서 사용한다

BeanValidation groups 기능 사용
이런 문제를 해결하기 위해 Bean Validation은 groups라는 기능을 제공한다.
예를 들어서 등록시에 검증할 기능과 수정시에 검증할 기능을 각각 그룹으로 나누어 적용할 수 있다.

저장용 groups 생성

package hello.itemservice.domain.item;
	public interface SaveCheck {
}

수정용 groups 생성

package hello.itemservice.domain.item;
	public interface UpdateCheck {
}

Item - groups 적용

package hello.itemservice.domain.item;

import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.hibernate.validator.constraints.ScriptAssert;

import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Data
//@ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000")
public class Item {

    @NotNull(groups = UpdateFCheck.class) //수정 요구사항
    private Long id;

    @NotBlank(groups = {SaveCheck.class, UpdateFCheck.class})
    private String itemName;

    @NotNull(groups = {SaveCheck.class, UpdateFCheck.class})
    @Range(min = 1000, max = 1000000, groups = {SaveCheck.class, UpdateFCheck.class})
    private Integer price;

    @NotNull(groups = {SaveCheck.class, UpdateFCheck.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;
    }
}

ValidationItemControllerV3 - 저장 로직에 SaveCheck Groups 적용

@PostMapping("/add")
public String addItemV2(@Validated(SaveCheck.class) @ModelAttribute Item item,
BindingResult bindingResult, RedirectAttributes redirectAttributes) {
 //...
}

ValidationItemControllerV3 - 수정 로직에 UpdateCheck Groups 적용

@PostMapping("/{itemId}/edit")
public String editV2(@PathVariable Long itemId, @Validated(UpdateCheck.class)
@ModelAttribute Item item, BindingResult bindingResult) {
 //...
}
profile
우엉이의 코딩 성장일기💻

0개의 댓글