예외 처리
영희와 예외 철이 그 심오
함에 대한 고찰
Agenda
개요
예외? 예외!
예외 처리 난감하네
예외 처리의 시작
예외 처리의 끝
스프링에서 예외 처리
마치며
개요
어떤 애플리케이션이든 오류가 발생하고, 오류를 완벽하게 예방하기는 불가능
개발자가 가장 신경 쓰기 귀찮아 하는것이 예외 처리
예외를 잘 사용한다면 프로그램의 가독성과 신뢰도 및 유지 보수성을 향상 시킬
수 있다.
대신 잘못사용한다면 이와는 반대의 효과를 낼 수 있다.
예외를 잡았으면 처리하고 처리했으면 기록을 남겨라
예외? 예외!
프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는
경우 이러한 결과를 초래하는 원인을 에러 또는 오류라고한다.
자바에서는 실행(Runtime) 시 발생할 수 있는 오류를 에러와 예외, 두가지로 구
분
에러(Error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
예외?예외!
자바에서는 실행 시 발생할 수 있는 오류(Exception과 Error)를 클래스로 정의
[오류 클래스 계층도]
예외?예외!
1) checked Exception 2) unchecked Exception
예외...난감하네...
흔히 많이 보이는 예외를 잡았으나 잡지 않은것 같은 이야기
try {
...blar blar…
} catch(Exception e) {
}
try {
...blar blar…
} catch(Exception e) {
System.out.println(e);
}
try {
...blar blar…
} catch(Exception e) {
e.printStackTrace();
}
예외...난감하네...
귀찮아서 무의미하게 메서드 선언시 throws Exception을 붙이는 경우
적절한 처리를 통해 복구될 수 있는 상황도 제대로 처리할 수 있는 기회를 박탈 당하
게된다.
public void method1() throws Exception {
method2();
}
public void method2() throws Exception {
method3();
}
public void method2() throws Exception {
method3();
}
예외 처리의 시작
일반적인 예외 처리 방법
자바에서 예외 처리를 위한 몇가지(?) 가이드
스프링 프레임워크에서 사용되는 예외처리 방법
일반적 예외 처리 1 - 예외 복구
예외상황을 파악하고 문제를 해결해서 정상
상태로 돌려놓는 것
예외 처리 코드를 강제하는 체크 예외들은 이
렇게 예외를 어떤식으로든 복구할 가능성
이 있는 경우에 사용
int maxretry = MAX_RETRY;
while(maxretry -- > 0) {
try {
// 예외가 발생할 가능성이 있는 시도
return; // 작업성공시 리턴
}
catch (SomeException e) {
// 로그 출력. 정해진 시간만큼 대기
}
finally {
// 리소스 반납 및 정리 작업
}
}
throw new RetryFailedException(); // 최대 재시도 횟
수를 넘기면 직접 예외 발생
일반적 예외 처리2 - 예외처리 회피
예외처리를 자신이 담당하지 않고 자신을 호
출한 쪽으로 던져버리는 것
예외를 자신이 처리하지 않고 회피하는 방법
예외처리를 회피하려면 반드시 다른 오브젝트
나 메서드가 예외를 대신 처리할 수 있도록
던져줘야 한다.
public void add() throws SQLException {
... // 구현 로직
}
일반적 예외처리3 - 예외전환
예외를 메서드 밖으로 던지는것
예외회피와는 달리 적절한 예외로 전환해서
던지는 특징
의미가 불분명한 예외의 의미를 분명하게 해
줄 수 있는 예외로 전환하기 위해
예외를 처리하기 쉽고 단순하게 만들기 위해
포장하는 것
try {
...blar blar…
} catch(Exception e) {
throw DuplicateUserIdException(e);
}
자바에서 예외 처리 시 가이드
기본적으로 자바에서 사용할 수 있는 예외처리 내용을 몇가지 단계로 나눠서 설
명
1)예외를 잡았으면 처리하자
예외를 잡아서 그냥 콘솔로
출력하면 되는 경우는 거
의 없다.
컴파일 된다고 코딩이 끝난
것이 아니다.
어떻게 처리할지 모른다면
잡지 말자
처리하고 예외상황 종료
로그를 남겨야한다.
다시 던진다.
로그를 위해 메세지를 보고
다시 던진다.
다시 던질때는 메세지를 바꾸
지 않는다.
새 예외로 던진다.
무시한다.
내가 무엇을 더 해볼 수 없을
경우
Anticode
try {
blar…
} catch(Exception e) {
e.printStackTrace();
}
2) 예외를 처리했으면 로그를 남겨라
로그도 없고 처리도 안한것
은 최악이다. 차라리 안잡
는것이 낳다
뭔가 잘못됐다고 리포팅은
되지만 재현할 방법이 없
다
처리는 했는데 로그가 없는
것은 아주 나쁘다.
예외가 발생한 상황을 알수
가 없다. 시스템 개선이
힘들다.
처리도하고 로그도 있을 때
있으나 마나한 로그들은 정
말 있으나 마나한것이다.
로그는 충분한 상황을 알려
주어야하고 자세히 알려
주는것이 좋다.
Anticode
} catch(Exception e) {
// do nothing - 있으나마나
}
3) 기존 예외의 정보 누락 금지
절대 잡은 예외의 정보를 누락하지 말자.
반드시 cause로 설정하자
자세하고 친절한 설명까지는 아니더라도 최소
한 잡은 예외의 정보를 누락하지는 말자
Anticode
} catch(Exception e) {
throw new OtherException(“blar”);
}
4) 예외를 던질 때의 가이드
메세지 충실히
잡을 곳을 기준으로 예외 객체 선택
메세지를 파싱하게 하지 말자
추상 예외로 던지지 말자
그외 가이드
더 많은 예외 처리에 대한 얘기를 하고 싶으나 마지막에 시간이 남으면 얘기를 진행
해 보겟음
스프링에서 예외 처리
교재로 사용중인 토비의 스프링에서 예외 처리 부분은 DB 처리 부분으로 되어 있
어서 그냥 일반적인 컨트롤러나 서비스 단에서 처리가 어떻게 되는지 설명해
보겠음
컨트롤러 기반의 예외처리
ExceptionHandler 사용하
기
@ResponseStatus 어노테
이션 없이 예외를 처리
한다.
사용자를 특정 에러페이지
로 리다이렉트한다.
커스텀 에러 응답을 만든다.
@Controller
public class ExceptionHandlingController {
// @RequestHandler methods
...
// Exception handling methods
// Convert a predefined exception to an HTTP Status code
@ResponseStatus(value=HttpStatus.CONFLICT,
reason="Data integrity violation") // 409
@ExceptionHandler(DataIntegrityViolationException.class)
public void conflict() {
// Nothing to do
}
// Specify name of a specific view that will be used to display the error:
@ExceptionHandler({SQLException.class,DataAccessException.class})
public String databaseError() {
// Nothing to do. Returns the logical view name of an error page, passed
// to the view-resolver(s) in usual way.
// Note that the exception is NOT available to this view (it is not added
// to the model) but see "Extending ExceptionHandlerExceptionResolver"
예외와 뷰
예외를 뷰에서 보여줄때
사용자들은 예외 메세
지나 stacktrace가 들
어가 페이지를 보고
싶어하진 않는다.
페이지 소스 안에 보이지
않는것처럼 예외사항
을 넣어놓을 수 있다.
<h1>Error Page</h1>
<p>Application has encountered an error. Please contact support on ...</p>
<!-- Failed URL: ${url} Exception: ${exception.message} <c:forEach
items="${exception.stackTrace}" var="ste"> ${ste} </c:forEach> -->
예외 처리의 끝
예외 처리는 정말 내용이 너무 많아서 다 쓰자니 끝나지 않을것 같아서 이정도에
서 마무리
예외가 잡히는 상황별로 잡아서 처리만 제대로 한다면 더 나은 시스템으로 개선
이 가능할것 같다.
마치며
준비를 하며 여기에 다 표현하지 못한 내용이 많이 있습니다.
제가 게을러서 그런것이겠지요..ㅠㅠ
무엇을 표현을 못했는지 궁굼하시면 물어봐 주세요.ㅎㅎ
Thank you!

[스프링 스터디 1일차] 예외 처리

  • 1.
    예외 처리 영희와 예외철이 그 심오 함에 대한 고찰
  • 2.
    Agenda 개요 예외? 예외! 예외 처리난감하네 예외 처리의 시작 예외 처리의 끝 스프링에서 예외 처리 마치며
  • 3.
    개요 어떤 애플리케이션이든 오류가발생하고, 오류를 완벽하게 예방하기는 불가능 개발자가 가장 신경 쓰기 귀찮아 하는것이 예외 처리 예외를 잘 사용한다면 프로그램의 가독성과 신뢰도 및 유지 보수성을 향상 시킬 수 있다. 대신 잘못사용한다면 이와는 반대의 효과를 낼 수 있다. 예외를 잡았으면 처리하고 처리했으면 기록을 남겨라
  • 4.
    예외? 예외! 프로그램이 실행중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우 이러한 결과를 초래하는 원인을 에러 또는 오류라고한다. 자바에서는 실행(Runtime) 시 발생할 수 있는 오류를 에러와 예외, 두가지로 구 분 에러(Error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
  • 5.
    예외?예외! 자바에서는 실행 시발생할 수 있는 오류(Exception과 Error)를 클래스로 정의 [오류 클래스 계층도]
  • 6.
  • 7.
    예외...난감하네... 흔히 많이 보이는예외를 잡았으나 잡지 않은것 같은 이야기 try { ...blar blar… } catch(Exception e) { } try { ...blar blar… } catch(Exception e) { System.out.println(e); } try { ...blar blar… } catch(Exception e) { e.printStackTrace(); }
  • 8.
    예외...난감하네... 귀찮아서 무의미하게 메서드선언시 throws Exception을 붙이는 경우 적절한 처리를 통해 복구될 수 있는 상황도 제대로 처리할 수 있는 기회를 박탈 당하 게된다. public void method1() throws Exception { method2(); } public void method2() throws Exception { method3(); } public void method2() throws Exception { method3(); }
  • 9.
    예외 처리의 시작 일반적인예외 처리 방법 자바에서 예외 처리를 위한 몇가지(?) 가이드 스프링 프레임워크에서 사용되는 예외처리 방법
  • 10.
    일반적 예외 처리1 - 예외 복구 예외상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 것 예외 처리 코드를 강제하는 체크 예외들은 이 렇게 예외를 어떤식으로든 복구할 가능성 이 있는 경우에 사용 int maxretry = MAX_RETRY; while(maxretry -- > 0) { try { // 예외가 발생할 가능성이 있는 시도 return; // 작업성공시 리턴 } catch (SomeException e) { // 로그 출력. 정해진 시간만큼 대기 } finally { // 리소스 반납 및 정리 작업 } } throw new RetryFailedException(); // 최대 재시도 횟 수를 넘기면 직접 예외 발생
  • 11.
    일반적 예외 처리2- 예외처리 회피 예외처리를 자신이 담당하지 않고 자신을 호 출한 쪽으로 던져버리는 것 예외를 자신이 처리하지 않고 회피하는 방법 예외처리를 회피하려면 반드시 다른 오브젝트 나 메서드가 예외를 대신 처리할 수 있도록 던져줘야 한다. public void add() throws SQLException { ... // 구현 로직 }
  • 12.
    일반적 예외처리3 -예외전환 예외를 메서드 밖으로 던지는것 예외회피와는 달리 적절한 예외로 전환해서 던지는 특징 의미가 불분명한 예외의 의미를 분명하게 해 줄 수 있는 예외로 전환하기 위해 예외를 처리하기 쉽고 단순하게 만들기 위해 포장하는 것 try { ...blar blar… } catch(Exception e) { throw DuplicateUserIdException(e); }
  • 13.
    자바에서 예외 처리시 가이드 기본적으로 자바에서 사용할 수 있는 예외처리 내용을 몇가지 단계로 나눠서 설 명
  • 14.
    1)예외를 잡았으면 처리하자 예외를잡아서 그냥 콘솔로 출력하면 되는 경우는 거 의 없다. 컴파일 된다고 코딩이 끝난 것이 아니다. 어떻게 처리할지 모른다면 잡지 말자 처리하고 예외상황 종료 로그를 남겨야한다. 다시 던진다. 로그를 위해 메세지를 보고 다시 던진다. 다시 던질때는 메세지를 바꾸 지 않는다. 새 예외로 던진다. 무시한다. 내가 무엇을 더 해볼 수 없을 경우 Anticode try { blar… } catch(Exception e) { e.printStackTrace(); }
  • 15.
    2) 예외를 처리했으면로그를 남겨라 로그도 없고 처리도 안한것 은 최악이다. 차라리 안잡 는것이 낳다 뭔가 잘못됐다고 리포팅은 되지만 재현할 방법이 없 다 처리는 했는데 로그가 없는 것은 아주 나쁘다. 예외가 발생한 상황을 알수 가 없다. 시스템 개선이 힘들다. 처리도하고 로그도 있을 때 있으나 마나한 로그들은 정 말 있으나 마나한것이다. 로그는 충분한 상황을 알려 주어야하고 자세히 알려 주는것이 좋다. Anticode } catch(Exception e) { // do nothing - 있으나마나 }
  • 16.
    3) 기존 예외의정보 누락 금지 절대 잡은 예외의 정보를 누락하지 말자. 반드시 cause로 설정하자 자세하고 친절한 설명까지는 아니더라도 최소 한 잡은 예외의 정보를 누락하지는 말자 Anticode } catch(Exception e) { throw new OtherException(“blar”); }
  • 17.
    4) 예외를 던질때의 가이드 메세지 충실히 잡을 곳을 기준으로 예외 객체 선택 메세지를 파싱하게 하지 말자 추상 예외로 던지지 말자
  • 18.
    그외 가이드 더 많은예외 처리에 대한 얘기를 하고 싶으나 마지막에 시간이 남으면 얘기를 진행 해 보겟음
  • 19.
    스프링에서 예외 처리 교재로사용중인 토비의 스프링에서 예외 처리 부분은 DB 처리 부분으로 되어 있 어서 그냥 일반적인 컨트롤러나 서비스 단에서 처리가 어떻게 되는지 설명해 보겠음
  • 20.
    컨트롤러 기반의 예외처리 ExceptionHandler사용하 기 @ResponseStatus 어노테 이션 없이 예외를 처리 한다. 사용자를 특정 에러페이지 로 리다이렉트한다. 커스텀 에러 응답을 만든다. @Controller public class ExceptionHandlingController { // @RequestHandler methods ... // Exception handling methods // Convert a predefined exception to an HTTP Status code @ResponseStatus(value=HttpStatus.CONFLICT, reason="Data integrity violation") // 409 @ExceptionHandler(DataIntegrityViolationException.class) public void conflict() { // Nothing to do } // Specify name of a specific view that will be used to display the error: @ExceptionHandler({SQLException.class,DataAccessException.class}) public String databaseError() { // Nothing to do. Returns the logical view name of an error page, passed // to the view-resolver(s) in usual way. // Note that the exception is NOT available to this view (it is not added // to the model) but see "Extending ExceptionHandlerExceptionResolver"
  • 21.
    예외와 뷰 예외를 뷰에서보여줄때 사용자들은 예외 메세 지나 stacktrace가 들 어가 페이지를 보고 싶어하진 않는다. 페이지 소스 안에 보이지 않는것처럼 예외사항 을 넣어놓을 수 있다. <h1>Error Page</h1> <p>Application has encountered an error. Please contact support on ...</p> <!-- Failed URL: ${url} Exception: ${exception.message} <c:forEach items="${exception.stackTrace}" var="ste"> ${ste} </c:forEach> -->
  • 22.
    예외 처리의 끝 예외처리는 정말 내용이 너무 많아서 다 쓰자니 끝나지 않을것 같아서 이정도에 서 마무리 예외가 잡히는 상황별로 잡아서 처리만 제대로 한다면 더 나은 시스템으로 개선 이 가능할것 같다.
  • 23.
    마치며 준비를 하며 여기에다 표현하지 못한 내용이 많이 있습니다. 제가 게을러서 그런것이겠지요..ㅠㅠ 무엇을 표현을 못했는지 궁굼하시면 물어봐 주세요.ㅎㅎ
  • 24.