본문 바로가기

개발 고민

JPA IdentifierGenerator의 connection에 대해..

본 글은 Spring Boot 2.7.13(Java 17), Hibernate 5.6.15 기준으로 작성됨

 

JPA에서 ID를 커스텀하게 만들 때 IdentifierGenerator, Configurable를 implements 받아서 ID생성기를 구현한다.

구글링을 하다보면, session.connection();이나 session.getJdbcConnectionAccess().obtainConnection();를 사용해서 DB connection을 가져온다.

 

 session.connection()과 session.getJdbcConnectionAccess().obtainConnection()는 뭔 차이일까?

 


1단계 일단, 둘 다 디버깅 걸어보자

session.connection()

application.yml로 설정한 hikari-pool이 보인다.

session.getJdbcConnectionAccess().obtainConnection()

어..? hikaripool의 클래스 주소까지 같네..??

 


2단계, 문서와 코드를 까보자

session.connection() 

출처: https://github.com/hibernate/hibernate-orm/blob/main/hibernate-core/src/main/java/org/hibernate/engine/spi/SharedSessionContractImplementor.java

하이버네이트가 관리하는 JDBC 커넥션

 

session.getJdbcConnectionAccess().obtainConnection()

getJdbcConnectionAccess에 해당하는 JdbcConnectionAccess 인터페이스에 보면,

/**
 * Provides centralized access to JDBC connections.  Centralized to hide the complexity of accounting for contextual
 * (multi-tenant) versus non-contextual access.
 *
 * @author Steve Ebersole
 */
public interface JdbcConnectionAccess extends Serializable {

파파고를 통하면,

중앙 접근이 가능한 JDBC

 


어떤 걸 써야 하지...??

 

datasource를 빈으로 등록해서 스프링 서버를 구동하면, 둘 다 문제없는 소스다.

하지만, hibernate가 관리하는 JDBC보단 중앙 접근 가능한 방식이 조금 더 좋은 코드로 보인다.

추가로, Jboss 사이트의 hibernate문서를 보면, connection()은 4.x버전부터 제거예정이라고 명시했다.

 

제거될 함수보다는 session.getJdbcConnectionAccess().obtainConnection()를 쓰는 것이 좋을듯하다.

https://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html#connection()

 

 

여담...

아니.. hibernate 5.x버전 쓰는데, @Deprecated 어노테이션 없던데..;;;

 

 

'개발 고민' 카테고리의 다른 글

단일 책임 원칙과 클린코드 V2  (0) 2023.08.09
MultipartFile 업로드에 관하여  (0) 2023.05.30