Backend/JAVA / / 2025. 4. 4. 15:40

[Java] try-with-resources: 예외 처리와 자원 관리를 깔끔하게 해결하는 방법

Java try-with-resources, 자원 해제, AutoCloseable, 예외 처리, Java 예외 안전성, try-catch-finally 대안

Java에서 파일, 네트워크, 데이터베이스와 같이 외부 자원을 사용할 때 정확한 자원 해제는 필수입니다. 과거에는 try-catch-finally 블록을 사용해 자원을 명시적으로 닫았지만, Java 7부터 도입된 **try-with-resources**는 이를 훨씬 더 우아하고 안전하게 처리할 수 있도록 해줍니다.


try-with-resources란?

try-with-resources는 자원을 자동으로 해제해주는 Java의 문법입니다. try 문에 자원을 선언하면, 해당 자원은 try 블록이 끝나면서 자동으로 닫힙니다. 이 문법을 사용하기 위해서는 자원이 AutoCloseable 인터페이스를 구현해야 합니다.

try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

위 예제에서 BufferedReader는 AutoCloseable을 구현하고 있기 때문에, try 블록이 끝나면 자동으로 close()가 호출됩니다. finally 블록이 필요 없죠.


기존 try-catch-finally와의 차이점

전통적인 방식:

BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("example.txt"));
    // 작업 수행
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (reader != null) {
            reader.close();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

 

try-with-resources:

try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
    // 작업 수행
} catch (IOException e) {
    e.printStackTrace();
}

코드 간결성, 가독성, 그리고 예외 안전성 측면에서 압도적인 차이가 있습니다.

 


어떤 자원에 사용할 수 있나?

AutoCloseable 또는 Closeable을 구현한 클래스라면 모두 사용할 수 있습니다.

자원 유형대표 클래스
파일 FileReader, BufferedReader, FileInputStream
DB 연결 Connection, Statement, ResultSet
네트워크 Socket, ServerSocket

💡 : 커스텀 자원을 만들 때도 AutoCloseable을 구현하면 try-with-resources로 활용할 수 있습니다.

public class MyResource implements AutoCloseable {
    @Override
    public void close() {
        System.out.println("MyResource closed");
    }
}

실무에서 주의할 점

1. 복수 자원 처리: 여러 자원을 선언할 수 있으며, 선언 순서의 역순으로 해제됩니다.

try (
    Connection conn = dataSource.getConnection();
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM user");
) {
    // 처리
}

 

2. Exception이 여러 개 발생할 때: try 내부와 close()에서 예외가 동시에 발생할 수 있습니다. 이때는 Suppressed Exception으로 확인할 수 있습니다

for (Throwable t : e.getSuppressed()) {
    t.printStackTrace();
}

 

3. 자원 재사용 불가: try 블록에 선언된 자원은 해당 블록 내에서만 유효합니다. 블록 외부에서 접근하려면 리팩토링이 필요합니다.


try-with-resources를 사용하지 않으면 어떤 문제가 생기나?

  • 자원을 명시적으로 닫지 않으면 메모리 누수 발생
  • 예외 상황에서 자원이 닫히지 않을 수 있음
  • 코드가 복잡해지고 유지보수 어려움

결론: Java에서 자원 관리는 try-with-resources가 정답이다

try-with-resources는 단순히 코드를 줄이기 위한 문법이 아닙니다.
명시적인 자원 관리, 예외 안전성 보장, 그리고 가독성 개선을 동시에 충족하는 실무 필수 문법입니다.


이미지 예시 (추가 예정 시 아래 다이어그램 제안)

  • try-catch-finally vs try-with-resources 흐름도
  • AutoCloseable 인터페이스 구조도
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유