前処理後処理(2)


前処理


Springbootで検証するにはSpringBoot Starter Validationというライブラリが必要です.
mvnrepositoryからダウンロードできます.
dependencyを追加すると、コントローラは@validという構文を使用できます.
(java.validation言語タイプはこちらです。と決定できます)
	//SignupReqDto
	@Data //lombok
	public class SignupReqDto {
	
		@Size(min = 2, max = 20)
		@NotBlank()
		private String username;
		@NotBlank()
		private String password;
	}
	//Controller
	@PostMapping("/")
	public String signup(@Valid SignupReqDto signupReqDto, BindingResult bindingResult){
		if (bindingResult.hasErrors()) {
			Map<String,String> errorMap = new HashMap<>();
			
			for(FieldError error:bindingResult.getFieldErrors()) {
				errorMap.put(error.getField(), error.getDefaultMessage());
			}
			
			throw new RuntimeException("유효성 검사 실패");
		} else {
			//회원가입 진행
			
			return "signin";
		}
	}
SignupReqDto注記を追加して検証した場合、問題が発生した場合はBindingResultクラスで転送できます.
コントローラには次のコードが表示されます.
	if (bindingResult.hasErrors()) {
			Map<String,String> errorMap = new HashMap<>();
			
			for(FieldError error:bindingResult.getFieldErrors()) {
				errorMap.put(error.getField(), error.getDefaultMessage());
			}
			
			throw new RuntimeException("유효성 검사 실패");
		} else {
			//회원가입 진행
			
			return "signin";
		}
bindingResultでエラーが発生した場合、問題が発生したフィールド名とエラーメッセージをMapに保存し、RuntimeExceptionを放出します.
しかし、これによりユーザーにエラー画面全体が表示されます.これをより簡潔に伝えるために、以下の操作を行います.
	//ControllerExceptionHandler
    	@RestController
    	@ControllerAdvice //모든 exception을 낚아챔
    	public class ControllerExceptionHandler {
    
    		@ExceptionHandler(RuntimeException.class)
    		public String validationException(RuntimeException e) {
        		return e.getMessage();
        	}
ただしRunTimeExceptionはstringのみを受信しているためerrorMapを渡すことはできません.
したがって、RunTimeExceptionを継承するクラスを作成する必要があります.
	//CustomValidationException
	public class CustomValidationException extends RuntimeException{
	
        // 객체를 구분할 때 사용
        private static final long serialVersionUID = 1L;

        private Map<String, String> errorMap;

        public CustomValidationException(String message, Map<String, String> errorMap) {
            super(message);
            this.errorMap = errorMap;
        }

        public Map<String, String> getErrorMap() {
            return errorMap;
        }
    }
RuntimeExceptionにメッセージを送信すると、RuntimeExceptionはそのメッセージを親(Exception)に、Exceptionはそのメッセージを親(Throwable)に投げます.その後、ThrowableのgetMessage関数でメッセージを受信するので、super(message)を使用してメッセージを受信することができます.
このようにしてCustomValidationExceptionを作成し、RuntimeException部分をCustomValidationExceptionに変換し、戻りタイプをMap //ControllerExceptionHandler @RestController @ControllerAdvice //모든 exception을 낚아챔 public class ControllerExceptionHandler { @ExceptionHandler(CustomValidationException.class) public Map<String, String> validationException(CustomValidationException e) { return e.getMessage(); }また、「検証に失敗した」というメッセージを表示する場合は、ControllerExceptionHandlerの戻りタイプを共通Dtoに変換する共通Dtoを作成します.
	//CommonResDto
	@AllArgsConstructor
	@NoArgsConstructor
	@Data
	public class CommonResDto<T>{
    		private String message;
        	private T data;
    }
	//ControllerExceptionHandler
    	@RestController
    	@ControllerAdvice //모든 exception을 낚아챔
    	public class ControllerExceptionHandler {
    
    		@ExceptionHandler(CustomValidationException.class)
    		public CommonResDto<?>validationException(CustomValidationException e) {
        		return new CommpnResDto<Map<String, String>>(e.getMessage(), e.getErrorMap();
        	}