Page tree
Skip to end of metadata
Go to start of metadata

Exception 의 처리 및 Logging(작성중..)

Exception 처리 Practice

Use a single, system-wide exception class


  1. Use a single, system-wide exception class
  2. Use enums for error codes
  3. Add error numbers to enums
  4. Add dynamic fields to your exceptions
  5. Prevent unnecessary nesting
  6. Use a central logger with a web dashboard
논의 사항 
  • 클라이언트는 메서드 시그니쳐를 보고 예외 상황을 유추 할 수 없다.
  • Exception 의 종류를 구분하기 위한 부산물이 필요해진다.
  • 여러 Exception Class 를 만들고 관리하기 어렵다는 점에 대해서는 해결 책이 될 수 있을 듯 하다. 
  • error 코드 만 보고서는 예외의 타입을 알 수 없다. 
  • error 코드 와 message 의 관리가 필요하다.
  • catch 블럭안에서 error 코드로 분기하여 처리하게 된다.
  • 전달하는 메세지를 파싱을 통해 정보를 추출하지 안아도 된다.
  • 하나의 system-wide Exception 을 좀더 추상적으로 세분화 하면 어떨까?  
사용자 정의 Exception 을 만들지 않는다.
catch 하면 무조건 unchecked 상태로 throw 한다.
throw 된  unChecked Exception 은 중앙에서 관리한다. 
프로세스 로직은 상태메서드를 이용한다.
Exception 은 unchecked 로 던진다. 
Checked Exception 은 OCP 를 위반한다. 연쇄적으로 메서드 throws 절에 추가를 하던지 아니면 catch 해야한다. 상위에서 수정이 일어날시 연쇄적 변경이 일어난다.
오류사항의 처리를 본 프로세스로직과 떨어트려 놓으려는 예외 Exception의 의도를 checked Exception 이 망가트려버린다.
사실더 큰 문제는 catch 되는 Exception 의 대부분이 클라이언트가 복원, 처리 할 수 없는 예외라는 점이다. 의무적으로 잡다보니 빈 catch 문이나 내부 블럭에서 의미없는 출력이 대부분이다.

 

Spring WEB-MVC Exception Handling

HandlerExceptionResolver

Spring 에서는 총 6개의 구현체를 제공하고 있다. (3.1.2 기준)

    • AnnotaionMethodHandlerExceptionResolver
    • ResponseStatusExceptionResolver
    • DefaultHandlerExceptionResolver
    • SimpleMappingExceptionResolver
    • ExceptionHandlerExceptionResolver
    • HandlerExceptionResolverComposite
  • 이 중 AnnotaionMethodHandlerExceptionResolver , ResponseStatusExceptionResolver, DefaultHandlerExceptionResolver 은 Default 로 등록 되어있음.
  • Default 로 등록된 3개의 HandlerExceptionResolver 는 위 언급한 순서 대로 처리 Resolver를 찾고 먼저 처리하면 뒤는 처리하지않음.
  • 만약 위 Default 전략이 마음에 들지 않는다면 사용자가 직접 등록 할 수 있다. 단 주의해야 할 것이 사용자 등록은 Default 를 제거한 후 등록된다는 점이다.

AnnotaionMethodHandlerExceptionResolver

    • 하나의 Controller 내에서 공통적으로 처리 할 때 사용하면 유용하다. 
    • 초기에 고려 할 만하다. 여러 컨트롤러서 동일한 Exception 에 대해서 동일한 처리를 한다면 다른 HandlerExceptionResolver (SimpleMappingExceptionResolver 등) 를 고민해보아야한다.

ResponseStatusExceptionResolver

    • 거의 그다지 쓸일없음
    • @ResponseStatus 를 사용한 Exception class 를 작성해야 하는 까닭에 귀찮음이 발생 거의 그다지 쓸일없음
    • 차리리 AnnotationMethodHandlerExceptionResolver @ExceptionHandler 메소드의 Parameter 를 HttpServletResponse 를 받고 setStatus 하는 방향을 선택..

DefaultHandlerExceptionResolver

    • Spring MVC 내부적으로 발생하는 Exception 을 잡아 HttpStatusCode 와 연결 짖는 표준화된 Convertion 을 제공한다.
    • NoSuchRequestHandlingMethodException -> HttpServletResponse.SC_NOT_FOUND( 404 )
    • HttpRequestMethodNotSupportedException -> HttpServletResponse.SC_METHOD_NOT_ALLOWED ( 405 )

SimpleMappingExceptionResolver

    • 중앙집중적으로 관리가 가능하다. 
    • 외부파일을 통해 선언적으로 관리가 가능하다.
    • 로깅등을 하기에는 불편하고 어렵다. 단순한 View로 용으로 용이하다.
    • 앞의 불편한점을 해소하기 위해 AnnotaionMethodHandlerExceptionResolver 과의 조합을 고려해볼만하다. 
    • 또는 HandlerInterceptor 를 고려...

HandlerInterceptor

  • afterCompletion(HttpServletRequest, HttpServletResponse, Object, Exception) 를 사용하여 Exception 을 처리 할 수 있음 
  • HandlerExceptionResolver 와 같이 사용 했을 때 유의 할 점은 이미 처리 된 Exception 에 대해서는 Interceptor 하지 않는점이다.

AOP를 이용한 방법

  • aop를 제공하는 ApplicationContext 단위에서만 처리가 가능하다. 
  • aop 대상 포인트컷에 대한 관리가 어렵다. 

외부에서 발생하는 Exception Handling

참고자료

  • No labels

5 Comments

  1. 완수형 쿠팡 여직원들 그만 보시고 달려욬ㅋㅋㅋㅋㅋㅋ

  2. 그러게. 영주 환송회를 빌미 삼아서 짧게 끝내려는 속셈인 듯 한데 난 용서할 수 없다.

    쿠팡 여직원들이 얼마나 예쁜지는 모르겠지만 스터디는 스터디이니 만큼 열심히 준비해서 유종의 미를 거둘 수 있도록 해주라.

  3. 개발 조직만 따로 독립되어 건물이 분리되는 순간 쿠팡 여직원에서 쿠팡 개발자로 변경됨.

    이쁜거와는 별개로 그냥 다 같이 개발자(프로그래머, 디자이너, 기획, 기타등등)임.

  4. 음 .... 먼가 이상한 방향으로 이미지가 굳어져가는 이 상황...ㅡㅡa