refactor: ExceptionHandler에 새로운 예외 응답 타입 및 ResponseEntity 적용

This commit is contained in:
이상진 2025-07-15 14:32:24 +09:00
parent 0cc69179d1
commit 790fe420a0
2 changed files with 27 additions and 26 deletions

View File

@ -10,5 +10,5 @@ data class CommonApiResponse<T>(
data class CommonErrorResponse( data class CommonErrorResponse(
val errorType: ErrorType, val errorType: ErrorType,
val message: String = errorType.description val message: String? = errorType.description
) )

View File

@ -2,16 +2,15 @@ package roomescape.common.exception
import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import jakarta.servlet.http.HttpServletResponse
import org.springframework.http.HttpStatus import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.http.converter.HttpMessageNotReadableException import org.springframework.http.converter.HttpMessageNotReadableException
import org.springframework.web.HttpRequestMethodNotSupportedException import org.springframework.web.HttpRequestMethodNotSupportedException
import org.springframework.web.bind.MethodArgumentNotValidException import org.springframework.web.bind.MethodArgumentNotValidException
import org.springframework.web.bind.annotation.ExceptionHandler import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.ResponseStatus
import org.springframework.web.bind.annotation.RestControllerAdvice import org.springframework.web.bind.annotation.RestControllerAdvice
import org.springframework.web.client.ResourceAccessException import org.springframework.web.client.ResourceAccessException
import roomescape.common.dto.response.RoomescapeErrorResponse import roomescape.common.dto.response.CommonErrorResponse
@RestControllerAdvice @RestControllerAdvice
class ExceptionControllerAdvice( class ExceptionControllerAdvice(
@ -19,57 +18,59 @@ class ExceptionControllerAdvice(
) { ) {
@ExceptionHandler(value = [RoomescapeException::class]) @ExceptionHandler(value = [RoomescapeException::class])
fun handleRoomEscapeException( fun handleRoomEscapeException(e: RoomescapeException): ResponseEntity<CommonErrorResponse> {
e: RoomescapeException,
response: HttpServletResponse
): RoomescapeErrorResponse {
logger.error(e) { "message: ${e.message}, invalidValue: ${e.invalidValue}" } logger.error(e) { "message: ${e.message}, invalidValue: ${e.invalidValue}" }
response.status = e.httpStatus.value()
return RoomescapeErrorResponse.of(e.errorType, e.message!!) return ResponseEntity
.status(e.httpStatus)
.body(CommonErrorResponse(e.errorType))
} }
@ExceptionHandler(ResourceAccessException::class) @ExceptionHandler(ResourceAccessException::class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) fun handleResourceAccessException(e: ResourceAccessException): ResponseEntity<CommonErrorResponse> {
fun handleResourceAccessException(e: ResourceAccessException): RoomescapeErrorResponse {
logger.error(e) { "message: ${e.message}" } logger.error(e) { "message: ${e.message}" }
return RoomescapeErrorResponse.of(ErrorType.PAYMENT_SERVER_ERROR, ErrorType.PAYMENT_SERVER_ERROR.description) return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(CommonErrorResponse(ErrorType.PAYMENT_SERVER_ERROR))
} }
@ExceptionHandler(value = [HttpMessageNotReadableException::class]) @ExceptionHandler(value = [HttpMessageNotReadableException::class])
@ResponseStatus(HttpStatus.BAD_REQUEST) fun handleHttpMessageNotReadableException(e: HttpMessageNotReadableException): ResponseEntity<CommonErrorResponse> {
fun handleHttpMessageNotReadableException(e: HttpMessageNotReadableException): RoomescapeErrorResponse {
logger.error(e) { "message: ${e.message}" } logger.error(e) { "message: ${e.message}" }
return RoomescapeErrorResponse.of(ErrorType.INVALID_REQUEST_DATA_TYPE, return ResponseEntity
ErrorType.INVALID_REQUEST_DATA_TYPE.description) .status(HttpStatus.BAD_REQUEST)
.body(CommonErrorResponse(ErrorType.INVALID_REQUEST_DATA_TYPE))
} }
@ExceptionHandler(value = [MethodArgumentNotValidException::class]) @ExceptionHandler(value = [MethodArgumentNotValidException::class])
@ResponseStatus(HttpStatus.BAD_REQUEST) fun handleMethodArgumentNotValidException(e: MethodArgumentNotValidException): ResponseEntity<CommonErrorResponse> {
fun handleMethodArgumentNotValidException(e: MethodArgumentNotValidException): RoomescapeErrorResponse {
val messages: String = e.bindingResult.allErrors val messages: String = e.bindingResult.allErrors
.mapNotNull { it.defaultMessage } .mapNotNull { it.defaultMessage }
.joinToString(", ") .joinToString(", ")
logger.error(e) { "message: $messages" } logger.error(e) { "message: $messages" }
return RoomescapeErrorResponse.of(ErrorType.INVALID_REQUEST_DATA, messages) return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(CommonErrorResponse(ErrorType.INVALID_REQUEST_DATA, messages))
} }
@ExceptionHandler(value = [HttpRequestMethodNotSupportedException::class]) @ExceptionHandler(value = [HttpRequestMethodNotSupportedException::class])
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) fun handleHttpRequestMethodNotSupportedException(e: HttpRequestMethodNotSupportedException): ResponseEntity<CommonErrorResponse> {
fun handleHttpRequestMethodNotSupportedException(e: HttpRequestMethodNotSupportedException): RoomescapeErrorResponse {
logger.error(e) { "message: ${e.message}" } logger.error(e) { "message: ${e.message}" }
return RoomescapeErrorResponse.of(ErrorType.METHOD_NOT_ALLOWED, ErrorType.METHOD_NOT_ALLOWED.description) return ResponseEntity
.status(HttpStatus.METHOD_NOT_ALLOWED)
.body(CommonErrorResponse(ErrorType.METHOD_NOT_ALLOWED))
} }
@ExceptionHandler(value = [Exception::class]) @ExceptionHandler(value = [Exception::class])
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) fun handleException(e: Exception): ResponseEntity<CommonErrorResponse> {
fun handleException(e: Exception): RoomescapeErrorResponse {
logger.error(e) { "message: ${e.message}" } logger.error(e) { "message: ${e.message}" }
return RoomescapeErrorResponse.of(ErrorType.UNEXPECTED_ERROR, ErrorType.UNEXPECTED_ERROR.description) return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(CommonErrorResponse(ErrorType.UNEXPECTED_ERROR))
} }
} }