try {
...
} catch(..) {
...
} finally {
    if (writer != null) writer.close();
    if (reader != null) reader.close();
    if (socket != null) socket.close();
}

보통 위와 같이 했는데, 이렇게 하면 안된다.

위와 같이하면 첫번째 writer.close() 에서 예외가 발생하면 그 이후의 다른 close() 문들은 전혀 실행되지 않고 빠져나가 버려 리소스 누수가 발생하게 된다.

이것은 스트림이나 소켓 뿐만 아니라 JDBC Connection 에서도 마찬가지 이다.

그러므로 다음과 같이 바꿔야만 쓰겠다.


try {
...
} catch(..) {
...
} finally {
    if (writer != null) {
        try { writer.close(); } catch (Exception ex) {}
    }

    if (reader != null) {
        try { reader.close(); } catch (Exception ex) {}
    }

    if (socket != null) {
        try { socket.close(); } catch (Exception ex) {}
    }
}


if / for / while 문 등은 비록 실행할 문장이 한 개 뿐이라도 괄호를 치는 것을 원칙으로 한다.
그리고 일일이 귀찮더라도 다 try/catch 안에 .close() 문을 넣어야 안전하게 리소스를 닫는 것이 된다.

Jakarta Commons DBUtils에는 저런 귀찮은 try/catch 없이 메소드 하나 호출로 JDBC 리소스를 닫아주는 메소드가 있다.
DbUtils.closeQuietly()를 한번 참고해 보시길....

+ Recent posts