본문 바로가기
IT/Spring

에러 처리 (ControllerAdvice)

by sgoho01 2019. 4. 29.

에러 처리 (ControllerAdvice)

  • 요청 처리 도중 에러 발생 시 일괄 에러처리 방법

ControllerAdvice

  • 컨트롤러에서 클라이언트의 요청을 처리하다 에러 발생 시 에러처리를 일괄적으로 할 수 있다.
  • 여러 컨트롤러에서 발생 하는 에러를 한곳에서 커스텀하게 처리할 수 있다.

ex) jwt 토큰 만료 Exception 처리

  1. 먼저 처리할 Exception을 상속받아 구현한다.

    • 해당 에러 발생시 보낼 HttpStatus를 정의할 수 있다. (@ResponseStatus를 사용해 HttpStatus 정의)

      @ResponseStatus(value = HttpStatus.UNAUTHORIZED, reason = "Token Expired")
      public class JwtExpiredException extends ExpiredJwtException {
      
      	private static final long serialVersionUID = -5516940974076682738L;
      
      	public JwtExpiredException(Header header, Claims claims, String message) {
        		super(header, claims, message);
      	}
      
      	public JwtExpiredException(Header header, Claims claims, String message, Throwable cause) {
        		super(header, claims, message, cause);
      	}
      }
  2. 전역으로 에러를 처리할 ControllerAdvice를 생성한다.

    • 컨트롤러에 @ControllerAdvice 어노테이션을 등록한다.
    • @ExceptionHandler에 처리할 Exception을 명시한다.

      @ControllerAdvice
      public class ExceptionController {
      	@ExceptionHandler(value = JwtExpiredException.class)
      	public ResponseEntity<ErrorResponse> handleJwtExpiredException(RuntimeException e, HttpServletRequest request) {
        		log.debug("JwtExpiredException");
        		ErrorResponse errorResponse = getErrorResponse(HttpStatus.UNAUTHORIZED, e, request);
        		log.debug("ErrorResponse : {}", errorResponse);
      
        		return ResponseEntity.status(errorResponse.getError()).body(errorResponse);
      	} 
      }
  3. 에러내용 객체를 생성하여 원하는 메시지를 구성하여 보낼수 있다.

    @Builder
    @Getter @Setter
    @ToString
    public class ErrorResponse {
    
     private int status;
     private HttpStatus error;
     private String message;
     @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss")
     private LocalDateTime errorTime;
     private String path;
    }
    

'IT > Spring' 카테고리의 다른 글

설정파일 YAML  (0) 2019.04.30
메이븐 (Maven)  (0) 2019.04.30
인터셉터 (Interceptor)  (0) 2019.04.29
Spring 요청 메소드 (Request Mapping)  (0) 2019.04.13
URI 패턴 맵핑  (0) 2019.04.07

댓글