강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

황규철님의 프로필 이미지
황규철

작성한 질문수

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

스프링 예외 추상화 이해

DataAccessException 타입으로 던졌는데, BadSqlGrammarException으로 잡을 수 있는 이유가 궁금합니다.

작성

·

912

2

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
Java 기본 문법을 여쭤보는 것 같지만 궁금합니다ㅜㅜ.

어떻게 부모타입(DataAccessException)으로 throw했는데 자식타입(BadSqlGrammarException)으로 catch할 수 있는 건가요?

1.png이렇게 테스트를 해보았는데, 잡히더라구요. 그래서 catch문에서 자동으로 upcasting이 되는건가 싶어서 RuntimeException이 아닌 Checked Exception으로도 진행을 해보았습니다.

2.png하지만 컴파일 에러가 발생하더라구요ㅜㅜ.

RuntimeException만 upcasting을 해주는 건지, 아니라면 어떻게 자식타입으로 catch할 수 있는건지 궁금합니다!

 

답변 3

2

우선 업케스팅은 둘다 자동으로 되는거 같고

컴파일 에러 관련해서 저도 궁금해서 여러 군데 찾아봤지만 정확한 답인지는 모르겠지만 chatGPT에게 물어봤을때, 런타임예외가 아닌 Exception을 던졌을때, 명시적으로 잡아주지 않으면 컴파일 에러가 나타난다고 하네요.

아마 컴파일 에러가 아니라면 로직상 SQLException도 잡아주지 않았을까 싶습니다.
참고로 Java 언어의 예외 처리 관련 공식 문서와 Java 11 버전에서의 예외 처리 규칙을 기반으로 작성되었다고 합니다.

정확한 답변 아시는 분 댓글 부탁드립니다 ㅜㅜ

ex() 메서드에서 throws Exception으로 명시해준 것이 문제 원인입니다. Exception은 자바 애플리케이션에서 발생할 수 있는 모든 예외의 부모입니다. 즉, 체크 예외도 던져질 수 있음을 의미합니다.

따라서 ex()를 호출하는 곳에서는 체크 예외에 대한 처리도 해줘야 되는데, 현재 그렇지 않으니 컴파일 에러가 발생합니다(체크 예외에 대한 처리는 컴파일러가 체크).

다음 세 경우에는 문제가 발생하지 않습니다.

  • call_ex()에서 catch (Exception e) { ... }를 추가

  • ex()에서 throws IllegalArgumentException으로 명시

  • ex()에서 throws를 명시하지 않음

관련해서 블로그 포스팅을 작성해두었으니, 관심있으시면 확인해보세요!

https://hyoyoonnam.github.io/posts/throw-runtime-exception-with-throws-Exception/

어떻게 부모타입(DataAccessException)으로 throw했는데 자식타입(BadSqlGrammarException)으로 catch할 수 있는 건가요?

-> 결국 스프링에서 추상화 한 예외는 모두 RuntimeException을 상속받기 때문에 잡아서 처리하는 것이 강제되지 않습니다. DataAccessException의 자식인 BadSqlGrammarException에 대한 catch만 처리하더라도, 잡지 못하는 나머지 자식들에 대해서는 런타임에 자동으로 밖으로 던져주기 때문에 컴파일 에러가 발생하지 않습니다. 런타임 예외는 애초에 컴파일러가 체크하는 대상이 아닙니다.

1

혹시 문제 해결하셨나요?? 저도 궁금해서 그런데 해결하셨다면 공유해주세요!!

0

안녕하세요, 황규철 님. 공식 서포터즈 codesweaver 입니다.

말씀하신 것처럼 예외는 부모 객체(상위 객체)로는 잡을 수 있으나 하위 객체로는 잡을 수 없습니다.

제가 로컬에서 테스트를 진행해보니 DataAccessException 은 BadSqlGrammarException 로 잡을 수 없습니다. 혹시 강의 중 어느 부분에 대한 질문인지 시간을 남겨주시면 다시 확인하도록 하겠습니다.

감사합니다.

황규철님의 프로필 이미지
황규철

작성한 질문수

질문하기