- 쿼리 메소드의 정의
- 쿼리 메소드 기본 실습
- 정렬
- 페이징 처리
실제 서비스에서 사용하는 쿼리들은 복잡한 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조건을 생성하는 기본적인 키워드이다.
일반적으로 이야기 하는 것중 왼쪽에서 첫번째 오른쪽에서 첫번째, 앞에서 뒤에서 첫번째 등 여러개중에 한개인것은 순서에 따라 값이 달라진다. 즉 이러한 정렬을 이용하여 원하는 값을 가지고 오는 쿼리 메소드가 있다.
ex) findTopByNameOrderByIdDesc(String name) : 해당 이름에 해당하는 요소들을 id로 내림차순 정렬후에 첫번째 값을 가져온다.
여러개의 정렬기준을 추가하고 싶은 경우 쿼리메소드의 키워드를 사용하는 경우에는 정렬기준을 계속해서 뒤에 추가해주면 된다.
예로 findFirstByNameOrderByIdAscEmailDesc id로 오름차순 ,email로 내림차순 기준이 생성된다.
Sort인자를 받아서 정렬하는 것도 가능하다.
List<User> findFirstByName(String name, Sort sort);
위의 방법처럼 sort인자를 받는 메소드를 선언하여 두고 해당 메소드의 인자로 Sort.by(Sort.Order.desc/asc("필드") 와 같이 정렬기준을 넘길 수 있다. 이 방법을 사용하는 경우 하나의 메소드로 여러개의 정렬기준을 사용할 수 있으며, 정렬 기준이 계속 추가되어도 쉽게 작성이 가능하다. 쿼리 메소드를 사용하는 경우 정렬기준이 추가 될 수록 메소드 이름의 길이가 길어지고 코드의 가독성이 떨어질 수 있지만 sort인자를 받을 경우 코드의 가독성 뿐만 아니라 자유도 측면에서도 효율적이다.
인자로 Pageable 객체를 인자로 받는다. 해당 pageable객체로 pageRequest객체의 of인자로서 size와 page를 넘겨준다. 원하는 size로 잘린 page를 반환한다.
System.out.println("findByNamewithPaging: " + userRepository.findByName("yoojin",PageRequest.of(0,1)).getContent());
반환된 객체는 page<엔티티타입> 객체이다. 다양한 속성을 가지고 있으며, 그중 getContent()는 page안의 요소를 반환한다.