목록분류 전체보기 (796)
코드 그라데이션
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..
스프링이 직접 만든 오류 메시지 처리 검증 오류 코드는 다음과 같이 2가지로 나눌 수 있다. 실행해서 이렇게 해놓고 콘솔 로그 보면 메시지는 이런 식으로 나타나고 잇음. 즉, 다음과 같이 4개의 메시지 코드가 나타나고 있다. 실행해보면 아직 errors.properties 에 메시지 코드가 없기 때문에 스프링이 생성한 기본 메시지가 출력된다. Failed to convert property value of type java.lang.String to required type java.lang.Integer for property price; nested exception is java.lang.NumberFormatException: For input string: "qqqq" errors.propert..
오류 코드 관리 전략 만들기 시작 errors.properties #required.item.itemName=상품 이름은 필수입니다. #range.item.price=가격은 {0} ~ {1} 까지 허용합니다. #max.item.quantity=수량은 최대 {0} 까지 허용합니다. #totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1} #==ObjectError== #Level1 totalPriceMin.item=상품의 가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1} #Level2 - 생략 totalPriceMin=전체 가격은 {0}원 이상이어야 합니다. 현재 값 = {1} #==FieldError== #Level1 required.item.i..
먼저 이렇게 찍어보면 두 가지 메시지 코드를 나타낸다. 두 번째 테스트 찍어보면 결과로 4개를 출력한다. 가장 디테일한 게 첫 번째로, 가장 포괄적인게 마지막으로 나온다. 전체 코드 package hello.itemservice.validation; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.validation.DefaultMessageCodesResolver; import org.springframework.validation.MessageCodesResolver; import static org.assertj.core.api.Assertions.assertTha..
오류 코드와 메시지 처리 (3) 예를 들어서 required 라고 오류 코드를 사용한다고 가정해보자. 다음과 같이 required 라는 메시지만 있으면 이 메시지를 선택해서 사용하는 것이다. required: 필수 값 입니다. 그런데 오류 메시지에 required.item.itemName 와 같이 객체명과 필드명을 조합한 세밀한 메시지 코드가 있으면 이 메시지를 높은 우선순위로 사용하는 것이다.
오류 코드와 메시지 처리 (2) 목표 FieldError , ObjectError 는 다루기 너무 번거롭다. 오류 코드도 좀 더 자동화 할 수 있지 않을까? 예) item.itemName 처럼? 컨트롤러에서 BindingResult 는 검증해야 할 객체인 target 바로 다음에 온다. 따라서 BindingResult 는 이미 본인이 검증해야 할 객체인 target 을 알고 있다. 로그 코드를 앞선 메서드에 추가해서 결과를 확인해본다. @PostMapping("/add") public String addItemV3(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes) { // 요기 추가 l..