개발 이론/JPA

[JPA] JPA 와 Hibernate , Spring Data JPA

dal_been 2023. 11. 10. 13:31
728x90

JPA를 공부하다보니 Hibernate라는 개념이 자주 나왔다. 예전에는 아 그냥 JPA하면 Hibernate라는 개념이 쓰이는 구나 했지만

요즘은 하나를 공부해도 해당 클래스의 시작점을 보고 싶다. 그래서 JPA와 Hibernate에 대해 공부하게 되었다

 

 

JPA는 기술 명세이다

 

자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스 

 

여기서 인터페이스라는 점을 주목해야한다. 특정기능을 하는 라이브러리가 아니라 관계형 데이터베이스를 어떻게 사용해야하지는 정의하는 하나의 방법인 것이다.

 

JPA를 정의한 javax.persistence 패키지를 보면 Interface, enum, exception,annotaion등 다양한 것들로 구성되어있다

 

 

그렇다면 Hibernate는 무엇이냐?

 

JPA의 명세 구현체이다. 즉 인터페이스를 구현한 클래스인 것이다

 

 

위 사진은 JPA와 Hibernate의 상속 및 구현 관계를 나타낸 것이다.

JPA의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction을 Hibernate가 각각 SessionFactory, Session, Transaction으로 상속받고 각각 Impl로 구현하고 있다

 

그래서 사실 Hibernate를 JPA를 사용하기 위해서 사용할 필요는 없다. EclipseLink와 같이 다른 JPA 구현체를 사용해도되고 내가 직접 구현해도 된다. 다만 Hibernate자체가 이미 성숙한 라이브러리이기 때문에 직접구현까지는 하지 않아도 된다

 

 

그럼 Hibernate를 사용하는 이유가 무엇일까?

  • sql를 직접 사용하지 않고 메소드 호출만으로 쿼리가 수행된다 -> 생산성이 높다
  • 객체 지향적이라 객체에 집중하여 개발이 가능하다
  • 특정 벤더에 종속적이지 않다 -> 여러 DB(MySql,Oracle등)벤더가 존재하는데 JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 어느 DB를 사용하고 있는지만 알려주면 얼마든지 DB를 변경할 수 있다

다만 진입장벽이 존재한다. 메서도호출로 내부에 많은 동작이 수행중이고, 객체간의 매핑이 잘못되면 의도치않은 동작을 할 수 있다.

또한 복잡한 통계쿼리를 메서드로 호출하는 것은 힘들다(이때는 JPQL을 사용한다)

 

 

 

spring data jpa 는 Jpa를 편리하게 사용하기 위한 모듈이다

 

원래 JPA를 사용하려면 EntityManager를 주입받아 상속하지만 

Spring Data JPA는 JPA를 한단계 추상화 시킨 Repository라는 인터페이스를 제공함으로써 이루어진다. 

추상화했다?는 Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다는 것이다

 

쉽게 말해 Spring Data JPA 는 JPA기반 애플리케이션 개발을 보다 쉽게 만들기 위해 JPA위에 추가적인 기능과 추상화를 제공하는 라이브러리/ 프레임 워크 인것이다.