Search
Duplicate
📝

try-with-resources

태그
개념
정의
상위 항목
하위 항목
진짜 처음봄
Java 7버전부터 도입된 문법으로 try-catch를 개선한 문법이다.
왜 사용해야하는지, 무엇이 개선되었는지, 어떻게 사용하는 지 알아보자.

try-with-resources란?

try-catch-finally
Connection connection = ConnectionPool.getConnection(); try { connection.query(); } finally { CoonnectionPool.release(connection); }
Java
복사
이 경우, 다음과 같은 단점이 존재한다.
자원 반납 과정에 의해 코드가 복잡해진다.
비즈니스 로직에 불필요한 작업들이 반복적으로 발생한다.
실수나 에러로 자원을 반납하지 못하는 상황이 발생할 수 있다.
⇒ 만약, connection.release()에서 예외가 발생한다면?
에러 스택 트레이스가 누락되어 디버깅이 어렵다.
try-with-resources
Java는 위와 같은 문제점들을 해결하고자 자원을 자동으로 반납해주는 try-with-resources 문법을 추가하였다.
Java는 AutoCloseable 인터페이스를 구현하고 있는 객체의 자원에 대해 try-with-resources를 적용 가능하게 하였고 이를 사용함으로써 불필요한 코드의 반복을 줄일 수 있었다.
try (Connection connection = ConnectionPool.getConnection();) { connection.query(); }
Java
복사
사용하는 자원(Connection)이 반드시 AutoCloseable 인터페이스를 구현해야하며 try 구문 안에 자원을 선언하고 try 구문이 무슨 경우로든 종료되는 경우 자동으로 해당 자원을 반납해주는 기능이다.
코드의 가독성이 향상되었다.
휴먼 에러 가능성이 줄어들었다.
정상 흐름, 비정상 흐름을 넘나들지 않아 에러 스택 트레이스가 온전하다.

에러에 대한 스택 트레이스

try-finally를 사용하여 자원 반납을 하는 경우, close에서 발생한 예외만 표시되고 readLine에서 발생한 예외는 표시되지 않는다.
final MyResource myResource = new MyResource(); try { myResource.readLine(); } finally { myResource.close(); } Exception in thread "main" java.lang.IllegalArgumentException: CLOSE at herb.MyResource.close(MyResource.java:24) at herb.MyResource.main(MyResource.java:10)
Java
복사
try-with-resources를 사용하면 Suppressed 꼬리표를 달리고, 발생한 모든 예외가 표시된다.
try (final MyResource myResource = new MyResource()) { myResource.readLine(); } Exception in thread "main" java.lang.IllegalArgumentException: READ at herb.MyResource.readLine(MyResource.java:19) at herb.MyResource.main(MyResource.java:14) Suppressed: java.lang.IllegalArgumentException: CLOSE at herb.MyResource.close(MyResource.java:24) at herb.MyResource.main(MyResource.java:13)
Java
복사