설정
스프링 데이터 JPA는 spring-boot-starter-data-jpa 라이브러리를 넣어주면 된다.
build.gradle 추가
//JPA, 스프링 데이터 JPA 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
그런데 이미 앞에서 JPA를 설정하면서 spring-boot-starter-data-jpa 라이브러리를 넣어주었다.
여기에는 JPA , 하이버네이트, 스프링 데이터 JPA( spring-data-jpa ), 그리고 스프링 JDBC 관련 기능도 모두 포함되어 있다.
따라서 스프링 데이터 JPA가 이미 추가되어있으므로 별도의 라이브러리 설정은 하지 않아도 된다.
스프링 데이터 JPA 적용
SpringDataJpaItemRepository
package hello.itemservice.repository.jpa;
import hello.itemservice.domain.Item;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface SpringDataJpaItemRepository extends JpaRepository<Item, Long> {
List<Item> findByItemNameLike(String itemName);
List<Item> findByPriceLessThanEqual(Integer price);
//쿼리 메서드(아래 직접 실행과 같은 기능 수행)
List<Item> findByItemNameLikeAndPriceLessThanEqual(String itemName, Integer price);
//쿼리 직접 실행
@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);
}
● 스프링 데이터 JPA가 제공하는 JpaRepository 인터페이스를 인터페이스 상속 받으면 기본적인 CRUD 기능을 사용할 수 있다.
● 그런데 이름으로 검색하거나, 가격으로 검색하는 기능은 공통으로 제공할 수 있는 기능이 아니다. 따라서 쿼리 메서드 기능을 사용하거나 @Query 를 사용해서 직접 쿼리를 실행하면 된다.
여기서는 데이터를 조건에 따라 4가지로 분류해서 검색한다.
● 모든 데이터 조회
● 이름 조회
● 가격 조회
● 이름 + 가격 조회
동적 쿼리를 사용하면 좋겠지만, 스프링 데이터 JPA는 동적 쿼리에 약하다. 이번에는 직접 4가지 상황을 스프링 데이터 JPA로 구현해보자.
그리고 이 문제는 이후에 Querydsl에서 동적 쿼리로 깔끔하게 해결하겠다.
참고
스프링 데이터 JPA도 Example 이라는 기능으로 약간의 동적 쿼리를 지원하지만, 실무에서 사용하기는 기능이 빈약하다. 실무에서 JPQL 동적 쿼리는 Querydsl을 사용하는 것이 좋다.
findAll()
코드에는 보이지 않지만 JpaRepository 공통 인터페이스가 제공하는 기능이다.
모든 Item 을 조회한다.
다음과 같은 JPQL이 실행된다.
select i from Item i
findByItemNameLike()
이름 조건만 검색했을 때 사용하는 쿼리 메서드이다.
다음과 같은 JPQL이 실행된다.
select i from Item i where i.name like ?
findByPriceLessThanEqual()
가격 조건만 검색했을 때 사용하는 쿼리 메서드이다.
다음과 같은 JPQL이 실행된다.
select i from Item i where i.price <= ?
findByItemNameLikeAndPriceLessThanEqual()
가격 조건만 검색했을 때 사용하는 쿼리 메서드이다.
다음과 같은 JPQL이 실행된다.
select i from Item i where i.itemName like ? and i.price <= ?
findItems()
메서드 이름으로 쿼리를 실행하는 기능은 다음과 같은 단점이 있다.
● 1. 조건이 많으면 메서드 이름이 너무 길어진다.
● 2. 조인 같은 복잡한 조건을 사용할 수 없다.
메서드 이름으로 쿼리를 실행하는 기능은 간단한 경우에는 매우 유용하지만, 복잡해지면 직접 JPQL 쿼리를 작성하는 것이 좋다.
● 쿼리를 직접 실행하려면 @Query 애노테이션을 사용하면 된다.
● 메서드 이름으로 쿼리를 실행할 때는 파라미터를 순서대로 입력하면 되지만, 쿼리를 직접 실행할 때는파라미터를 명시적으로 바인딩 해야 한다.
● 파라미터 바인딩은 @Param("itemName") 애노테이션을 사용하고, 애노테이션의 값에 파라미터 이름을 주면 된다.
출처 : 김영환 스프링 DB2 강의
'데이터 접근 기술 > Spring Data JPA' 카테고리의 다른 글
스프링 데이터 JPA 적용2 (0) | 2022.08.21 |
---|---|
스프링 데이터 JPA 주요 기능 (0) | 2022.08.20 |