Validation

Dev.Hammy·2024년 4월 6일
0

반응형 스택에서 이에 상응하는 내용 보기

Spring MVC에는 Java Bean 유효성 검사를 사용하는 옵션을 포함하여 @RequestMapping 메서드에 대한 유효성 검사 지원이 내장되어 있습니다. 검증 지원은 두 가지 수준에서 작동합니다.

먼저 @ModelAttribute, @RequestBody@RequestPart 메서드 매개 변수에 대한 해석기는 매개 변수에 Jakarta의 @Valid 또는 Spring의 @Validated annotation이 있는 경우 유효성 검사를 수행하고 필요한 경우 MethodArgumentNotValidException을 발생시킵니다. 또는 검증된 매개 변수 바로 뒤에 Errors 또는 BindingResult 메서드 매개 변수를 추가하여 컨트롤러 메서드의 오류를 처리할 수 있습니다.

둘째, Java Bean 유효성 검증이 존재하고 메소드 매개변수에 @Constraint annotation이 있는 경우 메소드 유효성 검증이 대신 적용되어 필요한 경우 HandlerMethodValidationException이 발생합니다. 이 경우 Errors 또는 BindingResult 메서드 매개 변수를 추가하여 컨트롤러 메서드 내에서 유효성 검사 오류를 처리할 수 있지만, 다른 메서드 인수에 유효성 검사 오류가 있으면 대신 HandlerMethodValidationException이 발생합니다. 메소드에 @Valid 또는 @Constraint annotation이 추가된 경우 메소드 유효성 검증이 반환 값에 적용될 수 있습니다.

WebMvc 구성을 통해 전역적으로 Validator를 구성하거나 @Controller 또는 @ControllerAdvice@InitBinder 메서드를 통해 로컬로 구성할 수 있습니다. 여러 validator를 사용할 수도 있습니다.

[Note]
컨트롤러에 @Validated 클래스 수준이 있으면 AOP 프록시를 통해 메서드 유효성 검사가 적용됩니다. Spring Framework 6.1에 추가된 메서드 유효성 검사를 위한 Spring MVC 내장 지원을 활용하려면 컨트롤러에서 클래스 수준 @Validated annotation을 제거해야 합니다.

오류 응답 섹션에서는 MethodArgumentNotValidExceptionHandlerMethodValidationException이 처리되는 방법과 MessageSource 및 로케일 및 언어별 리소스 번들을 통해 해당 렌더링을 사용자 정의할 수 있는 방법에 대한 자세한 내용을 제공합니다.

메서드 유효성 검사 오류를 추가로 사용자 지정 처리하려면 ResponseEntityExceptionHandler를 확장하거나 컨트롤러 또는 @ControllerAdvice에서 @ExceptionHandler 메서드를 사용하고 HandlerMethodValidationException을 직접 처리할 수 있습니다. 예외에는 메서드 매개 변수별로 유효성 검사 오류를 그룹화하는 ParameterValidationResults 목록이 포함되어 있습니다. 이를 반복하거나 컨트롤러 메서드 매개변수 유형별로 방문자에게 콜백 메서드를 제공할 수 있습니다.

HandlerMethodValidationException ex = ... ;

ex.visitResults(new HandlerMethodValidationException.Visitor() {

	@Override
	public void requestHeader(RequestHeader requestHeader, ParameterValidationResult result) {
			// ...
	}

	@Override
	public void requestParam(@Nullable RequestParam requestParam, ParameterValidationResult result) {
			// ...
	}

	@Override
	public void modelAttribute(@Nullable ModelAttribute modelAttribute, ParameterErrors errors) {

	// ...

	@Override
	public void other(ParameterValidationResult result) {
			// ...
	}
});

0개의 댓글