Exception 처리 전략에 대해서..

1,074 views
Skip to first unread message

namkyu Lee

unread,
Apr 16, 2012, 8:23:33 AM4/16/12
to ks...@googlegroups.com
오늘 Exception의 중요함을 깨닫고 이를 어떻게 설계해야 코드를 읽기 쉬우면서 에러 처리를 확실히 할 수 있을까 고민을 하게 되었습니다.

이해하기 쉽게 설명하기 위해서 다음과 같은 모듈이 있다고 하겠습니다.

MailSender 클래스 : 메일 전송 담당
MailHandler 클래스 :  메일 전송에 필요한 메시지 생성 및 핸들링
Main 클래스 : 테스트 용 클래스

실행 순서는 Main --> MailHandler --> MailSender


MailSender
 - makeBodyPart 메소드
 - attachFiles 메소드
 - configureMessage 메소드

## 첫 번째 방안 
1. 위의 3개의 메소드에서는 try ~ catch 절이 없고 예외 발생 시 throws처리 (throws 되는 객체는 모두 Exception)
2. MailHandler 클래스에서 try ~ catch 하여 예외 처리

## 두 번째 방안
1. 위의 3개의 메소드에 try ~ catch 절을 모두 추가한 후 예외 발생 시 예외 로그를 남긴 후 상위로 throw Exception
2. MailHandler 클래스에서 try ~ catch 하여 예외 처리

위의 두 가지 방안 중에서 그나마 코드를 읽는데 방해가 없고, 깔끔할 것 같은 첫 번째 방안이 끌립니다.

허나, 위의 두 가지 방법 모두 anti 패턴 같기도 하구요. ㅠㅠ

여러 분들은 어떻게 Exception을 처리하고 계시나요?








Sungchul Park

unread,
Apr 16, 2012, 12:28:02 PM4/16/12
to ks...@googlegroups.com
예외 처리는 지금 말씀하신 수준에서 얘기될 수 있는 것이 아니기 때문에 어
려운 것일 수 있습니다. 사실 별로 어렵지 않은데 낯설어서 어렵게 느껴지고
잘못 취급하게 됩니다.

먼저 예외가 모두 오류인 건 아니라는 점을 인식해야 합니다. 예외는 C 같은
언어에서 비 정상적인 상황을 반환값으로 구분하던 관례를 구조적으로 처리할
수 있도록 도입된 언어적 장치입니다. C의 반환값 중에는 애플리케이션 설계
시 미리 정의한 오류코드에 따라 적절히 대응해줘야 하는 것도 있고 단순히
오류인지 여부만 확인(대부분 음의 숫자)만 해서 로직을 중단해 버리는 경우
도 있습니다. 예외도 이와같이 극복(=대응) 가능한 예외와 극복 불가능한 예
외(기껏 할 수 있는 게 로그 정도만 남기고 로직을 중단해야하는 예외)로 구
분됩니다. 그리고 이에 따라 예외 처리 방법도 달라집니다.

극복 가능한 예외는 자바의 checked exception을 사용해도 되고 최근 추세에
따라 runtime exception으로 취급하되 메서드 시그니처에 명세화해서 써도 좋
습니다. 그리고 이런 예외는 메서드를 호출한 쪽에서 반드시 받아 처리해야겠
죠. 극복 가능한 예외는 대부분 로직상 의미를 갖는 예외이고 애플리케이션
설계 과정에서 직접 만드는 경우도 많습니다.

극복 불가능한 예외는 try-cache로 받아봤자 어떻게 할 수 없는 오류가 발생
상황입니다. 이런 예외는 해당 단위 작업의 시발점에서 모든 예외(또는 Error
포함)를 받아 처리하지 않으면 프로그램이 중단되는 상황이 발생하기도 합니
다. 대부분의 웹 애플리케이션에서는 request 단위에서 발생하는 예외를 격리
하고 처리하는 기능을 프레임워크가 가지고 있기 때문에 프레임워크에 위임해
서 처리하는 편이지만 독립형 애플리케이션이나 데몬 형태의 프로그램에서는
직접 처리해줘야 합니다.

로드존슨의 J2EE 설계와 개발에 예외 처리에 대한 좋은 가이드가 들어 있습니다.
http://www.yes24.com/24/goods/428809

이펙티브 자바의 지침도 반드시 읽어둘만 하구요.

예외와 관련해 말할 일이 있으면 늘 소개하는 정상혁님의 블로그 글이 예외
처리와 관련된 지침의 총 정리 같은 글이죠.
http://blog.benelog.net/1901121

12. 4. 16. 오후 9:23, namkyu Lee 쓴 글:

> --
> Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이
> 전송되었습니다.
> 웹에서 이 토론을 보려면
> https://groups.google.com/d/msg/ksug/-/o8LieA3ZlrQJ을 (를) 방문하세요.
> 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내
> 주세요.
> 더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그
> 룹을 방문하세요.

Ki-Seok Kim

unread,
Apr 16, 2012, 8:30:54 PM4/16/12
to ks...@googlegroups.com
이런 좋은내용 좋습니다. 감사합니다. 



2012년 4월 17일 오전 1:28, Sungchul Park <gyu...@gmail.com>님의 말:
그룹에서 탈퇴하려면 ksug+unsubscribe@googlegroups.com로 이메일을 보내 주세요.

더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그 룹을 방문하세요.
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+unsubscribe@googlegroups.com로 이메일을 보내주세요.

전성욱

unread,
Apr 16, 2012, 8:32:25 PM4/16/12
to ks...@googlegroups.com
좋은 정보 감사합니다. 내용 참고해서 Exception에 대한 부분을 고민좀 해봐야 겠네요 ^^

