JDBC 연결 종료는 finally 블록에서
JDBC를 사용해 MySQL에 접속할 때, Connection 객체는 반드시 finally 블록 안에서 닫아야(close) 합니다.
그 이유는 간단합니다. try 블록 안에서 예외가 발생하면 그 이후의 코드는 실행되지 않기 때문입니다. 만약 연결 종료 코드가 try 블록 내부에 있다면, 예외 발생 시 연결이 끊기지 않은 채 방치되어 리소스 누수(resource leak)와 커넥션 고갈 문제로 이어질 수 있습니다.
finally 블록은 예외 발생 여부와 관계없이 항상 실행되므로, 어떤 상황에서도 연결을 확실하게 해제할 수 있습니다.
finally 블록에서 연결을 닫는 예제 코드
다음은 JDBC와 MySQL 환경에서 finally 블록으로 연결을 종료하는 Java 코드입니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class CloseConnectionDemoInFinallyBlock {
public static void main(String[] args) {
String JDBCURL = "jdbc:mysql://localhost:3306/web?useSSL=false";
Connection con = null;
try {
con = DriverManager.getConnection(JDBCURL, "root", "123456");
System.out.println("connection is open");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
con.close();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
}
}
}실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
connection is open
더 나은 방법: try-with-resources 활용하기
Java 7부터는 try-with-resources 문법을 사용하는 것이 권장됩니다. Connection은 AutoCloseable 인터페이스를 구현하고 있으므로, try-with-resources를 사용하면 블록이 종료될 때 자동으로 연결이 닫힙니다.
String JDBCURL = "jdbc:mysql://localhost:3306/web?useSSL=false";
try (Connection con = DriverManager.getConnection(JDBCURL, "root", "123456")) {
System.out.println("connection is open");
} catch (SQLException e) {
e.printStackTrace();
}이 방식은 finally 블록을 직접 작성하지 않아도 되고, 코드가 훨씬 간결해지며 실수로 연결을 닫지 않는 상황 자체를 원천적으로 방지할 수 있다는 장점이 있습니다.
정리
- 전통적인 방식에서는 finally 블록에서 Connection을 닫아야 예외 발생 시에도 리소스 누수를 막을 수 있습니다.
- Java 7 이상이라면 try-with-resources를 사용해 자동으로 연결을 해제하는 것이 더 안전하고 간결합니다.