자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. JPA 는 특정 기능을 제공하는 라이브러리가 아닌 인터페이스
이다.
JPA 는 단순한 기술 명세이기 때문에 구현이 없다. JPA 를 정의한 javax.persistence
패키지의 대부분은 interface, enum, Exception, Annotation 으로 이루어져 있다. 예를 들어, JPA 의 핵심이 되는 EntityManager 는 아래와 같이 javax.persistence.EntityManager 라는 파일에 interface 로 정의되어 있다.
package javax.persistence;
import ...
public interface EntityManager {
public void persist(Object entity);
public <T> T merge(T entity);
public void remove(Object entity);
public <T> T find(Class<T> entityClass, Object primaryKey);
// More interface methods...
}
Hibernate 는 JPA 라는 명세의 구현체이다. 즉, 위에서 언급한 javax.persistence.EntityManager 와 같은 인터페이스를 직접 구현한 라이브러리이다. JPA 와 Hibernate 는 마치 자바의 interface 와 해당 interface 를 구현한 class 와 같은 관계이다.
위 사진은 JPA 와 Hibernate 의 상속 및 구현 관계를 나타낸 것이다. JPA 의 핵심인 EntityManagerFactory
, EntityManager
, EntityTransaction
을 Hibernate 에서는 각각 SessionFactory
, Session
, Transaction
으로 상속받고 각각 -Impl
로 구현하고 있다.
Hibernate 는 JPA 의 구현체일 뿐이므로 다른 구현체를 사용해도 된다. (DataNucleus, EclipseLink 또는 커스텀 등)
Spring Data JPA 는 Spring 에서 제공하는 모듈 중 하나로, 개발자가 JPA 를 더 편하게 사용하도록 도와준다. 이는 JPA 를 한단계 추상화시킨 Repository 라는 인터페이스를 활용하여 이루어진다. 개발자가 Repository 인터페이스에 정해진 규칙대로 메서드를 입력하면, Spring 이 자동으로 메서드 이름을 분석하여 적합한 쿼리를 날리는 구현체(DAO?)를 만들어 Bean 으로 등록한다.
https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/