15-J4. DB → EntityManager: ResultSet 반환
SQL이 실행되면 DB는 JDBC ResultSet을 돌려주고, Hibernate는 이를 감싸서 이후 매핑 단계로 넘깁니다.
이 단계는 “DB가 응답했다”는 사실을 코드로 확인할 수 있는 구간입니다.
이번 단계의 역할 — DB가 돌려준 JDBC 결과를 Hibernate가 수령하는 단계
DB가 반환한 JDBC 결과를 Hibernate가 수령해 내부 결과 처리 파이프라인으로 연결합니다.
아직 Entity로 바뀐 것은 아니고, 우선 ResultSet이 확보된 상태입니다.
호출 흐름 요약 — executeQuery() 완료 → wrapResultSet() → 리소스 레지스트리 등록
executeQuery()가 완료됩니다.- Hibernate가
ResultSet을wrapResultSet(...)으로 감쌉니다. - 결과 집합을 리소스 레지스트리에 등록합니다.
- 다음 단계에서
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