15-J1. Service → JpaRepository: findById()
서비스가 JPA 저장소를 호출하면, 인터페이스 뒤의 실제 구현은 보통 Spring Data JPA의 SimpleJpaRepository입니다.
이 단계는 서비스가 저장소 추상화를 호출하고, 구현체가 EntityManager를 잡고 다음 단계로 넘길 준비를 하는 구간입니다.
이번 단계의 역할
서비스는 단순히 repository.findById(...) 같은 메서드를 호출합니다.
오픈소스 기준으로는 SimpleJpaRepository가 그 호출을 받아 EntityManager 기반 처리로 연결합니다.
호출 흐름 요약
- 서비스가 저장소 메서드를 호출합니다.
- Spring Data JPA 구현체인
SimpleJpaRepository가 호출을 받습니다. SimpleJpaRepository는 내부에 보관한EntityManager를 사용합니다.- 실제 조회는 다음 단계에서
EntityManager.find(...)또는 쿼리 생성으로 이어집니다.
호출 흐름 다이어그램
sequenceDiagram
participant Service
participant Repo as SimpleJpaRepository
participant EM as EntityManager
Service->>Repo: findById(id)
Repo->>EM: use injected EntityManager
핵심 코드
// SimpleJpaRepository.java
public SimpleJpaRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
this.entityManager = entityManager;
}
public Optional<T> findById(ID id) {
Assert.notNull(id, ID_MUST_NOT_BE_NULL);
Class<T> domainType = getDomainClass();
return Optional.ofNullable(entityManager.find(domainType, id));
}
코드 해설
SimpleJpaRepository는 저장소 인터페이스 뒤에 숨어 있는 실제 구현체입니다.
이 구현체는 직접 DB에 붙지 않고, 항상 EntityManager를 경유해 다음 단계로 넘어갑니다.
설계 의도
서비스는 저장소 인터페이스만 보게 하고, JPA 세부 구현은 SimpleJpaRepository가 담당하게 하기 위한 구조입니다.
덕분에 서비스는 영속성 API 세부사항을 몰라도 됩니다.
다음 단계 연결
다음 문서 15-J2에서는 SimpleJpaRepository가 실제로 EntityManager.find(...) 또는 쿼리 생성 메서드로 어떻게 위임하는지 봅니다.
← 이전: 15. Service → JPA / MyBatis 분기 | 다음: 15-J2. JpaRepository → EntityManager