2012년 4월 17일 오전 9:30, Ki-Seok Kim <hello...@gmail.com>님의 말:
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.

임도형

unread,
Apr 16, 2012, 9:15:46 PM4/16/12
to ks...@googlegroups.com, ks...@googlegroups.com

예외에 대한 이슈는 2가지 입니다. 누가 예외를 처리할 것인가와 누가 로그를 남길 것인가.

 

누가 예외를 처리할 것인가는, 각 클래스 혹은 컴퍼넌트의 역활과 직접 관련 있습니다. 따라서 어디서 처리할 것인가는 별로 고민이 되지는 않습니다.

 

그것보다는 로그를 누가 남길 것인가가 더 문제가 되는 것 같습니다. 중복으로 남기지도 않고, 누락되지도 않으려면. 이에 대하여 가이드를 드리자면 다음과 같은 2곳에서 로그를 남기면 됩니다. 1. 예외를 처리하여 더이상 예외가 아니게 한 곳, 2.외부 와의 인터페이스로 예외를 전파할 때.

 

다음은 예전에 예외에 대하여 발표했던 자료입니다. 위의 내용을 담고 있습니다.

http://aploit.egloos.com/4785911

 

 

--------- 원본 메일 ---------
보낸사람: namkyu Lee <lng...@gmail.com>
받는사람 : ks...@googlegroups.com
날짜: 2012년 4월 16일 월요일, 21시 23분 33초 +0900
제목: [KSUG] Exception 처리 전략에 대해서..
오늘 Exception의 중요함을 깨닫고 이를 어떻게 설계해야 코드를 읽기 쉬우면서 에러 처리를 확실히 할 수 있을까 고민을 하게 되었습니다.

이해하기 쉽게 설명하기 위해서 다음과 같은 모듈이 있다고 하겠습니다.

MailSender 클래스 : 메일 전송 담당
MailHandler 클래스 :  메일 전송에 필요한 메시지 생성 및 핸들링
Main 클래스 : 테스트 용 클래스

실행 순서는 Main --> MailHandler --> MailSender


MailSender
 - makeBodyPart 메소드
 - attachFiles 메소드
 - configureMessage 메소드

## 첫 번째 방안 
1. 위의 3개의 메소드에서는 try ~ catch 절이 없고 예외 발생 시 throws처리 (throws 되는 객체는 모두 Exception)
2. MailHandler 클래스에서 try ~ catch 하여 예외 처리

## 두 번째 방안
1. 위의 3개의 메소드에 try ~ catch 절을 모두 추가한 후 예외 발생 시 예외 로그를 남긴 후 상위로 throw Exception
2. MailHandler 클래스에서 try ~ catch 하여 예외 처리

위의 두 가지 방안 중에서 그나마 코드를 읽는데 방해가 없고, 깔끔할 것 같은 첫 번째 방안이 끌립니다.

허나, 위의 두 가지 방법 모두 anti 패턴 같기도 하구요. ㅠㅠ

여러 분들은 어떻게 Exception을 처리하고 계시나요?








 

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
웹에서 이 토론을 보려면 https://groups.google.com/d/msg/ksug/-/o8LieA3ZlrQJ을(를) 방문하세요.

이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.




namkyu Lee

unread,
Apr 16, 2012, 11:43:34 PM4/16/12
to ks...@googlegroups.com
답변 감사합니다.
에러 처리라는 것이 쉽지 않은 작업이군요.
자료를 모아서 좀 더 고민을 해봐야 할 것 같습니다. ^^

2012년 4월 17일 오전 1:28, Sungchul Park <gyu...@gmail.com>님의 말:
예외 처리는 지금 말씀하신 수준에서 얘기될 수 있는 것이 아니기 때문에 어 려운 것일 수 있습니다. 사실 별로 어렵지 않은데 낯설어서 어렵게 느껴지고 잘못 취급하게 됩니다.
그룹에서 탈퇴하려면 ksug+unsubscribe@googlegroups.com로 이메일을 보내 주세요.

더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그 룹을 방문하세요.
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+unsubscribe@googlegroups.com로 이메일을 보내주세요.

namkyu Lee

unread,
Apr 16, 2012, 11:44:29 PM4/16/12
to ks...@googlegroups.com
자료 감사합니다.
나중에 써먹어 볼 정보들이 많네요 ^^

2012년 4월 17일 오전 10:15, 임도형 <dh-...@hanmail.net>님의 말:

자유

unread,
Apr 18, 2012, 8:18:26 PM4/18/12
to ks...@googlegroups.com
마침 얼마전에 '토비의 스프링 3'에서 관련 부분을 읽었던 기억이나네요.

"4장 예외" 부분이 도움이 되실듯 합니다.




2012년 4월 16일 월요일 오후 9시 23분 33초 UTC+9, namkyu Lee 님의 말:

고종봉

unread,
Apr 22, 2012, 8:16:21 AM4/22/12
to ks...@googlegroups.com
성의를 가지고 좋은 답변 달아 주신 "박성철 고문위원"님께 감사드립니다. ^^;


2012년 4월 17일 오전 1:28, Sungchul Park <gyu...@gmail.com>님의 말:
예외 처리는 지금 말씀하신 수준에서 얘기될 수 있는 것이 아니기 때문에 어 려운 것일 수 있습니다. 사실 별로 어렵지 않은데 낯설어서 어렵게 느껴지고 잘못 취급하게 됩니다.
그룹에서 탈퇴하려면 ksug+unsubscribe@googlegroups.com로 이메일을 보내 주세요.

더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그 룹을 방문하세요.
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+unsubscribe@googlegroups.com로 이메일을 보내주세요.
Reply all
Reply to author
Forward
0 new messages