Deep Dive /Java Web /15-J4

15-J4. DB → EntityManager: ResultSet 반환

SQL이 실행되면 DB는 JDBC ResultSet을 돌려주고, Hibernate는 이를 감싸서 이후 매핑 단계로 넘깁니다. 이 단계는 “DB가 응답했다”는 사실을 코드로 확인할 수 있는 구간입니다.


이번 단계의 역할 — DB가 돌려준 JDBC 결과를 Hibernate가 수령하는 단계

DB가 반환한 JDBC 결과를 Hibernate가 수령해 내부 결과 처리 파이프라인으로 연결합니다. 아직 Entity로 바뀐 것은 아니고, 우선 ResultSet이 확보된 상태입니다.


호출 흐름 요약 — executeQuery() 완료 → wrapResultSet() → 리소스 레지스트리 등록

  1. executeQuery()가 완료됩니다.
  2. Hibernate가 ResultSetwrapResultSet(...)으로 감쌉니다.
  3. 결과 집합을 리소스 레지스트리에 등록합니다.
  4. 다음 단계에서 RowReader와 결과 소비기가 엔티티 매핑을 시작합니다.

호출 흐름 다이어그램 — DeferredResultSetAccess가 ResultSet을 감싸 Hibernate에 등록한다

sequenceDiagram participant DB participant RS as DeferredResultSetAccess participant Hibernate DB-->>RS: ResultSet RS->>RS: wrapResultSet(resultSet) RS->>Hibernate: register(resultSet, preparedStatement)

핵심 코드 — wrapResultSet() 결과를 ResourceRegistry에 등록한다

// DeferredResultSetAccess.java
resultSet = wrapResultSet(preparedStatement.executeQuery());
skipRows(resultSet);
logicalConnection.getResourceRegistry().register(resultSet, preparedStatement);

코드 해설 — 아직 Entity가 아니고 JDBC 결과를 후속 처리로 넘긴 상태다

이 지점은 DB가 데이터를 돌려준 직후입니다. 하지만 JPA 사용자는 아직 Entity를 받지 않았고, Hibernate 내부에서는 이제 막 JDBC 결과를 후속 처리 대상으로 넘긴 상태입니다.


설계 의도 — 실행 단계와 매핑 단계를 갈라 따로 관리한다

JDBC 결과와 엔티티 매핑 단계를 분리해서, 실행 단계와 매핑 단계를 독립적으로 관리하려는 구조입니다. 덕분에 Hibernate는 결과 집합 처리, 캐싱, 통계, 행 변환을 별도의 파이프라인으로 다룰 수 있습니다.


다음 단계 연결 — 15-J5 ResultSet이 Entity로 매핑되는 과정으로 이어진다

다음 문서 15-J5에서는 이 ResultSet이 Hibernate 내부에서 Entity로 매핑되는 과정을 봅니다.

← 이전: 15-J3. EntityManager → DB | 다음: 15-J5. EntityManager → JpaRepository