728x90
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>
오류코드와 오류메세지를 출력하는 간단한 화면을 구성합니다. 원하는 대로 화면을 구성하시면 됩니다.
감사합니다.
728x90
'프레임워크 > SpringBoot' 카테고리의 다른 글
[SpringBoot] Tomcat 으로 war 파일 배포하기 (0) | 2024.06.12 |
---|---|
[SpringBoot] Cookie 사용하기 (0) | 2024.06.03 |
[SpringBoot] Mybatis 다중 Datasource 적용하기 (0) | 2024.05.27 |
[SpringBoot] Test 코드 작성하기(MockMvc) (0) | 2024.05.27 |
[SpringBoot] @LoginCheck 어노테이션 만들기 (0) | 2024.05.23 |