JPA (Java Persistence API)

  • JPA 는 툴이나 프레임워크가 아니다.
  • 툴이나 프레임워크가 구현할 수 있도록 사용하는 방식을 정의해놓은 기술적 명세, 인터페이스다.
  • JPA 에 대한 구현은 직접 개발자가 할 수 있지만 많은 작업과 시간이 소모되기 때문에 선택할 수 있는 각가의 구현체가 존재한다.
  • 하이버네이트 (Hibernate) 사용한다. 하이버네이트는 JPA 를 가장 성숙(mature) 하게 구현있으며, 유명하고 많이들 사용하는 라이브러리라고 알고 있다.
  • 이클립스 링크 (EclipseLink) 는 이클립스 재단에서 만든 또다른 JPA 구현체이다.
  • JPA 는 자바진영에서 만든 ORM 의 표준 기술이다.

 

ORM (Object Relational Mapping)

  • 객체와 관계와의 설정을 의미
  • 객체지향적인 관점으로 접근해서 객체를 테이블에 맞추는 것이 아닌, 객제와 테이블이 매핑을 이루는 것이다.
  • SQL 쿼리가 아닌 메소드로서 데이터를 조작할 수 있다.

 

Hibernate (하이버네이트)

 

  • 하이버네이트는 ORM 프레임워크이다.
    • 관계형 데이터베이스에 적용될 때 데이터 영속성과 관련이 있다.
  • 하이버네이트는 JPA 기술 스펙을 구현하고 있으며 JPA 인터페이스와 하이버네이트의 구현은 아래 다이어그램으로 표현할 수 있다.

SessionFactory (org.hibernate.SessionFactory)

  • Thread-safe & immutable
  • org.hibernate.Session 인스턴스의 팩토리로서 동작한다.
  • EntityManagerFactory 와 SessionFactory 는 동일한 구현을 하고 있다.
  • SessionFactory 는 생성 시 비용이 크기 때문에 애플리케이션은 단 하나만의 SessionFactory 만을 가진다.
  • SessionFactory 는 하이버네이트 내에서 사용되는 모든 Session (2차 수준의 캐시, 커넥션 풀, 트랜잭션 시스템 등) 에서 지속된다.

Session (org.hibernate.Session)

  • 싱글스레드이며 수명이 짧다.
  • 하나의 작업 단위이다.
  • Session 은 EntityManager 로 표현되고 있다.
  • Hibernate 의 Session 은 java.sql.Connection 으로 래핑되어 있으며 org.hibernate.Transaction 인스턴스의 팩토리로 동작하고 있다. 
  • persist context 를 유지하고 관리한다.

Transaction

  • 개별적인 트랜잭션들의 경계를 구분하기 위해서 사용되는 객체

 

EntityManagerFactory & SessionFactory 코드 일부

 

☞ EntityManagerFactory :: JPA (Java Persistence API)

package javax.persistence;

import java.util.Map;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.metamodel.Metamodel;

public interface EntityManagerFactory {
    EntityManager createEntityManager();

    EntityManager createEntityManager(Map var1);

    EntityManager createEntityManager(SynchronizationType var1);

    EntityManager createEntityManager(SynchronizationType var1, Map var2);

    CriteriaBuilder getCriteriaBuilder();

    Metamodel getMetamodel();
    
    /** 생략 **/
    
}

☞ EntityManager :: Hibernate

package org.hibernate;

import java.io.Closeable;
import java.io.Serializable;
import java.sql.Connection;
import java.util.Map;
import java.util.Set;
import javax.naming.Referenceable;
import javax.persistence.EntityManagerFactory;
import org.hibernate.boot.spi.SessionFactoryOptions;
import org.hibernate.engine.spi.FilterDefinition;
import org.hibernate.jpa.HibernateEntityManagerFactory;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.metadata.CollectionMetadata;
import org.hibernate.stat.Statistics;

public interface SessionFactory extends EntityManagerFactory, HibernateEntityManagerFactory, Referenceable, Serializable, Closeable {
    SessionFactoryOptions getSessionFactoryOptions();

    SessionBuilder withOptions();

    Session openSession() throws HibernateException;

    Session getCurrentSession() throws HibernateException;

	/** 생략 **/

}

 

Spring Data JPA

  • JPA 에 대해 레파지토리를 제공하고 있다.
    • 레파지토리 인터페이스를 제공해줌으로써, 사용자는 레파지토리 인터페이스 규약에 맞는 메소드를 실행할 수 있다. 해당 메소드 실행을 통해 쿼리를 DB 에 전달할 수 있다.
    • Sping Data 가 JPA 를 추상화했다는 것은 Spring Data JPA 의 레파지토리의 구현에서 JPA 를 사용하고 있다는 것이다.
  • 애플리케이션을 개발함에 있어서 JPA Data sources 에 쉽게 접근할 수 있도록 적용되었다.
  • JPA Entity 에 대한 Create/ Read/ Update/ Delete 메소드 구현
  • Query Method 를 통한 동적 쿼리 생성
  • 기타 등등

스프링 데이터 JPA 의 인터페이스 구성은 아래와 같다. 구분하는 영역이 다르다.

  • Spring Data
    • Repository (interface)
    • CrudRepository (interface)
    • PagingAndSortingRepository (interface)
  • Spring Data JPA
    • Jpa Repository (interface)

 

 

reference

https://www.baeldung.com/jpa-hibernate-difference#implementations

http://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#preface

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

Posted by doubler
,