스프링 부트에서 exception 을 처리하는 방법에 대해 설명한다.
존재하지 않는 데이터를 요청했을때 나오는 오류 문구는 클라이언트에게 친화적이지 못하다. 어떤 오류가 났는데 그래서 왜 났는지가 궁금할것이다.
예외처리만 담당하는 패키지를 만들어서 아래 순서에 맞는 클래스를 작성해두자. 나는 3개의 클래스를 생성했다.
- 예상되는 발생할 에러코드를 정리한 enum(열거형) 클래스 작성
ErrorCode
라는 이름의 enum 클래스를 작성한다.
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum ErrorCode {
NOT_FOUND(404,"COMMON-ERR-404","페이지가 작동하지 않네요."),
INTER_SERVER_ERROR(500,"COMMON-ERR-500","해당 ID는 존재하지 않습니다."),
;
private int status;
private String errorCode;
private String message;
}
- exception 발생시 응답하는 에러 정보 클래스 작성
ErrorResponse
라는 이름의 클래스를 작성한다.
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class ErrorResponse {
private int status;
private String message;
private String code;
public ErrorResponse(ErrorCode errorCode){
this.status = errorCode.getStatus();
this.message = errorCode.getMessage();
this.code = errorCode.getErrorCode();
}
}
- exception 발생시 전역으로 처리할 exception handler 작성
GlobalExceptionHandler
라는 이름의 클래스를 작성한다.
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception ex){
log.error("handleException",ex);
ErrorResponse response = new ErrorResponse(ErrorCode.INTER_SERVER_ERROR);
return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
서버를 방금 켰으니, 조회 해봐도 H2 데이터베이스에 저장된 데이터가 없어서 아무것도 출력되지 않겠지.
데이터 하나를 저장해서 ID 값이 1인 녀석을 넣어보자
ID 값이 2인 녀석을 지우려고 시도하면
"해당 ID는 존재하지 않습니다." 라는 메시지를 띄우며
내가 입력해둔 에러코드까지 잘 나온다.
제대로 1번 ID를 삭제하면 잘 삭제 된다.