저번 첫 번째 시간에서는 JPA가 무엇인지 간단하게 알아보는 시간을 가졌다.
이번 시간에는 JPA와 관련된 용어와 전체적인 구조를 짚고 넘어간다.
첫 번째 시간에서 JPA는 인터페이스이고 이를 활용하기 위해서는 구현체가(class)가 필요하다고 언급했다.
그렇다면, JPA 인터페이스를 활용할 수 있도록 구현체 역할을 하는 것은 무엇이 있을까?
구현체 종류에는 Hibernate, EclipseLink, DataNucleus, OpenJPA, ObjectDB, TopLink Essential 와 같은 ORM 프레임워크가 있다.
이 중에서 가장 널리 사용되는 Hibernate에 대해서 공부한다.
Spring Framework에서 제공하는 모듈 중 하나로, JPA를 편리하게 사용할 수 있도록 지원해주는 라이브러리이다.
Spring Data JPA는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스 제공한다.
Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.
package org.springframework.data.jpa.repository.support;
import ...
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
private final EntityManager em;
public Optional<T> findById(ID id) {
Assert.notNull(id, ID_MUST_NOT_BE_NULL);
Class<T> domainType = getDomainClass();
if (metadata == null) {
return Optional.ofNullable(em.find(domainType, id));
}
LockModeType type = metadata.getLockModeType();
Map<String, Object> hints = getQueryHints().withFetchGraphs(em).asMap();
return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));
}
// Other methods...
}
Repository 인터페이스의 기본 구현체인 SimpleJpaRepositroy의 코드를 보면 위와 같이 내부적으로 EntityManager
를 사용하고 있는 것을 볼 수 있다.
JPA, Hibernate, Spring Data JPA의 전반적인 구조를 그림으로 표현한 것이다.