inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

JDBC 개발 - 등록

try-with-resources 구문 사용 관련 질문드립니다.

해결된 질문

179

문예찬

작성한 질문수 17

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
해당 강의에서는 save(Member member)를 작성하면서 try-catch구문을 썼는데 아래처럼 try-with-resources구문을 사용하면 생길 수 있는 문제가 있어서 try-catch구문을 쓰는건가요?

try (Connection con = getConnection();
            PreparedStatement pstmt = con.prepareStatement(sql)) {

            pstmt.setString(1, member.getMemberId());
            pstmt.setInt(2, member.getMoney());
            pstmt.executeUpdate();
            return member;
        } catch (SQLException e) {
            log.error("db error", e);
            throw e;
        }

제가 혼자 생각해봤었을 때의 이때의 생길 수 있는 문제점은 try(...)안의 자원들의 close()가 호출될 때가 아닌 생성될 때의 오류가 생기면 그걸 catch로 잡거나 그러지 못할수도 있다는 것이었습니다.

실제로 h2데이터베이스를 끄고 실행해봤었을 때,

Connection con = getConnection(); 부분에서 예외가 발생했고, catch로 잡지 못하는 모습이었습니다.

 

이처럼 자원 생성에서부터 예외가 발생할 때 try-with-resources를 사용하는 것은 적절치 않다고 생각하면 되는걸까요?

spring mvc spring-jdbc

답변 2

1

David

안녕하세요. 문예찬님, 공식 서포터즈 David입니다.

어떤 예외가 발생하였는지 자세한 예외 정보도 함께 남겨주실 수 있으실까요?

감사합니다.

0

문예찬

AI 답변 후 다시 확인해보니 문제가 없었습니다.

제가 일부러 h2데이터베이스를 꺼서 connectio을 얻는 과정에서 예외를 발생시킨것이었는데, 강의에서 작성한 DBConnectionUtil.getConnection()을 호출할 때 SQLExeption을 catch를 해서 IllegalStateException으로 바꿔서 던지는 부분때문에 문제가 생긴거였습니다.

질문에서의 try-with-resources 구문에서 catch부분이 SQLException만 잡기때문에 IllegalStateException을 잡지못했습니다.

확인 차 DBConnectionUtil.getConnection()에서IllegatStateException으로 바꾸지 않고 SQLException으로 그대로 던지도록 하면 try-with-resources 에서 connection 생성 시 예외를 잘 잡는것을 확인할 수 있었습니다.

 

신경써주셔서 감사합니다.

0

인프런 AI 인턴

안녕하세요, 문예찬님, 인프런 AI 인턴입니다.

질문하신 내용에 대해 설명드리겠습니다.

try-with-resources 구문은 자원이 필요 이상으로 열린 상태로 남지 않게 관리하는 데 유용한 도구입니다. 이 구문의 주요 특징은 자원(예: Connection, PreparedStatement)이 자동으로 닫힌다는 점입니다. 기본적으로 try-with-resources 구문은 자원의 close() 호출을 보장하여 예외가 발생하더라도 안전하게 자원을 해제합니다.

질문하신 try-with-resources 구문에서 자원 생성 시 예외가 발생할 경우, 이러한 예외는 여전히 catch 블록에서 잡을 수 있습니다. 다만, 자원 생성 자체가 try 블록 내에서 이루어지기 때문에, 해당 자원이 열린 상태가 아니므로 close()의 필요성은 없습니다.

예를 들어:

try (Connection con = getConnection();
     PreparedStatement pstmt = con.prepareStatement(sql)) {
    // 코드 블록 내 로직
} catch (SQLException e) {
    // 예외 처리 로직
}
  • Connection 생성 (getConnection() 호출 시)에서 예외가 발생하면, SQLExceptioncatch 블록으로 전달되어 처리됩니다. 예외가 발생한 시점에서 자원은 아직 열리지 않았으므로, close()에 대한 문제는 없습니다.

하지만 질문 내용에 따르면 예외 발생 시 확인되는 현상에서 catch 블록으로 예외가 전달되지 않는 부분을 언급하신 것 같습니다. 만약 catch 블록에서 예외를 잡지 못한다면, 예외의 타입이 잘못되었거나 로직 상 문제일 수 있으니 확인이 필요합니다.

추가적으로, 자원할당 자체의 실패로 인해 예외가 명시적으로 바깥 영역으로 던져진다면 그 예외를 적절히 처리하는 예외 처리 구조가 추가로 필요할 수 있습니다. 그러한 경우 별도의 예외 처리가 고려되어야 할 수 있겠습니다.

비슷한 사례로 참고할 수 있는 게시물:
1. MemberRepositoryV0를 try-with-resources를 사용해 refactoring 해봤습니다.. - try-with-resources를 사용하여 JDBC 코드를 리팩토링한 사례입니다. 코드 리팩토링 시 발생할 수 있는 문제점과 이를 해결하는 방법에 대한 토론이 포함되어 있습니다.

문제가 지속된다면 예외의 종류나 catch 블록의 처리 방식을 조정하여 문제를 해결해 보실 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

0

31

2

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

0

51

1

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

0

82

1

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

0

68

2

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

0

88

1

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

0

82

2

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

0

58

2

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

0

68

2

after 메서드 사용 유무

0

57

2

데이터베이스 접근 및 DB 락

0

54

1

@SpingBootTest, @TestConfiguration

0

56

1

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

0

48

1

AopCheck Test 부분의 EnhancerBySpring 확인 법??

0

66

2

커리큘럼 관련 질문

0

76

1

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

0

87

1

validation(toMember)의 위치

0

83

2

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

0

165

2

member 상수 질문

0

120

2

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

0

153

2

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

0

109

1

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

0

116

1

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

0

100

1

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

0

98

1

강의 14분쯤 Exception 질문

0

115

2