본문 바로가기
Learning-log/Spring & JPA

JPA vs Hibernate vs Spring JPA

by why제곱 2024. 5. 9.

지난 프로젝트를 회고하며 JPA에 대한 이해도가 부족한 상태에서 기술만 급하게 사용한 것은 아닌가 하는 반성이 있었다. 따라서 JPA에 대한 이해를 굳건히 하고자, 김영한 강사님의 JPA ORM ㅇㅇ 강의를 다시 수강했다.

해당 강의를 수강하며 거듭 드는 생각은, 내가 프로젝트에서 사용했던 JPA와는 차이가 있었다는 것이다. EntityManager를 통해 entity CRUD를 진행하는 강의와는 달리, 프로젝트에서는 Repositoy 인터페이스를 구현해 활용했기 때문에 이 둘 사이의 어떤 차이가 있는가에 대해 정리하고 넘어가려 한다.

따라서 이번 게시글에서는 JPA, Hibernate, Spring Data JPA에 관하여 다루고, 비교해볼 것이다.

JPA

JPA는 Java Persistence API의 약자이다. 자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스로, 특정 기능을 하는 라이브러리가 아니다. 즉, 자바 애플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 방법 중 하나인 것이다.

단순히 명세인 JPA는 구현체가 없다. 이를 정의한 패키지는 javax.persistence이며 해당 패키지를 살펴보면, interface, enum, Exception, Annotation들로 구성되어 있다. 인프런 강의에서 접한 EntityManager 또한 구현체가 아닌 interface로 정의되어 있다.

그렇다면 이러한 JPA를 구현한 구현체는 없을까?

Hibernate

이를 구현한 구현체가 바로 Hibernate이다. 이 외에도 EclipseLink와 DataNucleus이 있지만, 대부분이 Hibernate를 이용한다. 이 Hibernate가 위에서 JPA가 정의한 인터페이스들을 실질적으로 구현한 라이브러리인 것이다.

출처 : https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/Hibernate_User_Guide.html

 

 

하이버네이트의 공식 문서를 살펴보면 위 사진과 같이 JPA가 구현되어 있음을 확인할 수 있다. JPA를 사용하기 위한 방법이 Hibernate만이 유일한 것은 아니다. 필요하다면 직접 구현하거나, 다른 라이브러리를 사용해도 좋다. 다만, Hibernate가 잘 갖춰져 있기 때문에 일반적으로 많이 이용하는 것 뿐이라고 한다.

Spring Data JPA

이제 마지막으로 Spring Data JPA를 살펴보자. 백엔드로서 프로젝트를 하며 EntityManger를 다루지 않아도 되도록 해준 기술이다. Spring Data JPA는 Spring에서 제공하는 모듈 중 하나이다. 개발자가 JPA를 더 편하게 사용할 수 있도록 도와주는 역할을 한다. JPA를 한 단계 더 추상화 시킨 Repository 인터페이스를 제공하여, 이 인터페이스에 정해진 규칙대로 메소드를 입력하면 쿼리를 직접 지정하지 않아도 메소드 이름에 적합한 쿼리를 날릴 수 있도록 구현체를 만들어 Bean으로 등록해주는 역할을 한다.

즉, Spring Data JPA를 사용하면 직접 EntityManger를 다루지 않지만, 내부적으로 Spring Data JPA가 이를 다뤄주고 있다고 생각하면 된다.