실무 프로젝트로 배우는 Kotlin & Spring/회원 인증 서비스 개발하기

공통 에러 처리

webmaster 2022. 12. 13. 20:04
728x90

에러 응답 모델 정의

data class ErrorResponse(
    val code: Int,
    val message: String,
)
  • code로 어떤 에러가 발생했는지 정의한다.
    • Http status code만으로 모든 에러에 대한 케이스를 처리하기 힘들기 때문엔 code를 정의하였다.
  • 에러가 발생했을 때 나타낼 메시지를 표시한다.
    • 메시지에 stacktrace와 같이 언어, 프레임워크 정보, DB필드 등이 노출되면 절대 안 된다.

Exception 구조 정의

sealed class ServerException(
    val code: Int,
    override val message: String,
): RuntimeException(message)
  • 최상위 ServerException을 sealed 클래스로 정의하였다.

GlobalExceptionHandler 정의

@Configuration
class GlobalExceptionHandler(
    private val objectMapper: ObjectMapper,
) : ErrorWebExceptionHandler {
    private val logger = KotlinLogging.logger {}
    override fun handle(exchange: ServerWebExchange, ex: Throwable): Mono<Void> = mono {
        //mono라는 코루틴 빌더를 사용하면, mono안에서 코루틴을 사용할 수 있다.
        logger.error { ex.message }
        val errorResponse = if (ex is ServerException) {
            ErrorResponse(code = ex.code, message = ex.message)
        } else { //정의하지 않은 오류
            ErrorResponse(code = 500, message = "Internal Server Error")
        }
        with(exchange.response){
            statusCode = HttpStatus.OK
            headers.contentType = MediaType.APPLICATION_JSON
            val dataBuffer = bufferFactory().wrap(objectMapper.writeValueAsBytes(errorResponse))
            writeWith(dataBuffer.toMono()).awaitSingle() //코루틴으로 변환
        }
    } //Exception 핸들링 객체
}
  • 애플리케이션에서 발생하는 모든 예외를 처리하는 GlobalExceptionHandler를 정의하였다.
  • ExceptionHandler에서 정해진 ErrorResponse 객체로 응답하게 되면 항상 일관성 있는 에러 처리를 할 수 있다.
  • mono라는 코루틴 빌더를 사용하면, mono안에서 코루틴을 사용할 수 있다.
728x90

'실무 프로젝트로 배우는 Kotlin & Spring > 회원 인증 서비스 개발하기' 카테고리의 다른 글

회원가입  (0) 2022.12.14
JWT 기반 인증 구현  (0) 2022.12.13
토큰 기반 인증  (0) 2022.12.13
API 스펙 정의  (0) 2022.12.13
프로젝트 구성하기  (0) 2022.12.13