Spring에서 JPA를 사용할 때 JPA의 구현체들인 Hibernate, EclipseLink, DataNucleus를 직접 다루는 것이 아니다.
이 구현체들을 좀 더 쉽게 사용하고자 추상화시킨 스프링에서 개발한 라이브러리로 Spring에서 JPA를 더 편리하게 사용할 수 있게 도와준다.
Build.graldle에 implementation ‘org.springframework.boot:spring-boot-starter-data-jpa’ 추가
JpaRepository<> 인터페이스만 상속받으면 스프링 데이터가 JPA가 프록시 기술을 사용해서 구현 클래스를 대신 만들어주고, 만든 구현 클래스의 인스턴스를 만들어서 스프링 빈으로 등록한다.
Spring Data JPA는 인터페이스에 메서드만 적어두면, 메서드 명을 분석해서 JPQL 쿼리를 자동으로 만들고 실행하는 기능을 제공한다.
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}
다음과 같은 3가지 요소를 규칙에 따라 결합된 메서드 이름을 Repository 인터페이스에 선언하면 자동구현이 가능하다.
쿼리 메서드 기능이 아니라 직접 JPQL을 사용하고 싶을 때는 @Query와 함께 JPQL을 작성할 수 있다.
이때 메서드 이름으로 실행되는 규칙은 무시된다.
public interface SpringDataJpaItemRepository extends JpaRepository<Item, Long> {
//쿼리 메서드 기능
List<Item> findByItemNameLike(String itemName);
//쿼리 직접 실행
@Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);
}
이와 같이 JPQL 쿼리 문법으로 작성하고 파라미터로 넘기는 필드는 @Param 어노테이션으로 매칭시켜줘야 한다.