[SpringBoot] 예외처리 핸들링 (2) - ExceptionResolver

해니·2024년 9월 25일
0

SpringBoot

목록 보기
19/24
post-thumbnail

HandlerExceptionResolver

  • 컨트롤러 밖으로 던져진 예외를 해결하고, 동작 방식을 변경하고 싶은 경우 HandlerExceptionResolver (줄여서 ExceptionResolver)를 사용한다.
  • ExceptionResolver 적용 전
    • 컨트롤러에서 예외가 발생하였을 경우, 처리하지 못하고 WAS로 전달되면 상태코드 500 서버 에러가 발생한다.
  • ExceptionResolver 적용 후
    • WAS로 예외가 전달되기 전에 예외 해결 시도가 가능하다.

✅ 이미 예외가 발생했기 때문에, ExceptionResolver로 예외를 해결해도 인터셉터의 postHandle()메서드는 호출되지 않는다.



HandlerExceptionResolver 구현

package com.common.exception.resolver

import com.common.exception.enums.ExceptionEnum
import com.fasterxml.jackson.databind.ObjectMapper
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import org.springframework.http.HttpStatus
import org.springframework.http.MediaType
import org.springframework.web.servlet.ModelAndView
import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver
import java.nio.charset.StandardCharsets

class CommonHandlerExceptionResolver : AbstractHandlerExceptionResolver() {
    override fun doResolveException(request: HttpServletRequest, response: HttpServletResponse, handler: Any?, ex: java.lang.Exception): ModelAndView? {
        val exceptionClassName = ex.javaClass.getName()
        val exceptionClass = ExceptionEnum.ExceptionClassName.findClassName(exceptionClassName)
        if (exceptionClass != null) {
            response.status = exceptionClass.httpStatus
        } else {
            response.status = HttpStatus.INTERNAL_SERVER_ERROR.value()
        }
        response.contentType = MediaType.APPLICATION_JSON.type
        response.characterEncoding = StandardCharsets.UTF_8.name()

        val objectMapper = ObjectMapper()
        try {
            response.writer.write(objectMapper.writeValueAsString(ex.message))
            response.writer.flush()
        } catch (e: Exception) {
            logger.error("", e)
        }

        return null
    }
}

간단하게 예외 메세지를 반환하는 ExceptionResolver를 구현해봤는데 맞게 한 건지 잘 모르겠다 ㅎ..~ 더 학습한 이후에 코드 수정을 해봐야겠다. 추후에 @ControllerAdvice, @ExceptionHandler를 이용한 예외처리 방법도 기록해야겠다 ! 🧐📚






출처
API 예외 처리 (1) - MediaType, ExceptionResolver
스프링 부트 API 예외 처리 [2] HandlerExceptionResolver
ExceptionResolver를 이용한 API예외 처리
[Spring MVC] Exeption 처리방법 - AbstractHandlerExceptionResolver

profile
💻 ⚾️ 🐻

0개의 댓글