해결된 질문
작성
·
91
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를 사용하는 것은 적절치 않다고 생각하면 되는걸까요?
답변 2
0
안녕하세요, 문예찬님, 인프런 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()
호출 시)에서 예외가 발생하면, SQLException
이 catch
블록으로 전달되어 처리됩니다. 예외가 발생한 시점에서 자원은 아직 열리지 않았으므로, close()
에 대한 문제는 없습니다.하지만 질문 내용에 따르면 예외 발생 시 확인되는 현상에서 catch
블록으로 예외가 전달되지 않는 부분을 언급하신 것 같습니다. 만약 catch
블록에서 예외를 잡지 못한다면, 예외의 타입이 잘못되었거나 로직 상 문제일 수 있으니 확인이 필요합니다.
추가적으로, 자원할당 자체의 실패로 인해 예외가 명시적으로 바깥 영역으로 던져진다면 그 예외를 적절히 처리하는 예외 처리 구조가 추가로 필요할 수 있습니다. 그러한 경우 별도의 예외 처리가 고려되어야 할 수 있겠습니다.
비슷한 사례로 참고할 수 있는 게시물:
1. MemberRepositoryV0를 try-with-resources를 사용해 refactoring 해봤습니다.. - try-with-resources를 사용하여 JDBC 코드를 리팩토링한 사례입니다. 코드 리팩토링 시 발생할 수 있는 문제점과 이를 해결하는 방법에 대한 토론이 포함되어 있습니다.
문제가 지속된다면 예외의 종류나 catch 블록의 처리 방식을 조정하여 문제를 해결해 보실 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
AI 답변 후 다시 확인해보니 문제가 없었습니다.
제가 일부러 h2데이터베이스를 꺼서 connectio을 얻는 과정에서 예외를 발생시킨것이었는데, 강의에서 작성한 DBConnectionUtil.getConnection()을 호출할 때 SQLExeption을 catch를 해서 IllegalStateException으로 바꿔서 던지는 부분때문에 문제가 생긴거였습니다.
질문에서의 try-with-resources 구문에서 catch부분이 SQLException만 잡기때문에 IllegalStateException을 잡지못했습니다.
확인 차 DBConnectionUtil.getConnection()에서IllegatStateException으로 바꾸지 않고 SQLException으로 그대로 던지도록 하면 try-with-resources 에서 connection 생성 시 예외를 잘 잡는것을 확인할 수 있었습니다.
신경써주셔서 감사합니다.