Exception 의 처리 및 Logging(작성중..)
Exception 처리 Practice
Use a single, system-wide exception class
- Use a single, system-wide exception class
- Use enums for error codes
- Add error numbers to enums
- Add dynamic fields to your exceptions
- Prevent unnecessary nesting
- 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
참고자료
- [http://www.slipp.net]
- http://www.slideshare.net/dhrim/ss-2804901
- Effective Java
5 Comments
김문수
완수형 쿠팡 여직원들 그만 보시고 달려욬ㅋㅋㅋㅋㅋㅋ
박재성
그러게. 영주 환송회를 빌미 삼아서 짧게 끝내려는 속셈인 듯 한데 난 용서할 수 없다.
쿠팡 여직원들이 얼마나 예쁜지는 모르겠지만 스터디는 스터디이니 만큼 열심히 준비해서 유종의 미를 거둘 수 있도록 해주라.
양완수
하하하
김현기
개발 조직만 따로 독립되어 건물이 분리되는 순간 쿠팡 여직원에서 쿠팡 개발자로 변경됨.
이쁜거와는 별개로 그냥 다 같이 개발자(프로그래머, 디자이너, 기획, 기타등등)임.
양완수
음 .... 먼가 이상한 방향으로 이미지가 굳어져가는 이 상황...ㅡㅡa