Today I Learned_230508
토비의 스프링 3.1
3장. 템플릿
템플릿
→ 바뀌는 성질이 다른 코드 중, 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜 효과적으로 활용할 수 있도록 하는 기법
OCP 원칙
→ 코드의 일부는 확장하려는 성질을, 일부는 변하지 않으려는 성질을 가지고 있다.
예외상황에 대한 처리
JDBC → 수행 중간에 어떠한 이유로든 예외가 발생하면 리소스를 반드시 반환해야 한다.
public void deleteAll() throws SQLException {
Connection c = dataSource.getConnection();
PreparedStatement ps = c.prepareStatement("delete from USER");
ps.executeUpdate();
ps.close();
c.close();
}
PreparedStatement를 수행하던 중에 예외가 발생하면 ps와 c가 close되지 않을 수 있다.
→ 커넥션을 닫지 않으면 커넥션 풀에 여유가 없어지고 리소스가 모자라게 된다.
보통 정해진 풀 안에 제한된 리소스를 만들어 두고 필요할 때 할당하여, 사용을 다 하면 반환하는 식으로 이루어 진다. 리소스 반환이 제대로 되지 않으면 리소스가 고갈된다.
보통은 try/catch/finally를 통해 리소스를 관리한다.
public void deleteAll() throws SQLException {
Connection c = null;
PreparedStatement ps = null;
try {
c = dataSource.getConnection();
ps = c.prepareStatement("delete from USER");
ps.executeUpdate();
} catch (SQLException e) {
throw e;
} finally {
if (ps != null) {
try { ps.close(); }
catch (SQLException e) {} // 이거 잡아주지 않으면 connection을 close하지 않고 빠져나갈 수 있다.
}
if( c != null ) {
try { c.close(); }
catch (SQLException e) {}
}
}
}
- 보통은 할당한 순서의 역순으로 자원을 해제한다.
- 메모리 누수를 방지하기 위함
- 할당한 순서대로 자원을 해제하면, 뒤따르는 자원들이 아직 사용 중이어서 해제되지 않은 상태일 수 있음
- 코드 관리성 향상
- stack의 동작과 유사하므로 코드 관리가 쉬워짐
- 메모리 누수를 방지하기 위함
Java 1.7부터는 try블록에 Automatic resource management를 지원해서 아래와 같이 바꿀 수도 있다. (책에서는 나오지 않음) → 마지막에 ps.close()와 c.close()는 생략해도 됨
try (Connection c = dataSource.getConnection(); PreparedStatement ps = c.prepareStatement("delete from USER")) {
ps.executeUpdate();
} catch (SQLException e) {
throw e;
}