Global Exception 이란?
Java Spring에서 Global Exception Handling은 애플리케이션 전반에 걸쳐 발생하는 예외를 한 곳에서 처리할 수 있게 해주는 기능이다. 이를 통해 코드의 중복을 줄이고, 예외 처리 로직을 중앙 집중화할 수 있다.
Spring에서는 @ControllerAdvice와 @ExceptionHandler를 사용하여 Global Exception Handling을 구현할 수 있다.
Global Exception 동작 처리
1. API 정상 동작 처리
1. 클라이언트는 데이터를 담아서 @RequestBody, @ReqestParam, @PathVariable Annotation을 이용하여 API를 호출한다.
2. Controller에서는 데이터를 이에 대한 처리를 수행한다.
3. 클라이언트와 API와의 통신이 완료된다.
2. API 비 정상 동작 처리 : Exception 발생 시
1. 클라이언트는 데이터를 담아서 @RequestBody, @ReqestParam, @PathVariable Annotation을 이용하여 API를 호출한다.
2.Controller에서는 데이터를 이에 대한 처리를 수행한다.
1) 데이터 처리가 정상적으로 처리가 되지 않고 Exception이 발생한 경우
2) 비즈니스 로직의 처리 없이 @RestControllerAdvice / @ExceptionHandler로 구성한 ‘GlobalException’에서 에러를 캐치
3)@ExceptionHandler(MethodArgumentNotValidException.class)로 에러로 발생시키는 것이 아닌 클라이언트로 ‘에러 응답(Response)’ 데이터를 전송한다
3. 클라이언트와 API와의 통신이 완료된다.
3) Global Exception Handler Annotation
@ControllerAdvice / @RestControllerAdvice과 @ExceptionHandler 어노테이션을 기반으로 Controller 내에서 발생하는 에러에 대해서 해당 핸들러에서 캐치하여 오류를 발생시키지 않고 응답 메시지로 클라이언트에게 전달해 주는 기능을 의미합니다.
HTTP Status 코드로 정상코드가 아닌 '오류코드'로 반환하였을 시 실제 '에러'가 발생하기에 이를 위해 중간에 GlobalExcpetion을 통해 Exception 발생 시에도 HTTP Status 코드로 '정상 코드'를 보내고 커스텀한 코드를 보냄으로써 실제 Client 내에서 이를 처리할 수 있게 돕기 위함입니다.
1. @ControllerAdvice
@Controller로 선언한 지점에서 발생한 에러를 도중에 @ControllerAdivce로 선언한 클래스 내에서 이를 캐치하여 Controller 내에서 발생한 에러를 처리할 수 있도록 하는 어노테이션
2. @RestControllerAdvice
@RestController로 선언한 지점에서 발생한 에러를 도중에 @RestControllerAdvice로 선언한 클래스 내에서 이를 캐치하여 Controller 내에서 발생한 에러를 처리할 수 있도록 하는 어노테이션
3. @ExceptionHandler
특정 에러 발생 시 Controller에 발생하였을 경우 해당 에러를 캐치하여 클라이언트로 오류를 반환하도록 처리하는 기능을 수행
import lombok.Getter;
/**
* [공통 코드] API 통신에 대한 '에러 코드'를 Enum 형태로 관리를 한다.
* Global Error CodeList : 전역으로 발생하는 에러코드를 관리한다.
* Custom Error CodeList : 업무 페이지에서 발생하는 에러코드를 관리한다
* Error Code Constructor : 에러코드를 직접적으로 사용하기 위한 생성자를 구성한다.
*
* @author lee
*/
@Getter
public enum ErrorCode {
/**
* ******************************* Global Error CodeList ***************************************
* HTTP Status Code
* 400 : Bad Request
* 401 : Unauthorized
* 403 : Forbidden
* 404 : Not Found
* 500 : Internal Server Error
* *********************************************************************************************
*/
// 잘못된 서버 요청
BAD_REQUEST_ERROR(400, "G001", "Bad Request Exception"),
// @RequestBody 데이터 미 존재
REQUEST_BODY_MISSING_ERROR(400, "G002", "Required request body is missing"),
// 유효하지 않은 타입
INVALID_TYPE_VALUE(400, "G003", " Invalid Type Value"),
// Request Parameter 로 데이터가 전달되지 않을 경우
MISSING_REQUEST_PARAMETER_ERROR(400, "G004", "Missing Servlet RequestParameter Exception"),
// 입력/출력 값이 유효하지 않음
IO_ERROR(400, "G005", "I/O Exception"),
// com.google.gson JSON 파싱 실패
JSON_PARSE_ERROR(400, "G006", "JsonParseException"),
// com.fasterxml.jackson.core Processing Error
JACKSON_PROCESS_ERROR(400, "G007", "com.fasterxml.jackson.core Exception"),
// 권한이 없음
FORBIDDEN_ERROR(403, "G008", "Forbidden Exception"),
// 서버로 요청한 리소스가 존재하지 않음
NOT_FOUND_ERROR(404, "G009", "Not Found Exception"),
// NULL Point Exception 발생
NULL_POINT_ERROR(404, "G010", "Null Point Exception"),
// @RequestBody 및 @RequestParam, @PathVariable 값이 유효하지 않음
NOT_VALID_ERROR(404, "G011", "handle Validation Exception"),
// @RequestBody 및 @RequestParam, @PathVariable 값이 유효하지 않음
NOT_VALID_HEADER_ERROR(404, "G012", "Header에 데이터가 존재하지 않는 경우 "),
// 서버가 처리 할 방법을 모르는 경우 발생
INTERNAL_SERVER_ERROR(500, "G999", "Internal Server Error Exception"),
/**
* ******************************* Custom Error CodeList ***************************************
*/
// Transaction Insert Error
INSERT_ERROR(200, "9999", "Insert Transaction Error Exception"),
// Transaction Update Error
UPDATE_ERROR(200, "9999", "Update Transaction Error Exception"),
// Transaction Delete Error
DELETE_ERROR(200, "9999", "Delete Transaction Error Exception"),
; // End
/**
* ******************************* Error Code Constructor ***************************************
*/
// 에러 코드의 '코드 상태'을 반환한다.
private final int status;
// 에러 코드의 '코드간 구분 값'을 반환한다.
private final String divisionCode;
// 에러 코드의 '코드 메시지'을 반환한다.
private final String message;
// 생성자 구성
ErrorCode(final int status, final String divisionCode, final String message) {
this.status = status;
this.divisionCode = divisionCode;
this.message = message;
}
}
'JAVASPRING > study' 카테고리의 다른 글
H2 database, 개념 잡기 (0) | 2024.06.27 |
---|---|
JAVA SPRING / SMTP 이메일 인증하기 (0) | 2024.06.07 |
Controller / Service / Repository로 나누는 이유는 뭘까? (0) | 2024.05.28 |