-
[Spring] Filter 단에서 발생하는 예외처리하기Back End/Spring Boot 2023. 5. 8. 17:34
AccessDeniedHandler, AuthenticationEntryPoint 등 뭔가 제한적인 예외처리가 아닌 전역적인 예외처리를 하고 싶었다.
프레임워크에서 제공해주는 예외처리법이 있지 않을까 싶어 최대한 예외처리 필터를 끼워넣는 일은 지양하고 싶었지만 시간에 쫒겨 타협을 해버렸다.
근데 막상 작성해보니까 괜찮은 것 같다.
존재하는지는 모르겠지만 러닝커브가 있는 프레임워크가 제공해주는 예외처리법을 학습하지 않아도 필터 동작에 대한 개념만 있다면
누구든 아래의 코드를 이해할 수 있을테니까 말이다.
더불어 하나의 필터에서 스프링 컨텍스트 외부의 예외를 처리할테니 유지보수 비용도 크지 않아보인다.
예외처리 필터
CommonException 을 상속 받은 모든 Exception 은 모두 예쁘게 예외처리 된다. (행복)
class ExceptionHandlingFilter( private val objectMapper: ObjectMapper ) : Filter { @Throws(IOException::class, ServletException::class) override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { val res = response as HttpServletResponse val req = request as HttpServletRequest try { chain.doFilter(req, res) } catch (e: CommonException) { res.contentType = MediaType.APPLICATION_JSON_VALUE res.status = e.code res.characterEncoding = Charsets.UTF_8.toString() val writer = res.writer writer.println(objectMapper.writeValueAsString(CommonResponse<CommonException>(e))) writer.flush() writer.close() } } }
Common Exception
open class CommonException( open val code: Int = HttpStatus.INTERNAL_SERVER_ERROR.value(), override val message: String = HttpStatus.INTERNAL_SERVER_ERROR.reasonPhrase, override val cause: Throwable? = null ) : Exception(message, cause)
Common Response
data class CommonResponse<T>( val code: Int = HttpStatus.OK.value(), val message: String = HttpStatus.OK.reasonPhrase, val data: T? = null ) { constructor(exception: CommonException) : this(exception.code, exception.message) constructor(exception: CommonException, data: T?) : this(exception.code, exception.message, data) }
728x90'Back End > Spring Boot' 카테고리의 다른 글
[Swagger] Parameter Description (@RequestParameter 에 설명추가) (0) 2022.12.17 [Spring/Network] 서블릿과 WAS에 대하여 (0) 2022.02.25 [Spring] HTTP 405 Error 원인 및 해결 방법 (0) 2022.02.15 [Spring] Controller 와 Service 레이어의 DTO,Entity 분리에 관하여 (0) 2021.12.25 [Spring] 심각한 Log4j 보안문제 (feat. Slf4j) (0) 2021.12.24