inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 DB 1편 - 데이터 접근 핵심 원리

체크 예외와 인터페이스

throws 질문

334

강성욱

작성한 질문수 49

0

안녕하세요. throws 관련해서 질문드릴 게 있습니다. 영한샘 강의자료에

-> 예를 들어서, `Exception`을 `throws`으로 던지면 그 하위 예외들도 모두 던질 수 있다.

이런 문장이 있는데, 그냥 그렇구나 하고 넘어갔는데 테스트를 해보니, 잘 이해가 안 돼서요... throws Exception을 하면 모든 SQLException, IOException 같은 모든 자식 CheckedException을 던진다는 의미인가요?

try {
throw new Exception("Super Exception");
} catch (SQLException e) {
log.error("message={}", e.getMessage(), e);
} catch (Exception e) {
log.error("message={}", e.getMessage(), e);
}

 

그럼 위 코드에서는 SQLException으로 Exception을 받는 catch문에도 걸려야 하는 거 아닌가요?, SQLException은 건너뛰고 바로 Exception으로 가서 이해가 잘 안 됩니다...

 

 

 

spring

답변 1

5

나무늘보

안녕하세요, 강성욱 님! 공식 서포터즈 codesweaver 입니다.

다형성과 관련한 질문인데요,
Exception 과 SQLException 두 가지만 비교해보겠습니다.

 

Exception과 SQLException은 계층 구조를 갖습니다. Exception이 상위에, SQLException이 아래에 위치하는데요.이런 관계일 때 SQLException은 Exception 인가? 라는 질문에 대한 답은 참입니다,  그러나 Exception은 (모두) SQLException인가? 라는 질문에 대한 답은 거짓입니다.

 

다른 예를 들면 '만화가'와 '이말년'을 생각하겠습니다. 이 두 객체중 누가 상위일까요? '만화가'가 위에 '이말년' 작가가 아래에 위치합니다. 누가 위에 위치하는가는 '추상화' 와 관련있습니다. 추상적인 개념일수록 상위에 위치합니다. 그럼 두 객체의 관계는 다음과 같습니다. 이말년 작가는 '만화가'인가? 는 참이지만, 만화가면 (모두) 이말년 작가인가? 는 거짓입니다.

 

다시 SQLException 과 Exception 으로 돌아오면, 즉, SQLException은 Exception이라 할 수 있습니다. 이를 OOP에서는 다형성이라고 하는데, 예외 처리에도 이 다형성 개념을 적용합니다.

 

작성하신 코드를 보면 우선 Exception을 throw 합니다.

예외 처리 코드(catch문들)를 보면 (1)SQLException인지 먼저 확인하고, (2)그렇지 않으면 Exception인지 확인하고 있습니다.

try {
throw new Exception("Super Exception");
} catch (SQLException e) { ... (1)
log.error("message={}", e.getMessage(), e);
} catch (Exception e) { ... (2)
log.error("message={}", e.getMessage(), e);
}

 

앞서 살펴 보았듯 SQLException은 Exception이지만, Exception은 SQLException이 아닙니다.

그래서 (1) 코드를 무시하고 (2)로 넘어갑니다. 그리고 (2)의 코드를 실행합니다.

만약 throw 하는 예외가 SQLException이라면 (1)의 코드를 실행하겠지요.

 

감사합니다.

0

강성욱

답변해주셔서 감사합니다. 제가 생각을 잘못 했네요ㅠㅠ
전 throw new Exception() 인지 알았는데, throws는 메서드 옆에 붙이는 예외 시그니처인데, throws랑  throw랑 헷갈렸습니다. 다시 한 번 보니 이해가 됩니다 ㅠㅠ
답변해주셔서 감사합니다!!

트랙잭션 격리수준 선택에 대해서 질문

0

25

1

spring initialiser 어떤걸 선택해야될지 모르겠어요

0

61

2

트랜잭션 템플릿이 체크예외는 커밋하는 이유가 궁금합니다.

0

73

1

jdbc 학습하다 궁금해서 질문드려요

0

104

1

정상이체와 이체중 예외발생 차이

0

86

2

이번 강의부터가 JDBC 직접 사용 맞나요?

0

103

1

순수한 서비스 계층에 대한 의문???

0

94

2

3_4test, 4test 자동 리소스 안됨

0

66

2

데이터베이스 선택 관련 질문.

0

77

2

after 메서드 사용 유무

0

67

2

데이터베이스 접근 및 DB 락

0

65

1

@SpingBootTest, @TestConfiguration

0

68

1

Read Committed 격리 수준 사용 관련 질문

0

62

1

AopCheck Test 부분의 EnhancerBySpring 확인 법??

0

74

2

커리큘럼 관련 질문

0

85

1

서비서 계층 스프링 프레임워크 사용

0

100

1

validation(toMember)의 위치

0

91

2

데이터 계층에서 서비스 로직의 datasource를 인식하는 방법

0

178

2

member 상수 질문

0

140

2

ctrl + F6 이후로 con 인식이 안 됩니다

0

171

2

DrivenManager 와 Connection 반환에 대한 질문입니다!

0

121

1

섹션5 트랜잭션 템플릿관련 질문(이기종 DB)

0

127

1

세션1 테이블 조회결과 그림은 Redo 로그에 속하나요?

0

107

1

트랜잭션이 필요하지 않은 경우 DB 대신 파일 시스템을 사용하는 것이 더 효율적인가?

0

105

1