728x90
- API를 개발할 땐 에러가 발생했을 때의 상황을 고려해 항상 일관된 에러 처리 규칙을 정해야 한다
- 클라이언트에선 일관된 에러 응답을 통해 정해진 동작을 정의할 수 있다
- 예를 들어 클라이언트에서 에러 응답의 code를 읽어서 사전에 정의된 에러 메시지를 보여 주거나 에러 페이지로 리다이렉트 시키는 등의 작업을 할 수 있다
에러 응답 모델 정의
data class ErrorResponse(
val code: Int, // 어떤 오류가 발생했는지 알 수 있는 코드, 커스텀한 코드를 통해 어떤 오류가 발생한지 파악
val message: String,
) {
}
- code는 어떤 오류가 발생했는지 파악할 수 있다
- Http status code 만으로는 모든 에러에 대한 케이스를 처리하기 힘들며, 커스텀한 code를 통해 어떤 오류가 발생했는지 파악한다.
- 에러가 발생했을때, 나타낼 메시지를 표시한다.
- stacktrace, 언어, 프레임워크 정보, db필드 등이 노출되면 절대 안 된다.
Exception 구조 정의(sealed class 사용)
sealed class ServerException(
val code: Int,
override val message: String,
) : RuntimeException(message)
data class NotFoundException(
override val message: String,
) : ServerException(404, message)
data class UnAuthorizedException(
override val message: String = "인증 정보가 잘못되었습니다.",
) : ServerException(401, message)
- 최상위 ServerException을 sealed class로 정의하였다.
GlobalExceptionHandler 정의
@RestControllerAdvice //Spring 에서 controller에서 발생하는 오든 오류를 알 수 있다.
class GlobalExceptionHandler {
private val logger = KotlinLogging.logger {}
@ExceptionHandler(ServerException::class)
fun handleServerException(ex: ServerException): ErrorResponse {
logger.error { ex.message } //에러 로그 발생
return ErrorResponse(
code = ex.code,
message = ex.message
)
}
@ExceptionHandler(TokenExpiredException::class)
fun handleTokenExpiredException(ex: TokenExpiredException): ErrorResponse {
logger.error { ex.message } //에러 로그 발생
return ErrorResponse(
code = 401,
message = "Token Expired Error"
)
}
@ExceptionHandler(Exception::class) //정의하지 않은 에러
fun handleException(ex: Exception): ErrorResponse {
logger.error { ex.message } //에러 로그 발생
return ErrorResponse(
code = 500,
message = "Internal Server Error" //ex.message 를 그대로 내려주게 되면, stacktrace 로그가 바로 전달되기 때문에 로거를 통해서만 볼수 있도록 해야한다
)
}
}
- 애플리케이션에서 발생하는 모든 예외를 처리하는 GlobalExceptionHandler를 정의한다.
- @RestControllerAdvice, @ControllerAdvice를 사용하면 Controller에서 발생하는 모든 예외를 핸들링할 수 있다.
- ExceptionHandler에서 정해진 ErrorResponse 객체로 응답하면 일관성 있는 에러 처리를 할 수 있다.
- 여기서는 ServerException, TokenExpiredException, 그 외(Exception)를 잡고 있다.
- 정의하지 않는 에러를 반환할 때는 반드시 stacktrace 로그는 서버에서만 보고, 메시지는 서버에서 커스텀한 메시지를 전달해야 한다.
728x90
'실무 프로젝트로 배우는 Kotlin & Spring > 이슈 관리 서비스 개발하기' 카테고리의 다른 글
| 이슈 수정 / 이슈 삭제 (0) | 2022.11.27 |
|---|---|
| 이슈 목록 조회/ 이슈 상세 조회 (0) | 2022.11.27 |
| 이슈 등록 (0) | 2022.11.27 |
| API 스펙 정의 (0) | 2022.11.26 |
| 요구 사항 & 프로젝트 구성 (0) | 2022.11.26 |