본문 바로가기

Java/Java JPA

JPA 에서 사용하는 쿼리 메소드 정리 모음집

*기본 설정 관련은 https://whererufromdevelop.tistory.com/3

  다음 편은  https://whererufromdevelop.tistory.com/5<<- 해당 내용 봐주시면 감사하겠습니다

 

*Java20 기준입니다

 

안녕하세요 오늘 JPA에서 사용하는 다양한 쿼리 메소드 들을 찾아보려고 합니다

 

저는 쿼리 메소드를 공부하면서 신기 했던 부분이 보통은 변수나 메소드, 클래스 이름이 작동에 영향을 주지는 않습니다

 

그러나 쿼리 메소드는  신기하게도 제목 키워드를 지원하기 때문에 메소드 명이 추후에 메소드에 다른 영향을 끼칠 수도 있습니다

 

따라서 내가 쓴 제목에 오타가 있는지 없는지 잘 봐야 할 것 같다는 생각이 들었습니다

 

먼저 제가 사용할 테이블에 repository 인터 페이스를 만들어주시고 JpaRepository를 상속 받았습니다 

- JpaRepository에 보시면 T와 ID 값을 작성하라고 나와 있는데 T에는 제가 사용할 테이블 이름 클래스를, ID에는 제가 테이블에 지정해둔 @Id 어노테이션이 붙은 변수의 타입을 작성해주시면 됩니다

 

package com.example.myjpa.repository;

import com.example.myjpa.domain.Users;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepositoryTemp extends JpaRepository<Users, Long> {
}

저는 Users라는 클래스와 Users 안에 있는 클래스의 @Id 어노테이션이 있는 변수의 타입이 Long이므로 위와 같이 작성했습니다

 

그럼 해당 인터페이스에 사용할 쿼리 메소드를 작성해주시면 됩니다

 

우선 가장 기본적인 쿼리 메소드 목록입니다

키워드 설명
find…By, read…By, get…By, query…By, search…By_stream…By 일반적으로 리포지토리 유형, Collection또는 하위 Streamable유형 또는 와 같은 결과 래퍼 또는 기타 매장별 결과 래퍼를 반환하는 일반 쿼리 메서드입니다. 로 사용 하거나 추가 키워드와 함께 사용할 수 있습니다 .PageGeoResultsfindBy…findMyDomainTypeBy…
exists…By 프로젝션이 존재하며 일반적으로 boolean결과를 반환합니다.
count…By 숫자 결과를 반환하는 카운트 프로젝션입니다.
delete…By,remove…By 결과 없음( void) 또는 삭제 횟수를 반환하는 삭제 쿼리 메서드입니다.
…First<number>…,…Top<number>… 쿼리 결과를 첫 번째 <number>결과로 제한합니다. find이 키워드는 (및 다른 키워드) 및 사이의 제목 위치에 나타날 수 있습니다 by.
…Distinct… 고유한 결과만 반환하려면 고유 쿼리를 사용하십시오. 해당 기능이 지원되는지 여부는 상점별 문서를 참조하십시오. find이 키워드는 (및 다른 키워드) 및 사이의 제목 위치에 나타날 수 있습니다 by.

역시 제가 공부했을 때 실습했던것 보다 훨씬 많네요

 

기본적으로 find...By를 예를 들자면 find(테이블 이름)By(컬럼 이름) 순으로 작성하시면 됩니다

 

내가 만약에 Users라는 테이블에서 name으로 찾고 싶다 라고 하면

List<Users> findUsersByName(String name);

해당 방법으로 작성해주시면 됩니다

 

여기서 List<>를 사용하는 이유는 그냥 Users를 사용 할 수도 있지만 중복 이름이 있을 경우에는 에러가 발생하기 때문에 이름에 해당하는 모든 정보를 보기 위해서 List<>를 사용했습니다

 

UsersRepository에서 메소드 작성을 완료했다면 테스트를 한번 해봐야겠죠??

 

바로 테스트 함 해보겠습니다

 

테스트에는 여러 방법이 있지만 저는 이번 주제에 맞게 간단하게 로그를 찍어서 테스트를 해봤습니다

@SpringBootTest
public class QueryTest {

    @Autowired
    private UsersRepository usersRepository;
    
    @Test
    public void selectTemp(){

        System.out.println("name" + userRepositoryTemp.findByName("Kim"));
    }
}

 

이런 식으로 간단하게 로그를 찍어서 테스트를 하면???

아래의 그림과 같이 Hibernate에서 SQL 쿼리를 실행시켜주는 것을 확인해 볼 수 있습니다

 

위의 그림을 보니 마치 SQL 문법이 떠오르는 군요

SELECT * FROM Users WHERE name;

MySQL 기준으로 해당 쿼리와 같은 작용을 하는 것을 알 수 있습니다

 

이외에 다른 쿼리들도 위와 같이 제목 키워드를 통해서 작성할 수 있습니다

 

해당 부분에 대해서는 다음 포스팅때 정리해서 작성해보겠습니다

 

감사합니다