DataSourceUtils.releaseConnection 할때요 SQLException e 사용하는 이유등
3
작성한 질문수 1
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
db연결을 close하는 부분에서 conn은 DataSourceUtils에서 왔기 때문에 releaseConnection을 통해서 커넥션을 끊어줘야 트랜잭션 도중 닫히는 문제를 막을 수 있다고 하셨는데요. 근데 그 close하는 함수 부분에서 throws SQLException을 던지셨던데요. utils함수의 releaseconnection함수를 보면 exception 던지지 않고 로그만 직던데요. throws 던질 이유가 있을까요? 저게 없으면 catch에서 에러가 표시되던데 무엇이 올바른지 모르겠습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 백수님,
DataSourceUtils.releaseConnection(conn, dataSource) 메서드는 내부적으로 SQLException을 직접 던지는 메서드가 아니므로, 해당 메서드만 호출하는 close() 메서드라면 throws SQLException을 선언할 필요가 없습니다.
예를 들어 다음과 같이 작성할 수 있습니다.
private void close(Connection conn) {
DataSourceUtils.releaseConnection(conn, dataSource);
}
releaseConnection()은 트랜잭션에 의해 관리되는 커넥션인지 확인한 후, 외부에서 관리되지 않는 커넥션만 닫거나 커넥션 풀에 반환합니다. 따라서 일반적인 conn.close()를 직접 호출하는 것보다 Spring의 트랜잭션 관리 방식에 적합합니다.
private void close(Connection conn) throws SQLException {
DataSourceUtils.releaseConnection(conn, dataSource);
}
위 코드처럼 throws SQLException을 붙이는 것이 컴파일상 문제는 없지만, 실제로 해당 메서드 내부에서 체크 예외인 SQLException이 발생하지 않는다면 불필요한 선언입니다.
또한 try 블록 안에서 releaseConnection()만 호출하고 있는데 다음과 같이 catch (SQLException e)를 작성하면, 잡을 수 있는 SQLException이 없다는 컴파일 오류가 발생할 수 있습니다.
try {
DataSourceUtils.releaseConnection(conn, dataSource);
} catch (SQLException e) {
// 불필요한 catch
}
이 경우에는 throws SQLException과 catch (SQLException e)를 제거하는 것이 올바릅니다. 다만 conn.createStatement(), preparedStatement.executeQuery() 등 실제로 SQLException을 발생시킬 수 있는 JDBC 메서드를 함께 호출한다면, 해당 예외를 throws로 전달하거나 catch에서 처리해야 합니다.
관련해서 DataSourceUtils.releaseConnection()이 트랜잭션 동기화 여부에 따라 커넥션을 처리하는 방식은 다음 질문의 답변을 참고해 주세요.
connection 객체 close
커넥션 풀에서 close()를 호출했을 때 실제 연결을 끊는 것이 아니라 커넥션 풀에 반환하는 동작에 대해서는 다음 질문도 참고할 수 있습니다.
JdbcUtils.closeConnection 질문입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
수업자료 오타
0
5
1
HelloSpringApplication.java 클래스 실행 오류
0
52
1
스프링 빈 등록 방법 2가지 다 알아야하는 이유
0
72
1
스프링 부트 버전 질문
0
167
2
인텔리제이 오류
0
138
1
..
0
180
2
Unused property.....
0
181
2
project JDK is misconfigured
0
254
2
외부 API의 ID 타입(String/UUID)과 내부 도메인의 ID 타입(Long)이 불일치할 때의 설계 정석
0
138
2
단위/통합 테스트 버전충돌 문제
0
151
2
❗️springboot 4.0.2 버전 aspectj dependency 설정❗️
0
318
1
왜 컨트롤러는 변한게 없는데 새로 만든 html 파일이 뜨나요?
0
165
2
윈도우 build test오류 질문
1
188
2
테스트 관련 공부에 대한 조언을 얻고 싶습니다
0
164
2
테스트 실행 시 에러 질문
0
423
1
name을 통한 비교와 객체를 통한 비교
0
115
1
빌드 후 libs 없음
1
204
1
윈도우 gradlew.bat 에러
0
252
1
@PostMapping("/members/new")가 동작하지 않습니다
0
128
1
java static class와 kotlin class
0
127
1
스프링 DB연결
0
190
1
소요 시간
0
126
2
ddl.sql에 빨간 밑줄
1
154
2
welcome page 에러
0
262
3





