[자바 표준 ORM JPA]12장 스프링 데이터 JPA

스프링 데이터 JPA 소개

스프링 데이터 JPA는 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원한다. 따라서 데이터 접근 계층을 개발할 때 구현 클래스 없이 인터페이스만 작성해도 개발을 완료할 수 있다.

쿼리 메소드 기능

쿼리 메소드 기능은 스프링 데이터 JPA가 제공하는 마법 같은 기능이다. 스프링 데이터 JPA가 제공하는 쿼리 메소드 기능은 크게 3가지가 있다.

메소드 이름으로 쿼리 생성


public interface MemberRepository extends Repository<Member, Long> {
    List<Member> findByEmailAndName(String email, String name);
}

// select m from Member m where m.email = ?1 and m.name = ?2

메소드 이름으로 JPA NamedQuery 호출

JPA Named 쿼리는 이름 그대로 쿼리에 이름을 부여해서 사용하는 방법인데, 어노테이션이나 XML에 쿼리를 정의할 수 있다.

(실무에서는 잘 안쓰인다고 함)

@Query, 리포지터리 메소드에 쿼리 직접 정의

리포지터리 메소드에 직접 쿼리를 정의하려면 Query 어노테이션을 사용한다. 또한 JPA Named 쿼리처럼 애플리케이션 실행 시점에 문법 오류를 발견할 수 있는 장점이 있다.

  • nativeQuery = true : SQL
  • nativeQuery = false : JPQL

파라미터 바인딩

스프링 데이터 JPA는 위치 기반 파라미터 바인딩과 이름 기반 파라미터 바인딩을 모두 지원한다.

select m from Member m where m.username = ?1 //위치 기반
select m from Member m where m.username = :name //이름기반

벌크성 수정 쿼리

스프링 데이터 JPA에서 벌크성 수정, 수정 삭제 쿼리는 Modifying어노테이션을 사용하면 된다. 벌크성 쿼리를 실행하고 나서 영속성 컨텍스트를 초기화하고 싶으면 @Modifying(clearAutomatically = true)를 사용하면 된다. 기본값을 false이다.

@Modifying
@Query("update Product p set p.price = p.price * 1.1 where
    p.stockAmount < :stockAmount")
int bulkPriceUp(@Param("stockAmount") String stockAmount);

페이징과 정렬

Page를 사용하면 스프링 데이터 JPA는 페이징 기능을 제공하기 위해 검색된 전체 데이터 건수를 조회하는 count 쿼리를 추가로 호출한다.

//count 쿼리 사용
Page<Member> findByName(String name, Pageable pageable);

//count 쿼리 사용 안 함
List<Member> findByName(String name, Pageable pageable);

//페이징 조건과 정렬 조건 설정
PageRequest pageRequest =
    new PageRequest(0, 10, new Sort(Direction.DESC, "name"));

Page<Member> result =
    memberRepository.findByNameStartingWith("김", pageRequest);

List<Member> members = result.getContent (); //조회된 데이터
int totalPages = result.getTotalPages (); //전체 페이지 수
boolean hasNextPage = result .hasNextPage (); //다음 페이지 존재 여부

명세

명세(Specification)를 이해하기 위한 핵심 단어는 술어(Predicate)인데 이것은 단순히 참이나 것으로 평가된다. 그리고 이것은 AND, OR 같은 연산자로 조합할 수 있다. Specification은 컴포지트 패턴으로 구성되어 있어서 여러 Specification을 조합할 수 있다.

Categories:

Updated:

Leave a comment