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/
'Spring > Spring JPA' 카테고리의 다른 글
20201001 [jpa] JPA N+1 문제를 만들어보고 해결해보기. (수정 2020-10-05) (0) | 2020.10.01 |
---|---|
20190919 [jpa] 스프링 테스트 코드 상에서 DB 에 데이터 적재. (0) | 2019.09.19 |
20190720 [문제해결] Infinite recursion (StackOverflowError) (3) | 2019.07.20 |
20190710 [jpa] JPA 알아보기 03 : TestEntityManager 살펴보기 (수정 20190817) (0) | 2019.07.10 |
20181209 [jpa] JPA 알아보기 01 (수정 20190601) (0) | 2018.12.09 |