•
진짜 처음봄
•
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
복사