# Back-End/Spring

@ControllerAdvice를 이용한 예외처리

RestController의 응답

@RestController 로 선언하여 API를 개발할 때, 컨트롤러는 Response(응답)을 반환하게 되는데, Response에 포함되는 것들 Status, Message, Headers, Content type, body 등이 있다. Service 로직을 구현하고 컨트롤러가 서비스를 호출할 때, 예외를 발생시켜 오류 결과 또는 정상적으로 처리 됐을 때 처리 결과를 body에 담아 전송할 수 있다.

 

 

 @ControllerAdvice란?

컨트롤러 마다 예외를 처리한다면, 다른 컨트롤러에서 같은 예외가 발생했을 때 똑같은 처리 방법을 위해 중복 코드를 작성하게 될 수 있다. 이때 Contoller에서 일어나는 Exception들을 관리하고, 공통적으로 처리 방법을 선언하는 어노테이션이다.

  1. 패키지별로 각각의 ControllerAdvice를 생성할 수도 있다.
  2. @ExceptionHandler 를 선언하여 예외를 처리할 때 Json 형태의 ResponseBody로 반환 할 수 있고, 에러 페이지 뷰로 넘겨줄 수도 있다.

 

@ControllerAdvice 를 선언한 클래스

@ControllerAdvice

  • 전역적인 Controller 예외 처리를 위한 어노테이션
  • 예외가 발생 했을 때, 어떤 행동을 하고 무엇을 반환할지를 정의
    @ResponseBody
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(BusinessException.class)
    public Header handleBusinessException(final BusinessException e) {
        log.error("handleBusinessException", e);

        final ErrorCode errorCode = e.getErrorCode();

        return APIResult.ERROR(
                errorCode.getResultCode(),
                errorCode.getDescription(),
                e
        );
    }
  1. @ResponseBody를 통해 JSON 형태로 ResponseBody에 값을 담아 반환할 것임을 선언
  2. @ResponseStatus를 통해 이 예외는 어떤 응답 코드를 반환할 것인지 선언
  3. @ExceptionHandler를 통해서 어떤 예외를 처리할 것인지 선언

APIResult라는 임의의 API 응답 클래스를 선언하였고, 이 클래스에는 api 통신시간, api 응답 코드, api 메시지 등을 담는다. 예제 코드에서는 매개변수 e 에서 응답코드와 메시지를 get하여 APIResult 객체에 담아 반환한다.

 

 

HTTP 응답 코드와 사용자 에러코드, 사용자 예외

  1. HTTP 응답 코드
    1. 100번대 : 관련 정보 반환
    2. 200번대 : 정상 응답
    3. 300번대 : 서버가 클라이언트에게 리다이렉션 요청
    4. 400번대 : 클라이언트 문제 발생
    5. 500번대 : 서버 문제 발생

tip) Spring에서 반환하는 HTTP 응답코드는 HttpStatus.java에서 확인할 수 있다.

  1. 사용자 에러코드
    1. code, description, resultCode로 이루어진 Enum
    2. 사용자 예외 클래스에 담을 에러코드들을 선언한다.
  2. 사용자 예외 클래스(BusinessException)
    1. 비즈니스 요구사항에 따른 예외사항을 처리할 때 사용한다.
    2. BusinessException 을 상속받고, 어떤 예외일 때 어떤 에러코드를 반환할 지 선언한다.
    3. (BusinessException 클래스는 RuntimeException 클래스를 상속받은 클래스이다.)

 

예외 발생부터 처리과정

  1. Client에서 API를 요청
  2. Server의 Controller가 요청을 받고 서비스를 호출하여 로직을 수행한다.
  3. (이때 올바른 HandlerMapping이 발생하지 못한 경우도 예외 처리 가능하다)
  4. 로직을 수행하다 예외가 발생한다.
  5. ex : 로그인 시 비밀번호가 틀렸다, 회원가입 시 중복된 이메일이 있다 등
  6. ControllerAdvice가 선언된 클래스에서 해당 예외가 발생했을 때의 @ExceptionHandler 에 따라 예외를 처리한다.
  7. @ResponseBody 선언 여부에 따라 json 형태로 ResponseBody에 담아 반환하거나, view를 반환하여 예외 처리 페이지로 이동시킬 수 있다.

 

참고자료

https://jeong-pro.tistory.com/195

https://www.popit.kr/spring-guide-%EC%97%90%EC%99%B8-%EC%B2%98%EB%A6%AC-%EC%A0%84%EB%9E%B5/

728x90