
// 수정에 적용은 여기 @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} ..

코드 수정 작업 계속 코드 제거 기존에 등록한 ItemValidator를 제거한다. (오류 검증기 중복 적용 때문) 삭제할 부분 ValidationItemControllerV3 // 주입 부분 private final ItemValidator itemValidator; // 메서드 @InitBinder public void init(WebDataBinder dataBinder) { log.info("init binder {}", dataBinder); dataBinder.addValidators(itemValidator); } 실행 http://localhost:8080/validation/v3/items -> 실행해보면 애노테이션 기반의 Bean Validation이 정상 동작하는 것을 확인할 수 있다..

Bean Validation - 시작 Bean Validation 기능을 어떻게 사용하는지 코드로 알아보자. 먼저 스프링과 통합하지 않고, 순수한 Bean Validation 사용법 부터 테스트 코드로 알아보자. Bean Validation 의존관계 추가 build.gradle dependencies 에다가 implementation 'org.springframework.boot:spring-boot-starter-validation' Jakarta Bean Validation jakarta.validation-api : Bean Validation 인터페이스 hibernate-validator 구현체 테스트 코드 작성 Item - Bean Validation 애노테이션 적용 package hello.i..

Bean Validation - 소개 검증 기능을 지금처럼 매번 코드로 작성하는 것은 상당히 번거롭다. 특히 특정 필드에 대한 검증 로직은 대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다. 이런 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화 한 것이 바로 Bean Validation 이다. Bean Validation을 잘 활용하면, 애노테이션 하나로 검증 로직을 매우 편리하게 적용할 수 있다. 하이버네이트 Validator 관련 링크 공식 사이트: http://hibernate.org/validator/ 공식 메뉴얼: https://docs.jboss.org/hibernate/validator/6.2/reference/en-US/html_single..

Validator 분리 (2) 스프링이 Validator 인터페이스를 별도로 제공하는 이유는 체계적으로 검증 기능을 도입하기 위해서다. 그런데 앞에서는 검증기를 직접 불러서 사용했고, 이렇게 사용해도 된다. 그런데 Validator 인터페이스를 사용해서 검증기를 만들면 스프링의 추가적인 도움을 받을 수 있다. WebDataBinder를 통해서 사용하기 WebDataBinder 는 스프링의 파라미터 바인딩의 역할을 해주고 검증 기능도 내부에 포함한다. ValidationItemControllerV2에 다음 코드를 추가 // 추가 @InitBinder public void init(WebDataBinder dataBinder) { log.info("init binder {}", dataBinder); dat..

Validator 분리 (1) 목표 복잡한 검증 로직을 별도로 분리하자. 컨트롤러에서 검증 로직이 차지하는 부분은 매우 크다. 이런 경우 별도의 클래스로 역할을 분리하는 것이 좋다. 그리고 이렇게 분리한 검증 로직을 재사용 할 수도 있다. 새 클래스 ItemValidator 생성 package hello.itemservice.web.validation; import hello.itemservice.domain.item.Item; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import..