Spring

[Spring] JPA, Hibernate 설명

오잎 클로버 2022. 2. 4. 10:10
728x90

JPA, Hibernate, Spring Data JPA 이 3가지에 대해서 다소 헷갈리는 점들이 있어서 포스트하고자 했다.

 

먼저 JPA는 Java Persistence API의 약자로 자바 어플리케이션에서

관계형 DB를 사용하는 방식을 정의한 인터페이스이다.

즉, 라이브러리가 아닌 인터페이스이다.

 

간혹 JPA와 관련한 오류를 발생하게 되면 EntityManager와 관련한 오류가 발생하는 경우가 종종 있는 데

이때, EntityManager의 역할이 문뜩 궁금해져서 찾아보니

  • 엔티티들을 관리한다.
  • 내부에는 영속성 컨테이너가 있어, 이를 통해 엔티티 관리
  • 여러 엔티티 메니저가 하나의 영속성 컨테이너 공유 가능
  • Thread-safe 보장

그리고 CRUD (Create, Read, Update, Delete)의 역할을 처리한다고 한다.

 

그럼 일종의 의문이 생기는 것이 Spring에서 Repository를 사용한 경우는 많이 보았지만

EntityManager를 직접 사용한 경우는 왜 많이 없는 것일까?

그이유는 생각보다 간단했다.

 

Spring-Data JPA에서 제공하는 모듈인 Repository를 사용하기 때문이다.

이는 기존 JPA를 쓰기 편하게 만들어놓은 모듈이고

Repository는 기존 JPA를 한 단계 더 추상화시킨 인터페이스이다.

한 단계 더 추상화했다는 의미는 Repository의 구현을 JPA를 사용하고 있다는 의미이다.

즉, EntityManager는 JPA의 핵심이고, Repository는 JPA를 사용하기 때문에 내부적으로 EntityManager를 사용하고 있다는 의미이므로 앞서 설명한 오류가 발생했을 때 EntityManager 오류도 같이 발생한다.

 

그리고 Repository인터페이스에 정해진 규격대로 메소드를 입력해주면 Spring이 알아서 해당 메소드 이름에

적합한 쿼리를 날리는 구현체를 만들어 Bean에 등록해줍니다.

 

Hibernate, 위 내용과 같이 뒤섞이자 머리가 어떻게 되버리는 줄 알았다.

먼저 Hibernate는 JPA의 구현체입니다.

그리고 JDBC API를 내부적으로 사용하는 ORM(관계 객체 매핑) 프레임워크입니다.

필자는 위 말을 잘 이해하지 못해 JPA를 사용하려면 무조건 Hibernate를 사용해야하는 줄 알았으나

JPA의 구현체이니, 반드시 사용할 필요없다는 의미였다.

그렇기에 DataNucleus, EclipseLink 등 여러 다른 구현체를 사용할 수도 있고

본인이 직접 구현체를 만들어도 된다.

(단지 Hibernate가 굉장히 강력한 프레임워크 중 하나라고 많이들 생각하기에 사용한 것이었다. [추측])

 

Hibernate에 대한 더 많은 정보는 하단에 위치되어있다.

Hibernate-더-많은-정보

특히 JPA와 Spring Data JPA는 똑같이 JPA가 들어가서 처음 접하는 사람은 상당히 헷갈릴 수 있을 것 같다.

이 세 개념의 차이점을 정확히 인지하고 숙지하고 있으면 개발이 한층 편해질 것 같다.

 

이상입니다.

'Spring' 카테고리의 다른 글

[Spring] Spring Context 설명  (0) 2022.02.13
[Spring] Bean 추가 설명  (0) 2022.02.06
[Spring] Hibernate 설명  (0) 2022.02.03
[Spring] Spring MVC 설명  (0) 2022.02.01
[Spring] 빈 (Bean) 설명  (0) 2022.01.31