12.4 쿼리 메소드 기능

  • 스프링 데이터 JPA의 마법같은 기능.
  • 메소드 이름 만으로 쿼리를 생성하는 기능이 있다.

인터페이스 메소드만 선언하면 메소드 이름으로 JPQL 쿼리를 생성해서 실행.

◉ 스프링 데이터 JPA가 제공하는 쿼리 메소드 기능 3가지

  • 메소드 이름으로 쿼리 생성
  • 메소드 이름으로 JPA NamedQuery 호출
  • @Query 어노테이션을 사용해서 Repository 인터페이스에 쿼리 직접 정의

12.4.1 메소드 이름으로 쿼리 생성

정해진 규칙에 따라서 메소드 이름을 지어야 한다.

◉ 관련 메소드 링크

http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html

이메일과 이름으로 회원 조회

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

스프링 데이터 JPA가 메소드를 분석하여 JPQ 생성하고 실행

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

반환 타입

  • 한 건 이상 : 컬렉션 인터페이스 사용
  • 단 건 : 반환 타입을 지정

//컬렉션
List<Member> findByName(String name);   

//단건, 내부 Query.getSingleResult() 호출
//스프링 데이터 JPA는 단건 조회시 예외가 발생하면 무시하고 null 반환
Member findByEmail(String email);

조회 결과가 없는 경우

  • 컬렉션 : 빈 컬렉션
  • 단건 : null

페이징과 정렬

쿼리 메소드는 페이징과 정렬 기능을 사용하도록 2가지 파라미터 제공

  • org.springframework.data.domain.Sort : 정렬기능
  • org.springframework.data.domain.Pageable : 페이징 기능(내부에 Sort 포함)

페이징과 정렬 사용 예제

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

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

List<Member> findByName(String name, Sort sort);

페이지 실행 코드

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

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

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

Pageable과 Page를 사용하면 지루하고 반복적인 페이지 처리를 손쉽게 개발

스프링 MVC에서

스프링 MVC에서 편리하게 사용하도록 HandlerMethodArgumentResolver 제공

@RequestMapping(value = "/members", method = RequestMethod.GET)
public String list(Pageable pageable, Model model) {

    Page<Member> page = memberService.findMembers(pageable);
    model.addAttribute("members", page.getContent());
    return "members/memberList";
}

◉ 기본값 : page = 0, size = 20

- page : 현재 페이지, 0부터 시작
- size : 한 페이지에 노출할 데이터 건 수
- sort : 정렬 조건 정의

results matching ""

    No results matching ""