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 |