Deep Dive /Java Web /15-J3

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 바인딩

  1. Hibernate SQL 실행기가 물리 커넥션을 확보합니다.
  2. 최종 SQL과 파라미터 바인딩 정보를 준비합니다.
  3. PreparedStatement를 생성하고 파라미터를 바인딩합니다.
  4. 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