try-with-resources

      try-with-resources에 댓글 없음

JDBC DAO 객체에서, 다음과 같은 코드를 짤 수 있다.

// JdbcTemplate.java

public void insert(String query) throws SQLException {
    Connection connection = getConnection();
    PreparedStatement statement = connection.prepareStatement(query);
    setParameters(statement);
    statement.executeUpdate();
}

연결을 수립하고, PreparedStatement를 준비한 다음 파라메터를 탑재하고 Insert를 수행하는 이 코드는 구조상 문제가 없어 보이지만 닫아야 하는 Connection, PreparedStatement를 닫지 않았다.
따라서 Connection을 수동으로 닫지 않거나 중간에 exception 발생 등으로 닫히는 로직이 실행되지 않게 되면, 많은 쿼리를 짧은 시간에 처리해야 하는 경우 Connection이 풀로 반환되지 않아 프로그램이 다운될 수 있다.

이럴 때 사용할 수 있는 방법이 try-with-resources를 사용하는 방법이다. 자바 7에서 추가된 try-with-resources는 기존에 finally를 이용하는 방법보다 더 간단하게 자원을 해제할 수 있다.

AutoClosable을 상속받은 클래스의 객체라면 무엇이든 try-with-resources로 자동 해제시킬 수 있다.

public interface Connection extends Wrapper, AutoCloseable {
    //...
}

사용법은 이렇다.

try ( 
    //Connection이나 Statement 등...
) { 
    //로직... 
} catch(Exception e) { 
    //예외 처리... 
}

맨 위의 코드를 try-with-resources로 리팩토링 한다면…

// JdbcTemplate.java

public void insert(String query) throws SQLException {
    try (
        Connection connection = getConnection();
        PreparedStatement statement = connection.prepareStatement(query)
    ) {
        setParameters(statement);
        statement.executeUpdate();
    }
}

참고자료

댓글 남기기