목록Spring/Validation (26)
코드 그라데이션
Bean Validation - HTTP 메시지 컨버터 @Valid, @Validated 는 HttpMessageConverter (@RequestBody)에도 적용할 수 있다. ValidationItemApiController 생성 package hello.itemservice.web.validation; import hello.itemservice.domain.item.ItemSaveForm; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework...
Form 전송 객체 분리 - 개발 ITEM 원복 이제 Item 의 검증은 사용하지 않으므로 검증 코드를 제거해도 된다. @Data public class Item { private Long id; private String itemName; private Integer price; private Integer quantity; } ItemSaveForm - ITEM 저장용 폼 package hello.itemservice.domain.item; import lombok.Data; import org.hibernate.validator.constraints.Range; import javax.validation.constraints.Max; import javax.validation.constraints...
Form 전송 객체 분리 - 소개 ValidationItemV4Controller Q: 이름은 어떻게 지어야 하나요? 이름은 의미있게 지으면 된다. ItemSave 라고 해도 되고, ItemSaveForm , ItemSaveRequest , ItemSaveDto 등으로 사용해도 된다. 중요한 것은 일관성이다. Q: 등록, 수정용 뷰 템플릿이 비슷한데 합치는게 좋을까요? 한 페이지에 그러니까 뷰 템플릿 파일을 등록과 수정을 합치는게 좋을지 고민이 될 수 있다. 각각 장단점이 있으므로 고민하는게 좋지만, 어설프게 합치면 수 많은 분기문(등록일 때, 수정일 때) 때문에 나중에 유지보수에서 고통을 맛본다. 이런 어설픈 분기문들이 보이기 시작하면 분리해야 할 신호이다.
Bean Validation - groups 동일한 모델 객체를 등록할 때와 수정할 때 각각 다르게 검증하는 방법을 알아보자. 방법 2가지 BeanValidation의 groups 기능을 사용한다. Item을 직접 사용하지 않고, ItemSaveForm, ItemUpdateForm 같은 폼 전송을 위한 별도의 모델 객체를 만들어서 사용한다. BeanValidation groups 기능 사용 이런 문제를 해결하기 위해 Bean Validation은 groups라는 기능을 제공한다. 예를 들어서 등록시에 검증할 기능과 수정시에 검증할 기능을 각각 그룹으로 나누어 적용할 수 있다. 코드로 확인해보자. groups 적용 저장용 groups 생성 package hello.itemservice.domain.item..
Bean Validation - 한계 수정시 검증 요구사항 "데이터를 등록할 때와 수정할 때는 요구사항이 다를 수 있다." 수정 요구사항 적용 수정 시에는 Item 에서 id 값이 필수이고, quantity 도 무제한으로 적용할 수 있다. Item.java @Data public class Item { @NotNull //수정 요구사항 추가 111 private Long id; @NotBlank private String itemName; @NotNull @Range(min = 1000, max = 1000000) private Integer price; @NotNull //@Max(9999) //수정 요구사항 추가 222 private Integer quantity; public Item() { } p..
// 수정에 적용은 여기 @PostMapping("/{itemId}/edit") public String edit(@PathVariable Long itemId, @Validated @ModelAttribute Item item, BindingResult bindingResult) { //특정 필드 예외가 아닌 전체 예외 if (item.getPrice() != null && item.getQuantity() != null) { int resultPrice = item.getPrice() * item.getQuantity(); if (resultPrice < 10000) { bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice},nu..
Bean Validation - 오브젝트 오류 Bean Validation에서 특정 필드( FieldError )가 아닌 해당 오브젝트 관련 오류( ObjectError )는 어떻게 처리할 수 있을까? 다음과 같이 @ScriptAssert() 를 사용하면 된다. (방법 1) Item.java @ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000", message = "10000원 이상 입력해주세요.") public class Item { } 실행해서 확인하면 메시지 코드도 다음과 같이 생성된다. ValidationItemControllerV3 - 글로벌 오류 추가 당연히 실행 시 똑같이 동작한다.
Bean Validation - 에러 코드 질문 : Bean Validation이 기본으로 제공하는 오류 메시지를 좀 더 자세히 변경하고 싶으면 어떻게 하면 될까? Bean Validation을 적용하고 bindingResult 에 등록된 검증 오류 코드를 보자. 오류 코드가 애노테이션 이름으로 등록된다. 마치 typeMismatch 와 유사하다. NotBlank 라는 오류 코드를 기반으로 MessageCodesResolver 를 통해 다양한 메시지 코드가 순서대로 생성된다. 메시지 등록 errors.properties에 추가 #Bean Validation 추가 NotBlank={0} 공백X Range={0}, {2} ~ {1} 허용 Max={0}, 최대 {1} {0} 은 필드명이고, {1} , {2} ..