[Fast Campus] 한번에 끝내는 Java/Spring : Query Method

Player-Geun·2022년 1월 22일
0

✨ 쿼리메서드의 정의 및 기본실습 (1)

findByName()

동명이인이 있을 경우, 반환값을 User 가 아닌 List<User.>

  • 쿼리메서드의 리턴값은 다양하게 설정 가능 ( ex. Optional, Page, Stream ... )

Naming Rule

find...By, read...By, query...By, get...By 등 모두 동일한 기능, 모두 동일한 쿼리 생성

  • ... 에는 Entity의 이름을 넣을 수 있음 ( Entity 이름이 아니더라도 실행에는 문제 없음 - 식별의 편의성을 위해 지원 )
  • By : Where query 를 생성
  • 쿼리메서드는 테스트 작성을 권장
    👉 네이밍 오류 발생시 컴파일 타임이 아닌 런타임 오류 발생
User findFirst1ByName(String name);
List<User> findFirst2ByName(String name);
List<User> findTop3ByName(String name);
  • First숫자 와 Top숫자 는 동일한 의미 : 만족하는 데이터 중에서 ID 값이 작은 순서 대로 '숫자'의 갯수 만큼 조회
    💥 limit query 생성
  • '숫자' 가 2이상인 경우 return type 을 List<>로 설정

💥 쿼리 메서드에서 지원하지 않는 키워드를 사용하면 그 부분은 무시
ex. findLast1ByName : Last1 이라는 키워드를 지원하지 않기 때문에 findByName 과 동일하게 처리


✨ 쿼리메서드의 정의 및 기본실습 (2)

And & Or

List<User> findByEmailAndName(String email, String name);
// email 과 name 을 모두 만족하는 데이터 조회
List<User> findByEmailOrName(String email, String name);
// email 또는 name, 둘중 하나라도 만족하는 데이터 조회

After & Before

List<User> findByCreatedAtAfter(LocalDateTime yesterday);
// yesterday 이후의 데이터 조회
List<User> findByCreatedAtBefore(LocalDateTime yesterday);
// yesterday 이전의 데이터 조회
  • 해당 지점의 값 포함 x ( 초과, 미만 )
  • '숫자'에 대해서도 After Before 사용 가능 But 날짜와 시간의 데이터에 더 적합
List<User> findByIdAfter(Long id);
// id 값의 초과 데이터 조회

GreaterThan & GreaterThanEqual & Between

List<User> findByCreatedAtGreaterThan(LocalDateTime yesterday);
// 초과
List<User> findByCreatedAtGreaterThanEqual(LocalDateTime yesterday);
// 이상
List<User> findByCreatedAtBetween(LocalDateTime yesterday);
// 양쪽 다 포함 ( 이상 ~ 이하 )

✨ 쿼리메서드의 정의 및 기본실습 (3)

IsNotNull & IsNotEmpty

IsNotEmpty 는 Collection 에만 사용 가능

  • Collection : 순서나 집합적인 저장 공간 ( Set, List )
  • 잘 안쓰임 ( query 도 다름 -> where - exists 인(in)쿼리 )

In & NotIn

List<User> findByNameIn(List<String> names);
//
userRepository.findByNameIn(Lists.newArrayList("martin", "dennis"));
// martin 과 dennis 의 데이터 조회
  • 이 경우보다 다른 쿼리의 결과 값을 받아서 In 절을 활용하는 경우가 더 많음
  • Or 조건과 거의 유사
  • In 절에 너무 많은 데이터가 들어가면 성능 이슈 발생 -> 사전에 얼마나 들어갈지 체크

StartingWith & EndingWith & Containing(Contains)

userRepository.findByNameStartingWith("mar");
userRepository.findByNameEndingWith("tin");
userRepository.findByNameContaining("art");
// 동일
userRepository.findByNameLike("mar%");
userRepository.findByNameLike("%tin");
userRepository.findByNameLike("%art%");
  • 문자열에 대한 쿼리 동작 ( like 검색을 제공 )
  • 3개의 명령은 like 명령을 한번더 매핑한 것

Is

Is = Equals = 아무것도 적지않음

  • findByName = findByNameIs = findByNameEquals

✨ 쿼리메서드로 정렬

OrderBy

List<User> findTop1ByNameOrderByIdDesc(String name);
// 내림차순, 뒤에서 한개 ( Id 기준 )
List<User> findTop2ByNameOrderByIdAsc(String name);
// 오름차순, 앞에서 두개 ( Id 기준 )
List<User> findTop1ByNameOrderByIdDescEmailAsc(String name);
// Id 기준 후 email 기준 ( Id 가 동일한 경우 -> email 기준 )
userRepository.findFirstByName("martin", Sort.by(Order.desc("id")));
  • 인자로 받는 형태

✨ 쿼리메서드로 페이징

Page & Slice

Page

Slice 를 상속받는데, 전체에 대한 정보를 제공

  • Page : 페이징에 대한 응답값, pageable : 페이징에 대한 요청값

Slice

전체의 부분에 대한 정보를 제공


📝 마치며

JPA 의 쿼리 메서드를 다양하게 학습하면서 DB 를 보다 잘 활용할 수 있을 것 같다.

profile
주니어 개발자

0개의 댓글