다시 보는 초난감 DAO
✅ 예외처리 기능을 갖춘 DAO
1️⃣ JDBC 수정 기능의 예외처리 코드
public void deleteAll() throws SQLException {
Connection c = dataSource.getConnection();
PreparedStatement ps = c.prepareStatement("delete from users");
ps.executeUpdate();
ps.close();
c.close();
}
Connection
과 PreparedStatement
라는 두 개의 공유 리소스를 가져와서 사용
- 정상적으로 처리되면 메소드를 마치기 전에 각각
close()
를 호출해 리소스를 반환
- 그런데
PreparedStatement
를 처리하는 와중에 예외가 발생하면 메소드 실행을 끝마치지 못하고 바로 메소드를 빠져나가게 됨
- 리소스가 제대로 반환되지 않음
- 커넥션 풀에 여유가 없어지고 리소스가 모자르게 됨
public void deleteAll() throws SQLException {
Connection c = null;
PreparedStatement ps = null;
try {
c = dataSource.getConnection();
ps = c.prepareStatement("delete from users");
ps.executeUpdate();
} catch (SQLException e) {
throw e;
} finally {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
}
}
if (c != null) {
try {
c.close();
} catch (SQLException e) {
}
}
}
}
try/catch/finally
: finally
이므로 try
블록에서 예외가 발생했을 때나 안 했을 때나 리소스를 반환하도록 함
2️⃣ JDBC 조회 기능의 예외처리
public int getCount() throws SQLException {
Connection c = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
c = dataSource.getConnection();
ps = c.prepareStatement("select count(*) from users");
rs = ps.executeQuery();
rs.next();
return rs.getInt(1)
} catch (SQLException e) {
throw e;
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
}
}
if (c != null) {
try {
c.close();
} catch (SQLException e) {
}
}
}
}
getCount()
: 등록된 User
의 수를 가져옴
ResultSet
이 추가됨
- 만들어진
ResultSet
을 닫아주는 기능을 추가함