개방 폐쇄 원칙
-> 각각 다른 목적과 다른 이유에 의해 다른 시점에 독립적으로 변경될 수 있는 효율적인 구조를 만드는 것
템플릿 -> 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법
다시보는 초난감 DAO
예외처리 기능을 갖춘 DAO
UserDao의 deleteAll()메소드를 보면 메소드를 마치기 전에 각각 close()를 호출해 리소스를 반환한다.
하지만 Connection과 PreparedStatement의 close()메소드가 실행되지 않아서 제대로 리소스가 반환되지 않을 수 있다.
그래서 어떤 상황에서도 리소스를 반환할 수 있도록 JDBC코드에서는 try/catch/finally구문을 권장하고 있다.
finally구문 안에서 close()메소드를 호출하면 무조건 리소스를 반환하고 메소드를 마치게 되니 문제가 해결된다.
하지만 close()메소드 자체에서도 SQLException이 발생할 수 있는 메소드이므로, 역시나 try/catch문으로 처리해 주어야 한다.
public void deleteAll() throws SQLException {
Connection c = null;
PreparedStatement ps = null;
try {
c = dataSource.getConnection();
ps = c.prepareStatement("delete from users");
ps.excuteUpdate();
} catch (SQLException e) {
throw e;
} finally {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
}
}
if (c != null) {
try {
c.close();
} catch (SQLException e) {
}
}
}
}
어느 시점에서 예외가 발생했는지에 따라서 close()를 사용할 수 있는 변수가 달라질 수 있기 때문에 finally에서는 반드시 c와 ps가 null이 아닌지 먼저 확인한 후에 close()메소드를 호출해야 한다.
JDBC 조회 기능의 예외처리
조회를 위한 JDBC 코드에서는 Connection, PrepareStatement 외에 ResultSet 이 추가되기 때문에 코드가 좀 더 복잡하다.
하지만 구성읕 마찬가지 이므로, ResultSet의 close()메소드가 반드시 호출되도록 만들면 된다.