Deep Dive /Java Web /15-J4

15-J4. DB → EntityManager: ResultSet 반환

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


이번 단계의 역할

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


호출 흐름 요약

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

호출 흐름 다이어그램

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

핵심 코드

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

코드 해설

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


설계 의도

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


다음 단계 연결

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

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