JPA
Java Persistence API의 약자.
Java ORM 기술에 대한 표준 명세로, Java에서 제공하는 API이다.
Java 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
- JPA는 인터페이스이다! 특정 기능을 하는 라이브러리가 아니다. 어떻게 관계형 데이터베이스를 사용해야 하는지를 정의한 단순한 명세이다.
- 스프링 PSA에 의해서(POJO를 사용하면서 특정 기술을 사용하기 위해서) 표준 인터페이스를 정해두었는데, 그 중 ORM을 사용하기 위해 만든 인터페이스가 JPA이다.
- 기존 EJB에서 제공되던 Entity Bean을 대체하는 기술이다.
Hibernate
Hibernate는 JPA의 구현체의 한 종류아디.
- JPA는 관계형 데이터베이스와 자바 객체를 매핑하기 위한 인터페이스(API)를 제공하고 JPA 구현체(Hibernate)는 인터페이스를 구현한 것이다.
- JPA와 Hibernate는 마치 자바의 interface와 해당 interface를 구현한 class와 같은 관계이다.
- Hibernate 외에도 EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있다.
Spring Data JPA
Spring Data JPA는 Spring Framework에서 제공하는 모듈 중 하나로, 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다.
- Hibernate와 같은 구현체들을 좀 더 쉽게 사용할 수 있도록 추상화한 것 이다.
- JPA를 한 단계 추상화시킨 Repository 인터페이스를 제공한다.
- 개발자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.
- Hibernate와 Spring Data JPA를 사용하는 데에는 사실 큰 차이가 없지만 Spring Data JPA가 권장되는 이유는 크게 두 가지이다.
- 구현체 교체의 용이성
- 자바의 Redis 클라이언트가 Jdis에서 Lettuce로 대세가 넘어갈 때 Spring Data Redis를 사용하면 아주 쉽게 교체가 가능했다.
- 저장소 교체의의 용이성
- Spring Data JPA, Spring Data MongoDB, Spring Data Redis등 Spring Data의 하위 프로젝트들은 findAll(), save()등을 동일한 인터페이스로 가지고 있기 때문에 저장소를 교체해도 기본적인 기능이 변하지 않는다.
📗참고