try-with-resources

devyumi·2024년 7월 9일
0

Java

목록 보기
10/14

try-with-resources


  • Java 7부터 도입된 문법이며 사용한 자원을 해제하기 위해 사용한다.

  • try-with-resources 문법을 사용하기 위해서는 AutoCloseable 인터페이스를 구현해야 한다.
    해당 인터페이스는 close() 메서드가 실행될 때까지 자원이 사용될 수 있도록 유지하며, try 블록이 종료될 때 자동으로 close() 메서드가 호출되도록 한다.


try-catch-finally


  • 사용하는 자원이 많아질수록 코드 가독성이 낮아지며, 이로 인해 자원을 반납하지 않는 일들이 빈번해진다.
    또한, close() 메서드를 호출하기 위해서도 try-catch 구문을 구현 해야 함으로 코드 복잡성이 높아진다.

(더 알아볼 것: 스택 트레이스 누락)



AutoClosable


  • API 를 살펴보면 AutoClosable 인터페이스가 Closeable 인터페이스보다 늦게 추가된 것을 알 수 있다.
    AutoClosable를 상위 인터페이스로 추가하면서 하위 인터페이스와 클래스 모두가 try-with-resources 문법을 사용할 수 있게 되었다.

  • AutoClosable를 구현하는 인터페이스와 클래스 목록을 살펴보면 대부분 입출력과 관련되어 있는 것을 확인할 수 있으며, 다양한 입출력을 구현할 때 유용하게 쓰일 수 있을 것이다.



예시) JDBC - select


  • JDBC select 메서드를 예시로 사용하였다.
    해당 메서드에서 사용하는 자원은 Connection, PreparedStatement, ResultSet이다.

  • 먼저 try-catch-finally 구문을 사용한 코드이다.
    밑단으로 갈수록 자원 해제와 관련된 코드가 길어져서 가독성이 떨어지는 것을 확인할 수 있다.

public static void selectAllMember() {
    String url = //url
    String id = //root
    String pwd = //pwd;
   
    String query = "SELECT * FROM member";
   
    Connection connetion = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
   
    try {
      connetion = DriverManager.getConnection(url, userName, password);
      pstmt.connection.prepareStatement(query);
      rs = pstmt.executeQuery()
      while (rs.next()) {
        int tableId = rs.getInt("id");
        String name = rs.getString("name");
        String job = rs.getString("job");
        System.out.printf("id : %d name : %s  job : %s", id, name, job);
      }
    } catch (SQLException e) {
      throw new RuntimeException(e);
    } finally {
      try {				//자원 해제
        rs.close();
        pstmt.close();
        connetion.close();
      } catch (SQLExeption e) {
      	throw new RuntimeException(e);
      }
    }
}



  • try-with-resources 문법을 적용하여 구현한 select 메서드이다.

  • 본래 try-with-resources 문법을 사용하기 위해서는 AutoCloseable 인터페이스 구현해야 하지만, Connection, PreparedStatement, ResultSet 모두 AutoCloseable 인터페이스를 구현하고 있으므로 생략한다.

  • 자원 해제와 관련된 코드를 구현할 필요가 없어져 코드 가독성이 좋아지고, 코드가 간결해지는 것을 확인할 수 있다.

public abstract class MemberDB {

  private static final String url = //url
  private static final String id = //id
  private static final String pwd = //pwd

  /**
   * Member Select method
   */
  public static void selectAllMember() {

    String query = new StringBuilder()
        .append("SELECT * ")
        .append("FROM member ").toString();

    try (Connection connection = DriverManager.getConnection(url, id, pwd);
        PreparedStatement pstmt = connection.prepareStatement(query);
        ResultSet rs = pstmt.executeQuery()) {	//try() 내부에 사용할 자원을 선언하면 된다.

      System.out.println("*".repeat(60));
      while (rs.next()) {
        Member member = new Member(
            rs.getInt("id"),
            rs.getString("name"),
            rs.getString("job")
        );
        System.out.println(member);
      }
      System.out.println("*".repeat(60));

    } catch (SQLException e) {	//예외 발생 시 Custom Exception 처리
      throw new JdbcException(ErrorMessage.JDBC_SELECT_FAIL);
    }
  }

0개의 댓글

관련 채용 정보