주제
- check Exception unChecked Exception 차이
목차
- 예외 구분
- 예외 처리하는 방법
- 예외 복구
- 예약 회피
- 예외 전환
- 멘토님 말씀
내용
check Exception unchecked Exception 차이 -
- checkedException의 문제점, 극복 방법
예외 구분( checked, unchecked)

📌
RuntimeException을 상속
유무에 따른 구분 !- R.E 상속하지 않는 클래스는 Checked Exception, 반대로 상속한 클래스는 UnChecked Exception이다.
정의
- Unchecked
- 명시적인 예외 처리를 강제하지 않기에 Uncheked라 불리운다.
- 명시적인 예외처리는 try~catch , throw로 호출한 메소드에서 예외를 던지지 않는 행위
- Checked
- 에외 처리 강제함으로서 Checked 라 불리운다.
- try~catch
반드시 잡거나
, throw로 호출한 메소드에서예외를 반드시 던져야
한다.
예외를 처리하는 방법
1. 예외 복구
- 예외 상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 방법
- 예외를 잡아서 일정 시간, 조건 만큼 대기후 다시 재시도 (retry 전략)
- 최대 재시도 횟수를 넘기게 되는 경우 예외를 발생시킨다.
- 대부분의 상황에서 예외를 복구할 수 있는 경우는 거의 없기 때문에 자주 사용되지는 않는다.
- 유니크 해야하는 이메일이 중복되어 sql 오류가 발생할 때 복구할 방법이 없다. 이런 경우 runtimeException을 발생시켜 재입력을 유도하는 것이 현실적.
이럴 경우 코드의 흐름으로 제어하는 것이 좋다.
final int MAX_RETRY = 100; public Object someMethod() { int maxRetry = MAX_RETRY; while(maxRetry > 0) { // -> retry ! try { ... } catch(SomeException e) { // 로그 출력. 정해진 시간만큼 대기한다. } finally { // 리소스 반납 및 정리 작업 } } // 최대 재시도 횟수를 넘기면 직접 예외를 발생시킨다. throw new RetryFailedException(); }
// ## 변경 전 public sendFile(String fileName)() { File file; try { file = FileFindService.find(fileName); } catch (FileNotFoundException e){ // 기본 파일을 찾아서 전송한다. file = FileFindService.find("default.png"); } send(file); } } // ## 변경 후 (예외 복구 방식) public void sendFile(String fileName){ if(FileFindService.existed(filename)){ // 파일이 있는 경우 해당 파일을 찾아서 전송한다. send(FileFindService.find(fileName)); }else{ // 파일이 없는 경우 기본 이미지를 전송한다. send(FileFindService.find("default.png"));
2. 예외 회피
- 예외 처리를 직접 담당하지 않고 호출한 쪽(caller) 쪽으로 던진다.
- 해당 방법은 긴밀하게 역할을 분담하고 있는것이 아니라면 예외를 그냥 던지는 것 자체가 무책임하다. → 멘토님 : 예외는정
// 예시 1 public void add() throws IoException{ // ...생략 } // 예시 2 public void add() throws SQLException { try { // ... 생략 } catch(SQLException e) { // 로그를 출력하고 다시 날린다! throw e; } }
3. 예외 전환
- 에외 회피와 유사하게 메서드 밖으로 던지지만, 그냥 던지지 않고 적절한 예외로 전환해서 넘기는 방법
- 조금 더 명확한 의미로 전달되기 위해 적합한 의미를 가진 예외로 변경.
- 예외처리를 단순하게 만들기 위해 포장 할 수 있다.
public Domain insert(Domain domain){ int insert= jdbcTemplate.update( "insert into ..... ", toParams(domain) ); if(insert!=1){ new NotExecuteQuery("domain의 insert 쿼리가 정상적으로 처리되지 않았습니다. "); } }
🌕 다시 한번 정리

- RuntimeException을 상속하지 않고 꼭 처리해야 하는 Checked Exception 과 반대로 명시적으로 처리하지 않아도 되는 Uncheked Exception로 구분할 수 있다.
추가 키워드 @Transactional
- Unchecked Exception은 Rollback 됩니다.
- 결국 Exception을 Checked 또는 Unchecked를 구분하여 로직의 Rollback 여부를 판단하여, 구현할 수 있습니다.
- 스프링은 기본적으로 Checked 또는 Unchecked를 구분하여 Rollback을 구분하지만, rollback 시킬 Exception을 지정할 수 있습니다.
- 롤백 옵션
// Exception예외로 롤백을 하려면 다음과 같이 지정하면됩니다. @Transactional(rollbackFor = Exception.class) // 여러개의 예외를 지정할 수도 있습니다. @Transactional(rollbackFro = {RuntimeException.class, Exception.class})
- 특정 에외 롤백 되지 않도록 지정
@Transactional(noRollbackFor={IgnoreRollbackException.class})
🍗 치킨 사주신 멘토님 말씀
- 스프링에서 트잭 전략이 기본적랸으로 checked일 뿐 unChecked로 트잭을 가져도 된다 라고 표현이 덜 헷갈린다.
- default 다~
- 우린 default 사용안한다.
- checked , unChecked
여러분들이 예외를 만들때 주로 어떤종류로 예외를 만드는지
요즘은 어떤 예외를 자주 발생시키는지 이런것도 말하면 좋을듯하네요 트랜드?