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 : 정렬 조건 정의