[SPRING] SpringBoot JPA, Spring Data Jpa, Hibernate

[SPRING] SpringBoot JPA, Spring Data Jpa, Hibernate

Last modified on 2025-04-18 , by hjjae2

jpa vs hibernate vs spring data jpa 글을 읽고 이해한 내용 정리해보기


JPA (Java Persisetence API) #

JPA 는 인터페이스(명세)이다. 간단하게 “관계형 데이터베이스 사용을 위한 인터페이스” 이다.

EntityManager 가 바로 JPA 인터페이스의 실물(구현체)이다.

EntityManager 를 살펴보면 관계형 데이터베이스 사용을 위한 기능들이 정의되어 있음을 알 수 있다.

public interface EntityManager {

    /**
     * Make an instance managed and persistent.
     * ...
     */
    public void persist(Object entity);
    
    /**
     * Merge the state of the given entity into the
     * current persistence context.
     * ...
     */    
    public <T> T merge(T entity);

    ...

JPA 의 구현체 #

JPA는 인터페이스라고 했다. 인터페이스이니까 분명 구현체가 존재할 것이다. 그 구현체는 어떤 클래스일까.

그것이 바로 Hibernate 이다. 조금 더 구체적으로는 HibernateSession(SessionImpl) 클래스가 EntityManager 를 구현하고 있다.

클래스의 이름이 Session 이어서 이게 맞나 싶었는데, 블로그 글에서 정확한 그림이 있었다.
참고로 Hibernate 가 아닌 다른 구현체를 사용할 수도 있다. 블로그 글에서는 DataNucleus, EclipseLink 와 같은 구현체들이 있다고 한다.

(Hibernate)Session(SessionImpl) ---> EntityManager

(Hibernate)SessionFactory(SessionFactoryImpl) ---> EntityManagerFactory

(Hibernate)Transaction(TransactionImpl) ---> EntityTransaction

Spring Data JPA #

Spring Data JPA는 JPA를 사용하기 쉽게 만들어 놓은 모듈이라고 한다. 즉, 한단계 더 추상화시켜 개발자가 사용하기 쉽게 만들어놓은 것이다. 우리가 JPA 를 직접적으로 사용했다면 아래와 같이 EntityManager 를 직접적으로 사용했을 것이다.

@Autowired
EntityManager em;

...

public void test() {
    Entity entity = new Entity(...);

    em.persist(entity);

    ...
}

그러나 대부분의 경우에 EntityManager 를 직접적으로 사용하지는 않았을 것이다. 대신 Repository 라는 것을 사용하고 있다.

@Autowired
EntityRepository repo;

...

public void test() {
    Entity entity = new Entity(...);

    repo.save(entity);

    ...
}

" 사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다. "

즉, 우리가 Repository 를 규칙에 맞게 작성하면 Spring은 이 Repository 인터페이스의 구현체를 만들어주고 Bean 으로 등록해준다는 것이다. 또 이 구현체에서는 JPA(EntityManager)를 사용할 것이다.


[Application]

    ↕

[Spring Data JPA]
    JPA
    Hibernate(DataNucleus, EclipseLink, ...)
    JDBC

    ↕

[Database]