[SpringSecurity + JWT] 06. BaseResponse, ExceptionHandler
JWT Series
추가 작업으로 일정한 Response 형식을 반환하고 ExceptionHandler 를 추가하겠습니다.
BaseResponse
data class BaseResponse<T>(
val resultCode: String = ResultCode.SUCCESS.name,
val data: T? = null,
val message: String = ResultCode.SUCCESS.msg,
)
응답은 다음과 같이 나타낼 것입니다. Data 와 message 를 분리하고 Exception 에 Custom message 가 정확하게 뜨는 것을 예상합니다.
ExceptionHandler
@RestControllerAdvice
class CustomExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException::class)
protected fun methodArgumentNotValidException(ex: MethodArgumentNotValidException): ResponseEntity<BaseResponse<Map<String, String>>> {
val errors = mutableMapOf<String, String>()
ex.bindingResult.allErrors.forEach { error ->
val fieldName = (error as FieldError).field
val errorMessage = error.defaultMessage
errors[fieldName] = errorMessage ?: "Not Exception Message"
}
return ResponseEntity(BaseResponse(ResultCode.ERROR.name, errors, ResultCode.ERROR.msg), HttpStatus.BAD_REQUEST)
}
@ExceptionHandler(InvalidInputException::class)
protected fun invalidInputException(ex: InvalidInputException): ResponseEntity<BaseResponse<Map<String, String>>> {
val errors = mapOf(ex.fieldName to (ex.message ?: "Not Exception Message"))
return ResponseEntity(BaseResponse(ResultCode.ERROR.name, errors, ResultCode.ERROR.msg), HttpStatus.BAD_REQUEST)
}
@ExceptionHandler(BadCredentialsException::class)
protected fun badCredentialsException(ex: BadCredentialsException): ResponseEntity<BaseResponse<Map<String, String>>> {
val errors = mapOf("로그인 실패" to "아이디 혹은 비밀번호를 다시 확인하세요.")
return ResponseEntity(BaseResponse(ResultCode.ERROR.name, errors, ResultCode.ERROR.msg), HttpStatus.BAD_REQUEST)
}
@ExceptionHandler(Exception::class)
protected fun defaultException(ex: Exception): ResponseEntity<BaseResponse<Map<String, String>>> {
val errors = mapOf("미처리 에러" to (ex.message ?: "Not Exception Message"))
return ResponseEntity(BaseResponse(ResultCode.ERROR.name, errors, ResultCode.ERROR.msg), HttpStatus.BAD_REQUEST)
}
}
ExceptionHandler 는 다음과 같습니다. 필요에 따른 Exception 을 처리하고 메세지 등을 BaseResponse 에 담아 깔끔하게 처리합니다.
해당 클래스에서는 작성된 순서대로 처리하기 때문에 Exception 클래스를 처리하는 핸들러는 꼭 마지막에 작성되어야 위의 예외들을 처리하지 못한 나머지 예외를 처리할 수 있습니다.
위와 같이 잘못된 요청이 들어올 경우 설정해놓은 메세지로 빠르게 에러를 파악할 수 있습니다.
댓글남기기