Deep Dive /Java Web /15-J3

15-J3. EntityManager → DB: SQL 실행

EntityManager 호출이 실제 JDBC 실행으로 내려가는 구간은 Hibernate 내부 SQL 실행기에서 확인할 수 있습니다. 이 단계에서는 Hibernate가 PreparedStatement를 만들고 executeQuery()를 호출해 DB에 요청을 보냅니다.


이번 단계의 역할

JPA API 호출은 바로 DB에 닿지 않습니다. Hibernate가 SQL, 파라미터, PreparedStatement, ResultSet 접근을 준비한 뒤 실제 JDBC 호출을 수행합니다.


호출 흐름 요약

  1. Hibernate SQL 실행기가 물리 커넥션을 확보합니다.
  2. 최종 SQL과 파라미터 바인딩 정보를 준비합니다.
  3. PreparedStatement를 생성하고 파라미터를 바인딩합니다.
  4. preparedStatement.executeQuery()를 호출해 DB에 SQL을 보냅니다.

호출 흐름 다이어그램

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()

핵심 코드

// 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());

코드 해설

EntityManager 뒤에서 바로 JDBC를 다루는 것은 Hibernate입니다. 특히 DeferredResultSetAccess#executeQuery()는 실제 DB 호출이 일어나는 가장 명확한 지점입니다.


설계 의도

JPA API와 JDBC 실행을 분리해, 상위 계층은 영속성 모델에 집중하고 하위 계층만 SQL/JDBC 세부사항을 다루게 한 구조입니다. 그래서 서비스나 저장소는 커넥션과 PreparedStatement를 직접 다루지 않아도 됩니다.


다음 단계 연결

다음 문서 15-J4에서는 DB가 돌려준 ResultSet이 Hibernate 안으로 어떻게 들어오는지 이어서 봅니다.

← 이전: 15-J2. JpaRepository → EntityManager | 다음: 15-J4. DB → EntityManager