SlideShare a Scribd company logo
1 of 24
예외 처리
영희와 예외 철이 그 심오
함에 대한 고찰
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!

More Related Content

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

포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전주항 박
 
More effective c++ chapter3 4
More effective c++ chapter3 4More effective c++ chapter3 4
More effective c++ chapter3 4Dong Chan Shin
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptInjae Lee
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
The art of readable code ch4 ch8
The art of readable code ch4   ch8The art of readable code ch4   ch8
The art of readable code ch4 ch8Ki Sung Bae
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다wonmin lee
 
Implementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4UImplementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4Usys4u
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Nam Hyeonuk
 
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드도형 임
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디quxn6
 
Memory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4UMemory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4Usys4u
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509영석 조
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법성훈 김
 
05. 아키텍트가 알아야할 12 97가지
05. 아키텍트가 알아야할 12 97가지05. 아키텍트가 알아야할 12 97가지
05. 아키텍트가 알아야할 12 97가지YoungSu Son
 
Holub on-patterns-2-1
Holub on-patterns-2-1Holub on-patterns-2-1
Holub on-patterns-2-1정환 임
 
HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1정환 임
 

Similar to [스프링 스터디 1일차] 예외 처리 (20)

포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전
 
More effective c++ chapter3 4
More effective c++ chapter3 4More effective c++ chapter3 4
More effective c++ chapter3 4
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4ppt
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
The art of readable code ch4 ch8
The art of readable code ch4   ch8The art of readable code ch4   ch8
The art of readable code ch4 ch8
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다
 
react-ko.pdf
react-ko.pdfreact-ko.pdf
react-ko.pdf
 
Implementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4UImplementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4U
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디
 
MEC++ 3,4
MEC++ 3,4MEC++ 3,4
MEC++ 3,4
 
Memory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4UMemory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4U
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법
 
05. 아키텍트가 알아야할 12 97가지
05. 아키텍트가 알아야할 12 97가지05. 아키텍트가 알아야할 12 97가지
05. 아키텍트가 알아야할 12 97가지
 
Holub on-patterns-2-1
Holub on-patterns-2-1Holub on-patterns-2-1
Holub on-patterns-2-1
 
HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1
 

More from AnselmKim

[스프링 스터디 2일차] 스프링 핵심 기술의 응용
[스프링 스터디 2일차] 스프링 핵심 기술의 응용[스프링 스터디 2일차] 스프링 핵심 기술의 응용
[스프링 스터디 2일차] 스프링 핵심 기술의 응용AnselmKim
 
[스프링 스터디 2일차] AOP
[스프링 스터디 2일차] AOP[스프링 스터디 2일차] AOP
[스프링 스터디 2일차] AOPAnselmKim
 
[스프링 스터디 3일차] AOP와 LTW
[스프링 스터디 3일차] AOP와 LTW[스프링 스터디 3일차] AOP와 LTW
[스프링 스터디 3일차] AOP와 LTWAnselmKim
 
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVCAnselmKim
 
[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술AnselmKim
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVCAnselmKim
 
[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DIAnselmKim
 
[스프링 스터디 1일차] Test
[스프링 스터디 1일차] Test[스프링 스터디 1일차] Test
[스프링 스터디 1일차] TestAnselmKim
 
[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화AnselmKim
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿AnselmKim
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계AnselmKim
 

More from AnselmKim (11)

[스프링 스터디 2일차] 스프링 핵심 기술의 응용
[스프링 스터디 2일차] 스프링 핵심 기술의 응용[스프링 스터디 2일차] 스프링 핵심 기술의 응용
[스프링 스터디 2일차] 스프링 핵심 기술의 응용
 
[스프링 스터디 2일차] AOP
[스프링 스터디 2일차] AOP[스프링 스터디 2일차] AOP
[스프링 스터디 2일차] AOP
 
[스프링 스터디 3일차] AOP와 LTW
[스프링 스터디 3일차] AOP와 LTW[스프링 스터디 3일차] AOP와 LTW
[스프링 스터디 3일차] AOP와 LTW
 
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC
 
[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC
 
[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI
 
[스프링 스터디 1일차] Test
[스프링 스터디 1일차] Test[스프링 스터디 1일차] Test
[스프링 스터디 1일차] Test
 
[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계
 

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

  • 1. 예외 처리 영희와 예외 철이 그 심오 함에 대한 고찰
  • 2. Agenda 개요 예외? 예외! 예외 처리 난감하네 예외 처리의 시작 예외 처리의 끝 스프링에서 예외 처리 마치며
  • 3. 개요 어떤 애플리케이션이든 오류가 발생하고, 오류를 완벽하게 예방하기는 불가능 개발자가 가장 신경 쓰기 귀찮아 하는것이 예외 처리 예외를 잘 사용한다면 프로그램의 가독성과 신뢰도 및 유지 보수성을 향상 시킬 수 있다. 대신 잘못사용한다면 이와는 반대의 효과를 낼 수 있다. 예외를 잡았으면 처리하고 처리했으면 기록을 남겨라
  • 4. 예외? 예외! 프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우 이러한 결과를 초래하는 원인을 에러 또는 오류라고한다. 자바에서는 실행(Runtime) 시 발생할 수 있는 오류를 에러와 예외, 두가지로 구 분 에러(Error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
  • 5. 예외?예외! 자바에서는 실행 시 발생할 수 있는 오류(Exception과 Error)를 클래스로 정의 [오류 클래스 계층도]
  • 6. 예외?예외! 1) checked Exception 2) unchecked Exception
  • 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. 마치며 준비를 하며 여기에 다 표현하지 못한 내용이 많이 있습니다. 제가 게을러서 그런것이겠지요..ㅠㅠ 무엇을 표현을 못했는지 궁굼하시면 물어봐 주세요.ㅎㅎ