15-J2. JpaRepository → EntityManager: find() / createQuery()
이 단계는 Spring Data JPA 저장소 구현체가 실제 JPA 표준 API인 EntityManager로 위임하는 구간입니다.
조회는 find(...), 배치 삭제 같은 작업은 createQuery(...)를 통해 처리되므로, 이 단계가 JPA API 진입점입니다.
이번 단계의 역할 — 저장소 메서드 호출이 JPA 표준 API 연산으로 번역된다
SimpleJpaRepository는 저장소 호출을 받아 JPA API 메서드로 바꿉니다.
즉 “Repository 메서드 호출”이 “EntityManager 연산”으로 변환되는 구간입니다.
호출 흐름 요약 — 단건이면 find(), 배치면 createQuery()로 갈린다
SimpleJpaRepository가 저장소 메서드를 처리합니다.- 단건 조회라면
entityManager.find(...)를 호출합니다. - 배치 연산이라면
entityManager.createQuery(...)를 호출할 수 있습니다. - 이후 Hibernate 구현이 실제 JDBC 실행 단계로 내려갑니다.
호출 흐름 다이어그램 — SimpleJpaRepository가 EntityManager를 거쳐 Hibernate에 닿는다
sequenceDiagram
participant Repo as SimpleJpaRepository
participant EM as EntityManager
participant Hibernate
Repo->>EM: find(domainType, id)
Repo->>EM: createQuery(...)
EM->>Hibernate: provider implementation
핵심 코드 — findById()와 deleteAllInBatch()가 서로 다른 EntityManager 연산을 부른다
// SimpleJpaRepository.java
public Optional<T> findById(ID id) {
Class<T> domainType = getDomainClass();
return Optional.ofNullable(entityManager.find(domainType, id));
}
// SimpleJpaRepository.java
public void deleteAllInBatch() {
Query query = entityManager.createQuery(deleteAllQueryString.get());
applyQueryHints(query);
query.executeUpdate();
}
코드 해설 — 여기서부터는 Spring Data JPA가 아니라 Hibernate가 실행을 이어받는다
SimpleJpaRepository는 저장소 추상화와 JPA 표준 API 사이의 번역기 역할을 합니다.
이 시점부터는 Spring Data JPA가 아니라 JPA 구현체(Hibernate)가 실제 실행을 이어받습니다.
설계 의도 — 저장소 패턴은 유지하면서 내부는 표준 EntityManager를 쓴다
저장소 패턴은 유지하면서도, 내부적으로는 표준 EntityManager를 사용하기 위한 구조입니다.
그래서 Repository API는 간결하게 유지되고, 실제 영속성 처리는 JPA 구현체에 위임됩니다.
다음 단계 연결 — 15-J3 Hibernate가 JDBC executeQuery()까지 내려가는 과정으로 이어진다
다음 문서 15-J3에서는 Hibernate 내부가 JDBC PreparedStatement.executeQuery()까지 어떻게 내려가는지 봅니다.
← 이전: 15-J1. Service → JpaRepository | 다음: 15-J3. EntityManager → DB