본격적으로 애플리케이션 코드에 트랜잭션 매니저를 적용해보자..
이전에 파라미터로 트랜잭션을 넘겨주던 코드를 트랜잭션 매니저를 이용하도록 변경할 것임…
이전 코드는 이렇게 되어있었다.
private Connection getConnection() throws SQLException {
Connection con = dataSource.getConnection();
log.info("get connection={}, class={}", con, con.getClass());
return con;
}
이를 이렇게 바꾸자. DataSource객체를 넘기면 거기에 맞는 커넥션 객체를 반환해준다.
더 자세하게 설명하면, 트랜잭션 동기화 매니저가 관리하는 커넥션이 있을때는 그 친구를 반환한다.
만약 동기화 매니저가 관리하는 커넥션이 없다면 새로운 커넥션을 생성해서 반환한다.
이 경우는 서비스단에서 트랜잭션을 사용하지 않지만, 리포지 단에서 사용하는 경우임.
private Connection getConnection() throws SQLException {
//DataSource이용한 트랜잭션 동기화
Connection con = DataSourceUtils.getConnection(dataSource);
log.info("get connection={}, class={}", con, con.getClass());
return con;
}
그리고 사용이 끝난 커넥션도 DataSourceUtils를 통해 닫아주자
private void close(Connection con, Statement stmt, ResultSet rs) {
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeStatement(stmt);
//DataSourceUtils를 통해 닫아줘야 한다.
DataSourceUtils.releaseConnection(con, dataSource);
}
이때 사용되는 메서드가 releaseConnection()
이다.
이 메서드는 단순히 커넥션을 반환해버리는게 아님. 실제로 커넥션을 그냥 반환해버리면 이후 로직은 물론이고, 커밋이나 롤백등을 진행할 수도 없다.
그래서 동기화된 커넥션이라면 커넥션을 닫지 않고(이때는 비즈니스 로직이 다 끝날때까지 대기해야하고, 그건 서비스 단에서 판단할 문제임.), 오직 동기화 매니저가 관리하는 커넥션이 아닐때만 해당 커넥션을 닫는 기능을 한다.