JPA(Java Persistence API): 기술 명세

자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. 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...
}

EntityManager

Hibernate: JPA 의 구현체

Hibernate 는 JPA 라는 명세의 구현체이다. 즉, 위에서 언급한 javax.persistence.EntityManager 와 같은 인터페이스를 직접 구현한 라이브러리이다. JPA 와 Hibernate 는 마치 자바의 interface 와 해당 interface 를 구현한 class 와 같은 관계이다.

Untitled

위 사진은 JPA 와 Hibernate 의 상속 및 구현 관계를 나타낸 것이다. JPA 의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction 을 Hibernate 에서는 각각 SessionFactory, Session, Transaction 으로 상속받고 각각 -Impl 로 구현하고 있다.

Hibernate 는 JPA 의 구현체일 뿐이므로 다른 구현체를 사용해도 된다. (DataNucleus, EclipseLink 또는 커스텀 등)

Spring Data JPA: JPA 를 편하게 사용하기 위한 모듈

Spring Data JPA 는 Spring 에서 제공하는 모듈 중 하나로, 개발자가 JPA 를 더 편하게 사용하도록 도와준다. 이는 JPA 를 한단계 추상화시킨 Repository 라는 인터페이스를 활용하여 이루어진다. 개발자가 Repository 인터페이스에 정해진 규칙대로 메서드를 입력하면, Spring 이 자동으로 메서드 이름을 분석하여 적합한 쿼리를 날리는 구현체(DAO?)를 만들어 Bean 으로 등록한다.

정리

Untitled

https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/