Deep Dive /Java Web /15-J2

15-J2. JpaRepository → EntityManager: find() / createQuery()

이 단계는 Spring Data JPA 저장소 구현체가 실제 JPA 표준 API인 EntityManager로 위임하는 구간입니다. 조회는 find(...), 배치 삭제 같은 작업은 createQuery(...)를 통해 처리되므로, 이 단계가 JPA API 진입점입니다.


이번 단계의 역할

SimpleJpaRepository는 저장소 호출을 받아 JPA API 메서드로 바꿉니다. 즉 “Repository 메서드 호출”이 “EntityManager 연산”으로 변환되는 구간입니다.


호출 흐름 요약

  1. SimpleJpaRepository가 저장소 메서드를 처리합니다.
  2. 단건 조회라면 entityManager.find(...)를 호출합니다.
  3. 배치 연산이라면 entityManager.createQuery(...)를 호출할 수 있습니다.
  4. 이후 Hibernate 구현이 실제 JDBC 실행 단계로 내려갑니다.

호출 흐름 다이어그램

sequenceDiagram participant Repo as SimpleJpaRepository participant EM as EntityManager participant Hibernate Repo->>EM: find(domainType, id) Repo->>EM: createQuery(...) EM->>Hibernate: provider implementation

핵심 코드

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

코드 해설

SimpleJpaRepository는 저장소 추상화와 JPA 표준 API 사이의 번역기 역할을 합니다. 이 시점부터는 Spring Data JPA가 아니라 JPA 구현체(Hibernate)가 실제 실행을 이어받습니다.


설계 의도

저장소 패턴은 유지하면서도, 내부적으로는 표준 EntityManager를 사용하기 위한 구조입니다. 그래서 Repository API는 간결하게 유지되고, 실제 영속성 처리는 JPA 구현체에 위임됩니다.


다음 단계 연결

다음 문서 15-J3에서는 Hibernate 내부가 JDBC PreparedStatement.executeQuery()까지 어떻게 내려가는지 봅니다.

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