15-J3. EntityManager → DB: SQL 실행
EntityManager 호출이 실제 JDBC 실행으로 내려가는 구간은 Hibernate 내부 SQL 실행기에서 확인할 수 있습니다.
이 단계에서는 Hibernate가 PreparedStatement를 만들고 executeQuery()를 호출해 DB에 요청을 보냅니다.
이번 단계의 역할 — JPA API 호출은 바로 DB에 닿지 않고 Hibernate가 JDBC를 준비한다
JPA API 호출은 바로 DB에 닿지 않습니다.
Hibernate가 SQL, 파라미터, PreparedStatement, ResultSet 접근을 준비한 뒤 실제 JDBC 호출을 수행합니다.
호출 흐름 요약 — 커넥션 확보 → SQL·파라미터 준비 → PreparedStatement 바인딩
- Hibernate SQL 실행기가 물리 커넥션을 확보합니다.
- 최종 SQL과 파라미터 바인딩 정보를 준비합니다.
PreparedStatement를 생성하고 파라미터를 바인딩합니다.preparedStatement.executeQuery()를 호출해 DB에 SQL을 보냅니다.
호출 흐름 다이어그램 — JdbcSelectExecutorStandardImpl과 DeferredResultSetAccess가 executeQuery()를 부른다
sequenceDiagram
participant EM as EntityManager
participant Hibernate as JdbcSelectExecutorStandardImpl
participant RS as DeferredResultSetAccess
participant DB
EM->>Hibernate: query execution
Hibernate->>RS: getResultSet()
RS->>RS: bindParameters(preparedStatement)
RS->>DB: preparedStatement.executeQuery()
핵심 코드 — DeferredResultSetAccess가 파라미터를 바인딩하고 executeQuery()를 부른다
// JdbcSelectExecutorStandardImpl.java
final var connection = logicalConnection.getPhysicalConnection();
final var deferredResultSetAccess = new DeferredResultSetAccess(
jdbcSelect, jdbcParameterBindings, executionContext, statementCreator, resultCountEstimate);
final var jdbcValues = resolveJdbcValuesSource(..., deferredResultSetAccess);
// DeferredResultSetAccess.java
preparedStatement = statementCreator.createStatement(executionContext, finalSql);
bindParameters(preparedStatement);
resultSet = wrapResultSet(preparedStatement.executeQuery());
코드 해설 — DeferredResultSetAccess#executeQuery()가 실제 DB 호출 지점이다
EntityManager 뒤에서 바로 JDBC를 다루는 것은 Hibernate입니다.
특히 DeferredResultSetAccess#executeQuery()는 실제 DB 호출이 일어나는 가장 명확한 지점입니다.
설계 의도 — JPA API와 JDBC 실행을 분리해 상위 계층은 영속성 모델만 다룬다
JPA API와 JDBC 실행을 분리해, 상위 계층은 영속성 모델에 집중하고 하위 계층만 SQL/JDBC 세부사항을 다루게 한 구조입니다.
그래서 서비스나 저장소는 커넥션과 PreparedStatement를 직접 다루지 않아도 됩니다.
다음 단계 연결 — 15-J4 ResultSet이 Hibernate 안으로 들어오는 과정으로 이어진다
다음 문서 15-J4에서는 DB가 돌려준 ResultSet이 Hibernate 안으로 어떻게 들어오는지 이어서 봅니다.
← 이전: 15-J2. JpaRepository → EntityManager | 다음: 15-J4. DB → EntityManager