Loading...
Spring Framework Reference Documentation 7.0.2의 Validation의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
See equivalent in the Servlet stack
Spring WebFlux는
@RequestMapping 메서드에 대해, Java Bean Validation을 포함한
Validation을 기본으로 제공합니다.
Validation은 두 가지 수준 중 하나에서 적용될 수 있습니다:
@jakarta.validation.Valid 또는 Spring의 @Validated가 어노테이션으로 지정된 경우 적용되며,
이때 parameter는 Map 또는 Collection과 같은 컨테이너가 아니라 command 객체이어야 하고,메서드 시그니처에서 바로 뒤에 Errors 또는 BindingResult를 두지 않아야 하며,
그 밖에 메서드 validation을 요구하지 않아야 합니다(다음 항목 참조).
WebExchangeBindException은 메서드 parameter를 개별적으로 검증할 때 발생하는 예외입니다.
@Min, @NotBlank 등과 같은
@Constraint 어노테이션이 메서드 parameter에 직접 선언되거나,
return value에 대해 메서드에 선언된 경우 메서드에 적용되며,
메서드 validation은 메서드 parameter constraint와 @Valid를 통한 중첩 constraint 모두를 다루기 때문에,그렇지 않았다면 개별적으로 메서드 parameter에 적용되었을 validation을 대체합니다.
HandlerMethodValidationException은 validation이 메서드에 적용될 때 발생하는 예외입니다.
애플리케이션은 컨트롤러 메서드 시그니처에 따라 둘 중 어느 것이든 발생할 수 있으므로
WebExchangeBindException과 HandlerMethodValidationException 모두를 처리해야 합니다.
그러나 이 두 예외는 매우 유사하게 설계되어 있으며, 거의 동일한 코드로 처리할 수 있습니다.
주요 차이점은 전자가 단일 객체에 대한 것이고, 후자는 메서드 parameter 목록에 대한 것이라는 점입니다.
@Valid는 constraint 어노테이션이 아니라 객체 내의 중첩 constraint를 위한 것입니다.<br>따라서 @Valid만으로는 메서드 validation이 발생하지 않습니다. 반면 @NotNull은 constraint이며,<br>@Valid parameter에 이를 추가하면 메서드 validation이 발생합니다. null 가능성에 대해서는<br>특히 @RequestBody 또는 @ModelAttribute의 required 플래그를 사용할 수도 있습니다. |
메서드 validation은 Errors 또는 BindingResult 메서드 parameter와 함께 사용할 수 있습니다.
그러나 컨트롤러 메서드는 모든 validation error가 바로 뒤에 Errors를 둔
메서드 parameter에만 있는 경우에만 호출됩니다.
다른 어떤 메서드 parameter에라도 validation error가 있는 경우 HandlerMethodValidationException이 발생합니다.
Validator는
WebFlux config를 통해 전역적으로,
또는 @Controller나 @ControllerAdvice의
@InitBinder 메서드를 통해 로컬하게
구성할 수 있습니다. 여러 validator를 사용할 수도 있습니다.
Controller에 클래스 레벨 @Validated가 있는 경우,<br>메서드 validation은 AOP 프록시를 통해 적용됩니다.<br>Spring Framework 6.1에 추가된 Spring MVC의 메서드 validation 내장 지원을 활용하려면,<br>컨트롤러에서 클래스 레벨 @Validated 어노테이션을 제거해야 합니다. |
Error Responses section에는
WebExchangeBindException과 HandlerMethodValidationException이 어떻게 처리되는지,
그리고 MessageSource와 locale 및 언어별 리소스 번들을 통해
그 렌더링을 어떻게 커스터마이징할 수 있는지에 대한 추가 설명이 있습니다.
메서드 validation error를 더 커스텀하게 처리하기 위해,
ResponseEntityExceptionHandler를 확장하거나 컨트롤러 또는 @ControllerAdvice에서
@ExceptionHandler 메서드를 사용하여
HandlerMethodValidationException을 직접 처리할 수 있습니다.
이 예외에는 validation error를 메서드 parameter별로 묶은
ParameterValidationResult 목록이 포함되어 있습니다.
이를 반복(iterate)할 수도 있고, 컨트롤러 메서드 parameter 타입별로 콜백 메서드를 가진
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 @Override 21 public void other(ParameterValidationResult result) { 22 // ... 23 } 24});
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})
DataBinder
Exceptions