728x90 반응형 스프링/스프링 웹 개발 활용66 [Spring] 검증 로직을 편리하게 하는 BeanValidation으로 검증하기 검증 기능을 매번 코드로 작성하는 것은 상당히 번거롭다. 특히 특정 필드에 대한 검증로직은 대부분 빈 값인지, 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다. package hello.itemservice.domain.item; import lombok.Data; import org.hibernate.validator.constraints.Range; import javax.validation.constraints.Max; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Data public class Item { private Long id; @NotBlank priv.. 2023. 10. 5. [Spring] 복잡한 검증 로직을 별도로 분리하여 Validator 생성하기 컨트롤러에서 검증 로직이 차지하는 부분은 매우 크다. 이런 경우 별도의 클래스로 역할을 분리하는 것이 좋다. 그리고 이렇게 분리한 검증 로직을 재사용 할 수도 있다 Validator를 직접 생성해서 호출해보고, 스프링이 제공하는 Validator를 사용해보자. 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; .. 2023. 10. 5. [Spring] errors 오류 코드 관리 전략과 타입 오류 처리 + ValidationUtils 사용 오류 코드 관리 전략의 핵심은 구체적인 것에서 덜 구체적인 것으로 정의하는 것이다. MessageCodesResolver 는 required.item.itemName 처럼 구체적인 것을 먼저 만들어주고, required 처럼 덜 구체적인 것을 가장 나중에 만든다. 이렇게 하면 앞서 말한 것 처럼 메시지와 관련된 공통 전략을 편리하게 도입할 수 있다. 모든 오류 코드에 대해서 메시지를 각각 다 정의하기가 힘들다 크게 중요하지 않은 메시지는 범용성 있는 required 같은 메시지로 끝내고, 정말 중요한 메시지는 꼭 필요할 때 구체적으로 적어서 사용하는 방식이 더 효과적이다. errors.properties #required.item.itemName=상품 이름은 필수입니다. #range.item.price=.. 2023. 10. 4. [Spring] 오류 메시지 코드 단계 우선 순위 및 검증 오류 코드로 메시지 코드를 생성하는 MessageCodesResolver 오류 코드를 만들 때 다음과 같이 자세히 만들 수도 있다. required.item.itemName = 상품 이름은 필수입니다. range.item.price = 상품의 가격 범위 오류입니다. 또는 아래처럼 단순하게 만들 수도 있다. required = 필수 값 입니다. range = 범위 오류입니다. 단순하게 만들면 범용성이 좋아서 여러 곳에서 사용할 수 있지만, 메시지를 세밀하게 작성하기 어렵다. 반대로 너무 자세하게 만들면 범용성이 떨어진다. 가장 좋은 방법은 범용성으로 사용하다가, 세밀하게 작성해야 하느 ㄴ경우 세밀한 내용이 적용되도록 메시지에 단계를 두는 방법이다. 예를 들어서 required 라고 오류 코드를 사용한다고 가정해보자. 다음과 같이 required 라는 메시지만 있으면 이 메시지를.. 2023. 9. 27. [Spring] BindingResult의 rejectValue(), reject() 를 사용하여 FieldError, ObjectError를 직접 생성하지 않고 검증하기 FieldError, ObjectError를 다루려면 여러 가지 파라미터를 세팅해야하기 때문에 불편한 부분이 많다. 컨트롤러에서 BindingResult는 검증해야할 객체인 target 바로 다음에 온다. 따라서 BindingResult는 이미 본인이 검증해야할 객체인 target을 알고 있다. log.info("objectName={}", bindingResult.getObjectName()); log.info("target={}", bindingResult.getTarget()); 를 실행해보면 와 같이 나오는 걸 볼 수 있다. rejectValue(), reject() BindingResult가 제공하는 rejectValue(), reject()를 사용하면 FieldError, ObjectError.. 2023. 9. 27. [Spring] erros.properties 를 이용한 오류 코드와 메시지 처리 FieldError 생성자를 살펴보면 아래와 같다. public FieldError(String objectName, String field, String defaultMessage); public FieldError(String objectName, String field, @Nullable Object rejectedValue, boolean bindingFailure, @Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage) 파라미터 목록 - objectName : 오류가 발생한 객체 이름 - field : 오류 필드 - rejectedValue : 사용자가 입력한 값(거절된 값) - binding.. 2023. 9. 26. 이전 1 2 3 4 5 6 7 8 ··· 11 다음 728x90 반응형