프로젝트를 시작하여 JPA, Hibernate, Spring Data JPA에 대해 제대로 이해하지 못하고 활용하고 있다는 생각이 들었다. 따라서 이번 기회에 이를 정리해 보고자 한다.
JPA를 이해하기 전 ORM(Object-Relation Mapping)의 개념에 대해 이해할 필요가 있다.
간단히 정리하면 아래와 같은 특징이 있다.
JPA는 Java ORM 기술에 대한 명세이다.
즉, Java 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스로 이해할 수 있다.
특정 기능을 하는 라이브러리가 아니다!
JPA를 사용하기 위해서는 JPA를 구현한 프레임워크(Hibernate나 EclipseLink 등)을 사용해야 한다.
Hibernate는 JPA의 구현체 중 하나이다.
JPA에 정의된 EntityManagerFactory
, EntityManager
, EntityTransaction
과 같은 인터페이스를
Hibernate의 SesscionFactory
, Session
, Transaction
이 상속받고 있는 것을 확인할 수 있다.
Hibernate 내부에서 JDBC API가 동작하고 있어 사용자가 직접 connection을 관리하지 않아도 된다.
Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로 사용자가 JPA를 편하게 사용할 수 있도록 도와준다.
이는 JPA를 추상화한 Repository
라는 인터페이스를 통해 가능하다.
만약 Spring Data JPA 없이 Hibernate만 사용한다면 어떨까?
Hibernate만을 사용한다면 JPA의 영속성을 관리하는 EntityManager를 주입 받아 사용해야한다.
(해당 과정은 이곳에 자세히 나와있다.)
하지만 Spring Data JPA를 활용한다면 훨씬 간편하게 JPA를 사용할 수 있다.
public interface FOODao extends JpaRepository<Foo, Long> {
Foo findByName(String name);
}
(사용 방법은 이곳에 나와있다.)
Spring Data를 사용하면
@Transaction
을 통해 트랜잭션 영역을 선언하고 관리할 수 있다.<참고 자료>
ORM
JPA, Hibernate과 Spring Data JPA
Spring Data JPA와 QueryDSL
<이미지 출처>
JPA 구현 프레임워크
JPA와 Hibernate의 상속관계
Jpa, Hibernate, Spring Data JPA의 상관관계