JPA와 Spring Data JPA 를 학습하면서 둘 간의 명확한 차이점이 뭐지⁉️ 라는 궁금점이 계속 생겼던 것 같습니다. 이번 포스팅에선 JPA와 Spring Data JPA 가 각각 무엇이고 어떤 것을 우리에게 제공해주는지 구분할 수 있도록 하는 것을 목표로 학습해보는 시간을 가져보도록 하겠습니다 😁
일단 Spring Framework
는 엄청나게 거대하고 잘만들어진 프레임워크로 저희같은 개발자들이 어플리케이션을 개발할 때 필요한 수많은 기능들을 제공해줍니다.
수많은 기능들을 제공 ? → 그만큼 알아야할 내용도 많다! → 공부할게 많다!😢
그래서 스프링 프레임워크를 공부하다보면 어 이게 뭐지? 라는 물음을 시작으로 계속 궁금점을 유발하는 것 같습니다.
저번주에는 JPA를 학습하면서, JPA, Hibernate, Spring Data JPA 라는 개념을 짧은 시간에 학습하며 각각의 개념간의 차이점에 대해서 궁금했었습니다. 조금이라도 제대로 알고 사용해야 고수🥷🏻 흉내라도 낼 수 있기에 이번 포스팅을 준비하게 되었습니다.
JPA는 Java Persistence API의 약자로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의하는 인터페이스입니다. 즉, 인터페이스라는 점에서 특정 기능을 수행하는 라이브러리 개념이 아닌 특정한 기술을 명세한 것에 더 가깝다고 볼 수 있습니다. 여기서 특정한 기술이란 위에서 말한 '자바 어플리케이션에서 관계형 데이터베이스를 사용하는 기술'을 의미한다고 볼 수 있습니다.
가) ORM
나) SQL Mapper
javax.persistence
패키지에는 대부분 interface, enum, Exception, Annotation 등을 통해 JPA 를 정의하고 있습니다.
예를 들어서, JPA의 핵심 개념인 EntityManager
는 interface로 정의 되어있습니다.
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...
}
Hibernate
는 JPA 인터페이스의 구현체 입니다. → 라이브러리!(Library)
위 사진처럼 JPA의 핵심 인터페이스인 EntityManagerFactory
, EntityManager
, EntityTransaction
을 Hinbernate 에서 각각 SessionFactory
, Session
, Transaction
으로 상속받고 각각 Impl 로 구현한 것을 확인할 수 있습니다.
Hibernate
는 JPA의 인터페이스를 상속받아 만들어진 구현체라고 학습하였습니다. 이 말은 즉슨, JPA를 사용하기 위해 꼭 Hibernate
를 사용하지 않아도 된다는 말입니다. 하지만‼️ 잘 만들어진 JPA의 구현체인 Hibernate
를 사용하지 않을 이유도 많이 없어 보입니다 😂
Spring Data JPA
는 Spring에서 제공하는 모듈 중 하나로, 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와줍니다. Spring Data JPA
의 핵심은 Repository
입니다.
Repository
: JPA를 한 단계 더 추상화 시킨 인터페이스
Repository
인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring 이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해줍니다.여담:
JPA, Hibernate, 그리고 Spring Data JPA의 차이점
JPA는 도대체 뭘까? (orm, 영속성, hibernate, spring-data-jpa)