Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 리소스를 자동으로 닫는 방법 – JDBC try-with-resources 완벽 가이드


JDBC에서는 try-with-resources 구문을 사용하면 리소스를 자동으로 닫을 수 있습니다. 이 글에서는 try-with-resources의 기본 문법과 JDBC에서의 실전 활용 예제를 살펴보겠습니다.

기본 문법

try(리소스 선언){
    본문.....
} catch (SQLException e) {
    e.printStackTrace();
}

try-with-resources는 try 문의 괄호 안에 하나 이상의 리소스를 직접 선언하는 방식입니다. 여기서 리소스(resource)란 사용이 끝난 후 반드시 닫아야 하는 객체를 의미합니다.

이 구문에서는 여러 개의 리소스를 동시에 선언할 수도 있으며, 선언된 모든 리소스는 해당 문장이 종료되는 시점에 자동으로 닫힙니다. 덕분에 개발자가 finally 블록에서 일일이 close() 메서드를 호출할 필요가 없어지고, 예외가 발생하더라도 리소스 누수를 걱정할 수 없습니다.

사용 조건

try-with-resources에서 선언하는 객체는 반드시 java.lang.AutoCloseable 인터페이스 또는 java.io.Closeable 인터페이스를 구현해야 합니다.

JDBC에서는 다음과 같은 클래스들이 try-with-resources 문에서 사용 가능합니다.

  • java.sql.CallableStatement
  • Connection
  • PreparedStatement
  • Statement
  • ResultSet
  • RowSet

예제

먼저 MySQL 데이터베이스에서 CREATE 문을 사용하여 MyPlayers라는 이름의 테이블을 생성해 보겠습니다.

CREATE TABLE MyPlayers(
    ID INT,
    First_Name VARCHAR(255),
    Last_Name VARCHAR(255),
    Date_Of_Birth date,
    Place_Of_Birth VARCHAR(255),
    Country VARCHAR(255),
    PRIMARY KEY (ID)
);

다음으로 INSERT 문을 사용하여 MyPlayers 테이블에 7개의 레코드를 삽입합니다.

insert into MyPlayers values(1, 'Shikhar', 'Dhawan', DATE('1981-12-05'), 'Delhi', 'India');
insert into MyPlayers values(2, 'Jonathan', 'Trott', DATE('1981-04-22'), 'CapeTown', 'SouthAfrica');
insert into MyPlayers values(3, 'Kumara', 'Sangakkara', DATE('1977-10-27'), 'Matale', 'Srilanka');
insert into MyPlayers values(4, 'Virat', 'Kohli', DATE('1988-11-05'), 'Delhi', 'India');
insert into MyPlayers values(5, 'Rohit', 'Sharma', DATE('1987-04-30'), 'Nagpur', 'India');
insert into MyPlayers values(6, 'Ravindra', 'Jadeja', DATE('1988-12-06'), 'Nagpur', 'India');
insert into MyPlayers values(7, 'James', 'Anderson', DATE('1982-06-30'), 'Burnley', 'England');

아래 JDBC 프로그램은 try-with-resources 문을 사용하여 Connection, Statement, ResultSet을 자동으로 관리하는 방법을 보여줍니다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TryWithResources_Example {
    public static void main(String args[]) {
        // 연결 정보 설정
        String mysqlUrl = "jdbc:mysql://localhost/mydatabase";
        System.out.println("Connection established......");
        // try-with-resources로 Connection과 Statement 선언
        try(Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
        Statement stmt = con.createStatement(); ) {
            // ResultSet도 try-with-resources로 선언
            try(ResultSet rs = stmt.executeQuery("select * from MyPlayers");) {
                // 데이터 조회
                while(rs.next()) {
                    System.out.print(rs.getInt("ID")+", ");
                    System.out.print(rs.getString("First_Name")+", ");
                    System.out.print(rs.getString("Last_Name")+", ");
                    System.out.print(rs.getDate("Date_Of_Birth")+", ");
                    System.out.print(rs.getString("Place_Of_Birth")+", ");
                    System.out.print(rs.getString("Country"));
                    System.out.println();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

실행 결과

Connection established......
1, Shikhar, Dhawan, 1981-12-05, Delhi, India
2, Jonathan, Trott, 1981-04-22, CapeTown, SouthAfrica
3, Kumara, Sangakkara, 1977-10-27, Matale, Srilanka
4, Virat, Kohli, 1988-11-05, Delhi, India
5, Rohit, Sharma, 1987-04-30, Nagpur, India
6, Ravindra, Jadeja, 1988-12-06, Nagpur, India
7, James, Anderson, 1982-06-30, Burnley, England

위 예제처럼 try-with-resources를 사용하면 프로그램이 정상적으로 실행되든 SQLException이 발생하든 상관없이, 선언된 ResultSet, Statement, Connection이 순서대로 자동으로 닫히므로 코드가 간결해지고 리소스 누수 위험도 크게 줄어듭니다.