sumday11
410
2021-09-29 15:43:24
2
193

Spring Boot 저수준 예외처리에 대해서 질문 드립니다!!


안녕하세요 백엔드 개발자 취준생 입니다.!! 최근 면접에서 있었던 질문에 대해서 정답을 못찾겠어서 여러분에게 도움을 얻고자 합니다. 먼저 저는 Java 기반의 Spring Boot로 백엔드 개발을 준비했고 이와 관련해서 면접을 진행했습니다.

저의 포폴에 꼼꼼한 예외처리를 했다라고 작성을 했는데 여기서 많은 질문들이 있었습니다!!! 저는 ExceptionalHandler를 이용하여 @ControllerAdvice를 이용한 GlobalExceptionHandler로 Client의 잘못된 요청들을 처리하는 것으로 예외처리를 했습니다. 


이때 들어온 질문이 Error가 생긴다면 어떻게 할 것이냐?? 라는 질문에  Error 터지면 서버가 죽을 것이고 빠르게 Error를 감지해서 재발을 막을 것이다 이런식으로 대답을 했는데 면접관님이 아 서버가 그냥 죽게 내버려두겠다??? 이런식으로 계속 꼬리를 무는 질문을 했습니다!! 

그리고 RuntimeException 보다 상위 클래스에서 잡아야 하는 예외들은 어떻게 처리할 것인지 이런것들을 다 처리하지 못했는데 이게 왜 꼼꼼한 예외처리 인지 설명해달라고 했는데 여기에 대해선 답변을 제대로 하지 못했습니다.

그렇다면 궁금한게 네트워크 에러와 같은 저수준의 에러를 개발자는 어떻게 핸들링 해야 하나요?? 너무 궁금합니다 서비스 운영을 하다보면 생각지 못한 에러가 발생하는건 당연한거 아닌가요??? 이런걸 발견하면서 점점 서비스를 단단하게 만드는 것이 유지보수의 영역이고 서비스가 성장하는 것 중 하나라고 생각하는데 어떻게 해야 꼼꼼한 예외처리를 한 것이며 저수준의 에러들은 어떻게 다 처리할 수가 있나요???

0
  • 답변 2

  • Dierslair
    5k
    2021-09-29 15:59:57 작성 2021-09-29 16:02:50 수정됨

    스프링에서의 에러 처리는 크게 두 군데에서 담당합니다.

    1. HandlerExceptionResolver: 컨트롤러 매핑 성공 후, 비즈니스 로직에서 발생하는 오류 처리.
    2. ErrorController: 컨틀로러 매핑 이전, 필터 등에서 발생한 오류 처리.

    1번은 아무 설정 없어도 WebMvcConfigurationSupport#addDefaultHandlerExceptionResolvers 에서 기본적인 오류 처리 핸들러를 등록합니다. ResponseStatusException가 발생하거나, @ExceptionHandler를 등록한 경우 기본 핸들러에서 오류 처리를 해 줍니다. (DispatcherServlet#processHandlerException 참조)

    2번의 경우, 서블릿 컨테이너는 예외를 감지한 후, 우리가 작성한 애플리케이션의 error path (보통 /error) 로 forwarding 시도를 1번 합니다. /error 경로에 정의된 에러 컨트롤러가 오류를 잘 처리하면 그대로 끝이고, 에러 컨트롤러가 없거나, 오류를 처리하지 못하는 경우 서블릿 컨테이너 자체 핸들러로 처리합니다 (톰캣의 파란 띠가 있는 오류 화면 등)

    결론은 JVM 이 죽지 않는 이상 오류가 발생한다고 해도 앱이 죽는 일은 없습니다.

    서블릿을 벗어나는 수준에서 앱이 죽는 경우, 일반적으로 크론탭을 사용한 주기적인 헬스 check 또는 Load Balancer를 활용한 병렬 운용등으로 대응하고 있습니다.

  • sumday11
    410
    2021-09-29 16:27:00

    와 상세한 답변 정말 감사합니다 ErrorController에 대해서 개념을 정리하면 조금더 감이 올 것 같습니다!!! 친절한 답변 정말 정말 감사합니다!!!

  • 로그인을 하시면 답변을 등록할 수 있습니다.