본문 바로가기
Spring Boot/Kotlin

[Spring boot / Kotlin] exception Handling

by D.B_18 2021. 12. 20.

프로젝트를 진행하다 보면 여러가지 예외가 발생합니다. 그중 500 error가 나는 경우, 그 이유는 다음과 같습니다.

 

- 서버 통신의 Timeout 시간 지연 오류

- 서버 트래픽 과부하

- 서버 언어의 구문 에러(스크립트 문법 오류)

 

오늘은 발생된 예외를 처리하는 방법에 대해서 다뤄보도록 하겠습니다.

 

1. BaseResponseCode Enum 생성

응답을 보낼 객체의 형태는 자유롭게 정의할 수 있으며, 저는 Enum 타입을 사용했습니다.

HttpStatus 타입의 status와 String 타입의 message를 선언했습니다.

 

enum class BaseResponseCode(status: HttpStatus, message: String) {
    BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."),
    INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "잘못된 비밀번호입니다. 다시 입력해주세요."),
    DUPLICATE_EMAIL(HttpStatus.BAD_REQUEST, "중복된 이메일입니다. 다시 입력해주세요."),

    USER_NOT_FOUND(HttpStatus.NOT_FOUND, "사용자를 찾을 수 없습니다."),
    FAILED_TO_SAVE_USER(HttpStatus.NOT_FOUND, "사용자를 등록에 실패했습니다."),
    GUEST_BOOK_NOT_FOUND(HttpStatus.NOT_FOUND, "방명록을 찾을 수 없습니다."),
    OK(HttpStatus.OK, "요청 성공");

    public val status: HttpStatus = status
    public val message: String = message
}

2. BaseException 생성

응답을 보낼 객체를 생성했다면, 발생시킬 예외를 커스텀하여 생성해줍니다.

 

class BaseException(baseResponseCode: BaseResponseCode): RuntimeException() {
    public val baseResponseCode: BaseResponseCode = baseResponseCode
}

 

RuntimeException을 상속받은 클래스로, 앞에서 생성한 Enum 타입을 갖고 있습니다.

예외를 던져줄 때 BaseException을 사용해 처리된 형태로 응답을 보낼 수 있습니다.

throw BaseException(BaseResponseCode.BAD_REQUEST)

 

{
  "status": "BAD_REQUEST",
  "message": "잘못된 요청입니다."
}

3. Exception Handler 구현

throw한 예외를 받아서 처리해줄 수 있는 controller를 구현합니다.

 

@RestControllerAdvice
class ExceptionHandler {
    @ExceptionHandler(BaseException::class)
    protected fun handleBaseException(e: BaseException): ResponseEntity<BaseRes> {
        return ResponseEntity.status(e.baseResponseCode.status)
            .body(BaseRes(e.baseResponseCode.status, e.baseResponseCode.message))
    }
}

 

@RestControllerAdvice를 클래스에 선언해주면, 모든 @Controller에 대한 전역으로 발생하는 예외를 잡아서 처리할 수 있습니다.

또한, 예외 처리를 위해 선언된 함수 위에 @ExceptionHandler(BaseException::class)를 선언해주면, 발생한 BaseException에 대한 처리를 수행하도록 해줍니다.

728x90
반응형