Today I Learned_230508

1 분 소요

토비의 스프링 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;
}

카테고리:

업데이트: