Spring Data JPA 는 JPA 는 공급자(구현체)가 아니다. 단지 쉽게 만들어주는 래퍼일 뿐
공급자는 Hibernate가 기본 공급자(구현)이다.
JPA는 java persistence api 위에 있는 추상화 계층이다.
따라서 JPA Repository 인터페이스 method는 데이터베이스에 직접 연결되지 않는다.
이러한 Repository method 는 먼저 내부적으로 EntityManager method 호출을 하고, EntityManager method가 데이터베이스와 통신한다.
따라서 Repository 는 기본적으로 JPA 인터페이스 또는 API를 기반으로 하는 추상화이다.
JPA API 는 내부적으로 Hibernate Core API 를 호출하고 Hibernate는 기본적으로 method 호출을 기반으로 한 SQl 쿼리를 호출한다.
SQL 쿼리를 실행하면 내부적으로 JDBC 기본 API가 호출된다. 그러면 JDBC 기본 API가 내부적으로 데이터베이스와 통신한다.
Hibernate 내부 JDBC는 데이터베이스와 통신한다. ( SQL 쿼리를 이용 )
Spring data JPA 는 추상화 인터페이스 덩어리일 뿐이다.
hibernate VS Spring Data JPA
JPA 에서 기본적으로 객체 관계형 매핑 기능을 제공한다. 이것은 SQL 문을 생성하는 대신 객체를 관계형 데이터베이스에 직접 유지할 수 있음을 의미한다.
JPA는 껍데기라 직접 구현은 없다. 여기서 등장하는 것이 Hibernate
Hibernate 는 기본적으로 JPA 사양을 구현하는 작업 프레임 워크이다. 따라서 Hibernate는 JPA 구현 제공자이다.
Spring Data JPA 는 JPA 구현에 필요한 Boilerplate 코드의 양을 줄이기 위해 JPA 위에 있는 추상화 계층입니다.
Hibernate internal 은 JDBC를 사용하여 데이터베이스와 통신한다.
데이터베이스와 통신하기 위해 JPA API 와 Hibernate 는 내부 사용자 JDBC를 구현한다.
Hibernate
Hibernate는 애플리케이션 도메인을 매핑하는 프레임워크를 제공하는 Java 기반 볼륨 도구이다
따라서 우리는 Hibernate 프레임워크를 사용하여 애플리케이션 도메인 모델 객체를 관계형 모델 객체에 직접 매핑할 수 있다.
Hibernate 를 사용하여 관계형 데이터베이스 테이블을 직접 유지하고 개체를 지정할 수 있음을 의미한다.
JPA
DAO 레이어를 구현하는 데 필요한 상용구 코드이다.
Spring Framework는 기본적으로 JPA를 기반으로 개발된 Spring 데이터 JPA 모듈을 제공한다.
데이터 액세스 개체 계층을 구현하는 데 필요한 상용구 코드의 양을 줄여준다.
Spring-Boot-Starter-Data-Jpa 는 기본 JPA 공급자(구현체)로 Hibernate를 사용한다.
Spring Data Jpa 를 사용하려면 JPA 공급자를 하나 사용해야 한다.
Spring Data JPA 는 내부적으로 필요한 모든 라이브러리를 추가하고 호환되는 버전을 관리한다.
https://www.udemy.com/course/building-real-time-rest-apis-with-spring-boot/