Loading...
Spring Framework Reference Documentation 7.0.2의 Validation의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
See equivalent in the Reactive stack
Spring MVC는
@RequestMapping 메서드에 대해 validation이 내장되어 있으며,
Java Bean Validation을 포함합니다.
Validation은 두 가지 수준 중 하나에서 적용될 수 있습니다:
@jakarta.validation.Valid 또는 Spring의 @Validated가 어노테이션으로 지정되어 있고,
Map이나 Collection과 같은 컨테이너가 아닌 command 객체이며,메서드 시그니처에서 바로 뒤에 Errors 또는 BindingResult가 없고,
그 외에 메서드 validation(다음 항목 참조)을 요구하지 않는 한 개별적으로 적용됩니다.
MethodArgumentNotValidException은 메서드 파라미터를 개별적으로 validation할 때 발생하는 exception입니다.
@Min, @NotBlank 등과 같은 @Constraint 어노테이션이 메서드 파라미터에 직접 선언되었거나,
return value에 대해 메서드에 선언된 경우 Java Bean Validation은 메서드에 적용되며,
메서드 validation은 메서드 파라미터 constraint와 @Valid를 통한 nested constraint를 모두 포함하므로,
개별 메서드 파라미터에 대해 적용되었을 validation보다 우선합니다.
HandlerMethodValidationException은 validation이 메서드에 적용될 때 발생하는 exception입니다.애플리케이션은 controller 메서드 시그니처에 따라 둘 중 어느 것이든 발생할 수 있으므로
MethodArgumentNotValidException과 HandlerMethodValidationException 모두를 처리해야 합니다.
그러나 이 두 exception은 매우 유사하게 설계되었으며, 거의 동일한 코드로 처리할 수 있습니다.
주요 차이점은 전자는 단일 객체에 대한 것이고, 후자는 메서드 파라미터 리스트에 대한 것입니다.
@Valid는 constraint 어노테이션이 아니라 객체 내의 nested constraint를 위한 것입니다.<br>따라서@Valid만으로는 메서드 validation이 발생하지 않습니다. 반면@NotNull은<br>constraint이므로, 이를@Valid파라미터에 추가하면 메서드 validation으로 이어집니다.<br>nullability에 대해서는@RequestBody또는@ModelAttribute의required플래그를 사용할 수도 있습니다.
메서드 validation은 Errors 또는 BindingResult 메서드 파라미터와 함께 사용할 수 있습니다.
그러나 controller 메서드는 모든 validation error가 바로 뒤에 Errors가 있는
메서드 파라미터에만 있는 경우에만 호출됩니다.
그 외의 어떤 메서드 파라미터에 validation error가 있는 경우 HandlerMethodValidationException이 발생합니다.
WebMvc config를 통해
Validator를 전역적으로 설정하거나,
@Controller 또는 @ControllerAdvice의
@InitBinder 메서드를 통해 로컬하게 설정할 수 있습니다.
여러 validator를 사용할 수도 있습니다.
Controller에 클래스 레벨
@Validated가 있는 경우,<br>메서드 validation이 적용<br>되며 AOP 프록시를 통해 수행됩니다. Spring Framework 6.1에 추가된 Spring MVC의<br>내장 메서드 validation 지원을 활용하려면 controller에서 클래스 레벨<br>@Validated어노테이션을 제거해야 합니다.
Error Responses section은
MethodArgumentNotValidException과 HandlerMethodValidationException이
어떻게 처리되는지, 그리고 MessageSource와 locale 및 언어별 리소스 번들을 통해
그 렌더링을 어떻게 커스터마이징할 수 있는지에 대한 자세한 내용을 제공합니다.
메서드 validation error를 더 커스텀하게 처리하려면
ResponseEntityExceptionHandler를 확장하거나 controller 또는 @ControllerAdvice에서
@ExceptionHandler 메서드를 사용하여 HandlerMethodValidationException을 직접 처리할 수 있습니다.
이 exception은 validation error를 메서드 파라미터별로 그룹화하는
ParameterValidationResult 리스트를 포함합니다.
이를 반복(iterate)할 수도 있고, controller 메서드 파라미터 타입별로 콜백 메서드를 가진
visitor를 제공할 수도 있습니다:
1HandlerMethodValidationException ex = ... ; 2 3ex.visitResults(new HandlerMethodValidationException.Visitor() { 4 5 @Override 6 public void requestHeader(RequestHeader requestHeader, ParameterValidationResult result) { 7 // ... 8 } 9 10 @Override 11 public void requestParam(@Nullable RequestParam requestParam, ParameterValidationResult result) { 12 // ... 13 } 14 15 @Override 16 public void modelAttribute(@Nullable ModelAttribute modelAttribute, ParameterErrors errors) { 17 // ... 18 } 19 20 // ... 21 22 @Override 23 public void other(ParameterValidationResult result) { 24 // ... 25 } 26});
1// HandlerMethodValidationException 2val ex 3 4ex.visitResults(object : HandlerMethodValidationException.Visitor { 5 6 override fun requestHeader(requestHeader: RequestHeader, result: ParameterValidationResult) { 7 // ... 8 } 9 10 override fun requestParam(requestParam: RequestParam?, result: ParameterValidationResult) { 11 // ... 12 } 13 14 override fun modelAttribute(modelAttribute: ModelAttribute?, errors: ParameterErrors) { 15 // ... 16 } 17 18 // ... 19 20 override fun other(result: ParameterValidationResult) { 21 // ... 22 } 23})
@InitBinder
Exceptions