JPA repository를 구현하기 위해서 우리는 인터페이스를 생성하고 JPA repository 인터페이스를 확장하기만 하면 된다.
SimpleJpaRepository가 기본 구현 클래스이다. 이는 모든 JPA 저장소 인터페이스 메소드의 구현을 제공한다.
그리고 기본적으로 Transaction annotation을 가지고 있어 Transaction을 지원한다.
우리가 JpaRepository<> 를 extends 받을 때 @Repository를 안 써도 되는 이유는 SimpleJpaRepository가 가지고 있기 때문이다.
public interface ProductRepository extends JpaRepository<Product, Long> {
}
기본적으로 위와 같은 형식으로 구현한다. JpaRepository 내부에 인터페이스가 들어있고 내부적으로 구현은 SimpleJpaRepository 에 되어있어 우리는 간단하게 method를 불러오는 것으로 사용할 수 있다.
save() method 의 경우 내부적으로 entity manager가 제공하는 persist() method 를 사용한다.
그리고 업데이트 작업의 경우 save() 할 때 id값이 이미 있으면 update 가 진행되는데, 내부적으로 merge() method 를 사용한다.
Spring Data JPA 는 JPA 가 제공하는 모든 API 기준을 내부적으로 사용한다.
기본적으로 쿼리 method 를 전달하고 JPA 기준 인스턴스를 생성한다.
그리고 Spring Data JPA 가 이 쿼리 method를 전달하면 기본적으로 이 쿼리 method를 두 개로 나뉜.
첫번째는 주어고 두번째는 서술어이다.
findBy 와 같은 첫 번째 부분, email, name, id 등 컬럼 이름이 기본적으로 서술어 ( 의미, 조건 ) 두 번째이다.
기본적으로 두 번째가 SQL 쿼리에서 바로 where 조건에 추가된다.
다음 기본적으로 JPA는 JPQL 쿼리를 생성한다.
또한 Hibernate와 같은 JPQL 공급자는 이 JPA 쿼리를 sql 쿼리로 변환한 다음 해당 데이터베이스에 대해 실행한.
따라서 Hibernate 또는 EclipseLink 와 같은 JPA 공급자 ( 제공자, 구현체 ) 들이 이 JPQL 번역 ( SQL 쿼리로의 변환 )을 책임진다.
https://www.udemy.com/course/building-real-time-rest-apis-with-spring-boot/