P4-1] Ch 03. QueryMethod 살펴보기

uuuu.jini·2022년 1월 24일
0
post-thumbnail

목차

  1. 쿼리 메소드의 정의
  2. 쿼리 메소드 기본 실습
  3. 정렬
  4. 페이징 처리

github 링크

1. 쿼리 메소드의 정의

실제 서비스에서 사용하는 쿼리들은 복잡한 where 조건을 가지고 있다. 해당 조건을 간단하게 작성하기 위한 기능을 제공해 주는 것이 쿼리 메소드이다. 간단한 만큼 기본적으로 제공하는 키워드 학습이 필요하다.


2. 쿼리 메소드 기본 실습

기본 keyword 종류

참고자료

  • findBy필드명 : 해당 필드명을 By 뒤에 적어주면 그 필드명에 맞는 조건을 찾기 위한 where절이 생성된다. 간단한 예로 User findByName(String name)이라는 메소드를 생성하면, 해당 인자로 들어온 값을 name으로 가지는 entity 를 반환한다.

Return Type : 반환하는 객체의 타입은 굉장히 많으며 우리가 지정해주는 객체타입으로 값을 반환한다. 밑의 사진은 일부이고 굉장히 많은 타입으로 반환이 가능하다.

  • getBy필드명

  • readBy필드명

  • queryBy필드명

  • searchBy필드명

  • streamBy필드명

  • get엔티티명By필드명

    위의 모든 메소드들은 필드명의 조건을 검사하여 지정한 타입으로 entity를 반환하는 메소드로서 모두 동일한 역할을 한다.
    find와 By사이에는 키워드를 지정하거나 엔티티명을 지정할 수 있으며,그 이외의 것일 경우 인식하지 않고 무시하게 된다. 예) findsomethingByName일 경우 something은 무시한다. 위의 코드중 가장 가독성이 높은 것을 지정하여 사용한다. 주로 findBy를 가장 많이 사용한다.

  • ..First<숫자>../..Top<숫자>.. : find와 By사이에 들어가는 키워드로써 여러개의 요소가 반환되는 경우 처음부터 숫자갯수 만큼의 엔티티를 반환하여 준다. 1은 생략이 가능하다.

위의 키워드는 where조건을 생성하는 기본적인 키워드이다.

규칙 Keyword 종류

  • AND / OR : findBy<필드1>And<필드2>, findBy<필드1>Or<필드2>
  • After/Before : findBy<필드>After,findBy<필드>Before 인자로 받은 값보다 크거나 , 작은값 값을 반환해주며, 숫자와 시간(날짜) 모두 가능하지만 주로 시간,날짜에 사용한다.
  • GreaterThan,GreaterThanEqual : 큰값, 크거나 값은값을 반환하며, 숫자,시간 모두 사용이 가능다.
  • LessThan,LessThanEqual: 작은값, 작거나 같은값을 반환하며, 숫자,시간 모두 사용이 가능하다.
  • Between : 인자를 두개를 받아서 해당 인자를 포함하고 사이의 값을 반환한다. 숫자,시간 모두 사용이 가능하다.
  • IsNull,IsNotNull : 해당 필드가 널인값과 널이 아닌 값을 반환한다.
  • IsEmpty,IsNotEmpty : collection property에서만 사용이 가능하며 해당 collection이 빈값과 비어있지 않은 값을 반환한다.
  • True,False
  • In,NotIn : 인자로 받은 이터러블 내에 포함되어있는 값, 포함되어있지 않는 값을 반환한다.
  • Containing,StartingWith,EndingWith,Like : 문자열에 대한 like쿼리를 제공한다. ( 각 이름과 같은 기능을 제공한다.)
  • Is,Equals,(or no Keyword) : 특별한 역할을 하지 않으며 코드의 가독성을 높이기 위해 사용한다.

3. 정렬

일반적으로 이야기 하는 것중 왼쪽에서 첫번째 오른쪽에서 첫번째, 앞에서 뒤에서 첫번째 등 여러개중에 한개인것은 순서에 따라 값이 달라진다. 즉 이러한 정렬을 이용하여 원하는 값을 가지고 오는 쿼리 메소드가 있다.

OrderBy<필드><정렬순서>

ex) findTopByNameOrderByIdDesc(String name) : 해당 이름에 해당하는 요소들을 id로 내림차순 정렬후에 첫번째 값을 가져온다.
여러개의 정렬기준을 추가하고 싶은 경우 쿼리메소드의 키워드를 사용하는 경우에는 정렬기준을 계속해서 뒤에 추가해주면 된다.
예로 findFirstByNameOrderByIdAscEmailDesc id로 오름차순 ,email로 내림차순 기준이 생성된다.

Sort인자를 받아서 정렬하는 것도 가능하다.

List<User> findFirstByName(String name, Sort sort); 

위의 방법처럼 sort인자를 받는 메소드를 선언하여 두고 해당 메소드의 인자로 Sort.by(Sort.Order.desc/asc("필드") 와 같이 정렬기준을 넘길 수 있다. 이 방법을 사용하는 경우 하나의 메소드로 여러개의 정렬기준을 사용할 수 있으며, 정렬 기준이 계속 추가되어도 쉽게 작성이 가능하다. 쿼리 메소드를 사용하는 경우 정렬기준이 추가 될 수록 메소드 이름의 길이가 길어지고 코드의 가독성이 떨어질 수 있지만 sort인자를 받을 경우 코드의 가독성 뿐만 아니라 자유도 측면에서도 효율적이다.


4. 페이징 처리

인자로 Pageable 객체를 인자로 받는다. 해당 pageable객체로 pageRequest객체의 of인자로서 size와 page를 넘겨준다. 원하는 size로 잘린 page를 반환한다.

 System.out.println("findByNamewithPaging: " + userRepository.findByName("yoojin",PageRequest.of(0,1)).getContent()); 

반환된 객체는 page<엔티티타입> 객체이다. 다양한 속성을 가지고 있으며, 그중 getContent()는 page안의 요소를 반환한다.

profile
멋쟁이 토마토

0개의 댓글