분류 전체보기 1341

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

두 가지 방법을 통해 수정 요구사항과 등록 요구사항에 각각 다른 검증을 실행할 수 있다. 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 i..

Ch05. 검증(Bean Validation) - Bean Validation(수정 & 한계)

Bean Validation 수정 적용 EditController 수정 @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..

Ch05. 검증(Bean Validation) - Bean Validation(오브젝트 오류)

Bean Validation에서 특정 필드( FieldError )가 아닌 해당 오브젝트 관련 오류( ObjectError )는 어떻게 처리할 수 있을까? @ScriptAssert()를 사용하면 된다 @Data @ScriptAssert(lang = "javascript", script = "_this.price * _this.quantity >= 10000", message = "총 합이 10000원 넘게 입력해주세요") //현업에서는 기능이 약해 많이 사용하지 않는다 public class Item { } 메시지 코드 생성 ScriptAssert.item ScriptAssert 실제 사용해보면 제약이 많고, 복잡하다. 실무에서는 검증 기능이 해당 객체의 범위를 넘어서는 경우도 종종 등장하므로 그런 대응..

Ch05. 검증(Bean Validation) - Bean Validation(에러 코드)

NotBlank라는 오류 코드를 기반으로 MessageCodesResolver를 통해 다양한 메시지 코드가 순서대로 생성된다 @NotBlank NotBlank.item.itemName NotBlank.itemName NotBlank.java.lang.String NotBlank @Range Range.item.price Range.price Range.java.lang.Integer Range 메시지 등록 Errors.properties Bean Validation 추가 NotBlank={0} 공백X Range={0}, {2} ~ {1} 허용 Max={0}, 최대 {1} BeanValidation 메시지 찾는 순서 생성된 메시지 코드 순서대로 messageSource 에서 메시지 찾기 애노테이션의 mes..

Ch05. 검증(Bean Validation) - Bean Validation(스프링 적용)

@PostMapping("/add") public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { //@Validated를 적어주면 정상적으로 어노테이션이 동작한다 //@Validated가 있으면 글로벌 Validator가 동작해서 어노테이션 기반 검증을 한다 if (bindingResult.hasErrors()) { log.info("bindingResult = {}", bindingResult); return "validation/v3/addForm"; } //성공 로직 Item savedItem = item..

Ch05. 검증(Bean Validation) - Bean Validation(시작)

Bean Validation 이란? 먼저 Bean Validation은 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 기술 표준이다. 쉽게 이야기해서 검증 애노테이션과 여러 인터페이스의 모음이다. 마치 JPA가 표준 기술이고 그 구현체로 하이버네이트가 있는 것과 같다. Bean Validation을 구현한 기술 중에 일반적으로 사용하는 구현체는 하이버네이트 Validator이다 공식 사이트: http://hibernate.org/validator/ The Bean Validation reference implementation. - Hibernate Validator Express validation rules in a standardized way using annot..

Ch04. 검증(Validation) - Validator 분리

Controller에 Validation 분리 Validation을 Controller에 모여 있어 실제 Controller 로직을 기능을 찾기 힘들다. Validation 로직을 실제 새로운 Class를 만들어 분리시켜 동작시켜 보자 ItemValication.class @Component public class ItemValidator implements Validator { @Override public boolean supports(Class clazz) { //item == clazz return Item.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { Item item =..

Ch04. 검증(Validation) - 오류 코드와 메시지 처리

FieldError, ObjectError의 codes, arguments 사용하기 errors.properties 생성하기 application.properties 에 해당 프로퍼티 파일을 메시지로 사용한다는 것을 적어준다. #logging.level.org.apache.coyote.http11=debug spring.messages.basename=messages, errors errors.properties 에 오류 메시지 작성 required.item.itemName=상품 이름은 필수입니다. range.item.price=가격은 {0} ~ {1} 까지 허용합니다. max.item.quantity=수량은 최대 {0} 까지 허용합니다. totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야..

Ch04. 검증(Validation) - FliedError, ObjectError

addItemV2 사용자의 입력 오류 값이 남아있지 않은 문제를 해결 @PostMapping("/add") public String addItemV2(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { //검증 로직 if (!StringUtils.hasText(item.getItemName())) { bindingResult.addError( new FieldError("item", "itemName", item.getItemName(), false, null, null, "상품 이름은 필수입니다")); } if (item.getPrice() == null ||..

Ch04. 검증(Validation) - BindingResult

AddItemV1 @PostMapping("/add") public String addItemV1(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { //검증 로직 if(!StringUtils.hasText(item.getItemName())){ bindingResult.addError(new FieldError("item", "itemName", "상품 이름은 필수입니다")); } if(item.getPrice() == null || item.getPrice() 1000000){ bindingResult.add..