깐지닉 사용자의 날카로운 지적으로 해결한 내용을 담았습니다.
public static Array createSqlArray(JdbcTemplate template, List<String> tags) throws SQLException {
Array stringArray = null;
try {
stringArray = template.getDataSource().getConnection().createArrayOf("varchar", tags.toArray());
} catch (SQLException e) {
throw new SQLException(e);
}
return stringArray;
}
위 코드는 template 에서 datasource를 직접 꺼내고 직접 커넥션을 얻어 사용하였는데, 끝나고 반환을 하지 않았다.
위 같은 경우에 finally 구문에서 close 를 해주거나, try-with-resources 를 사용하는 방법으로 해결할 수 있다.
여기서 finally로 close를 해주는 것은 구식의 방법이므로 try-with-resources를 사용하였다.
이 때, AutoClosable을 직접 커스터마이징하여 구현할 수 도 있었지만. 당초에 AutoClosable을 구현하고 있는 것이 Connection이므로, 알아서 연결을 반환하게 된다.
고친 코드는 다음과 같다.
try 안에 close되길 원하는 자원을 선언해주면 알아서 close 된다. (이 때, AutoClosable을 구현한 객체여야 된다.)
public static Array createSqlArray(JdbcTemplate template, List<String> tags) throws SQLException {
try (Connection con = template.getDataSource().getConnection()) {
return con.createArrayOf("varchar", tags.toArray());
} catch (SQLException e) {
throw new SQLException(e);
}
}
https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html위 링크는, 구현된 객체들을 담은 공식문서이다.