티스토리 뷰

SpringBoot에서 간단하게 에러관리 하는 방법에 대해 알아보겠습니다.

1. 예외 Type 생성

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT) // ENUM 클래스 한글사용
public enum ExceptType {

  /******************/
  /** API Exception */
  /******************/
  RUNTIME_EXCEPTION(HttpStatus.BAD_REQUEST, "E0001", "런타임 오류가 발생하였습니다."),
  ACCESS_DENIED_EXCEPTION(HttpStatus.UNAUTHORIZED, "E0002", "권한이 없습니다."),
  INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "E0003", "서버 통신중 오류가 발생하였습니다."),

  /******************/
  /** BIZ Exception */
  /******************/
  SESS001(HttpStatus.UNAUTHORIZED, "SESS001", "세션 타입이 일치하지 않습니다."),

  PARSE001(HttpStatus.INTERNAL_SERVER_ERROR,"PARSE001","데이터가 정상적으로 파싱되지 않았습니다."),
  PARSE002(HttpStatus.INTERNAL_SERVER_ERROR,"PARSE002","데이터가 정상적이지 않습니다."),
  PARSE003(HttpStatus.INTERNAL_SERVER_ERROR,"PARSE003", "복호화 서비스 호출에 문제가 발생하였습니다.");


  // 컬럼 정의
  private final HttpStatus status;
  private final String code;
  private final String message;

}
  • 원하는 Exception을 작성을 합니다. 위 예제에선 API와 BIZ에 대한 Exception을 구분하여 작성하였습니다.

 

2. Custom Exception 작성

import lombok.Getter;
import my.com.types.ExceptType;

@Getter
public class MyBizException extends RuntimeException {
  private ExceptType error;

  public MyBizException(ExceptType e){
    super(e.getMessage());
    this.error = e;
  }

  public MyBizException(ExceptType e, String message){
    super(message);
    this.error = e;
  }

}
  • ExceptType에서 정의한 오류메시지를 맵핑합니다.

 

3. ErrorController 작성

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import my.com.exception.MyBizException;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

@Slf4j
@Controller
@ControllerAdvice
public class MyErrorController implements ErrorController {

  /**
   * MyBizException 처리
   */
  @ExceptionHandler(MyBizException.class)
  public String handleQrBizException(MyBizException ex, Model model) {
    model.addAttribute("code", ex.getError().getCode());
    model.addAttribute("msg", ex.getMessage());
    return "error/error";
  }

  /**
   * 공통 Exception 처리
   */
  @RequestMapping("/error")
  public String handlerError(HttpServletRequest request, HttpServletResponse response, Model model) {
    Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
    Object errorMessage = request.getAttribute(RequestDispatcher.ERROR_MESSAGE);

    int statusCode = Integer.parseInt(status.toString());
    response.setStatus(statusCode);

    model.addAttribute("code", status.toString());
    model.addAttribute("msg", StringUtil.nvl(errorMessage.toString(), "잘못된 접근 입니다."));
    return "error/error";
  }

}
  • MyBizException을 호출하면 코드와 내용을 error 페이지로 전달합니다.

 

4. Exception 호출

throw new MyBizException(ExceptType.PARSE002);
  • 위 와 같은 방식으로 사용하면 됩니다.

 

5. 에러 페이지 작성

  • error.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>ERROR</title>
</head>
<body>
<div>
  <h1>Error Page</h1>
  error code : <span th:text="${code}"></span>
  <br>error msg : <span th:text="${msg}"></span>
</div>
</body>
</html>

오류코드와 오류메세지를 출력하는 간단한 화면을 구성합니다. 원하는 대로 화면을 구성하시면 됩니다.



감사합니다.

최근에 올라온 글
Total
Today
Yesterday