프로젝트를 진행하다 보면 여러가지 예외가 발생합니다. 그중 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
반응형
'Spring Boot > Kotlin' 카테고리의 다른 글
[Spring boot / Kotlin] Spring security + JWT 로그인 구현하기 (5) | 2021.12.30 |
---|---|
[Spring boot / Kotlin] 생성/수정 시간 자동화 (0) | 2021.12.20 |