본문 바로가기

Development/Spring

[Spring] JPQL (JPA Query Language)과 쿼리 메서드

JPQL (JPA Query Language)

JPQL은 JPA Query Language의 줄임말로 JPA에서 사용할 수 있는 쿼리를 의미합니다. JPQL의 문법은 SQL과 매우 유사하여 데이터베이스 쿼리에 익숙하다면 쉽게 사용할 수 있습니다.

SQL과의 차이점은 SQL에서는 테이블이나 칼럼의 이름을 사용하는 것과 달리 JPQL은 엔티티 객체를 대상으로 수행하는 쿼리이기 때문에 매핑된 엔티티의 이름과 필드의 이름을 사용해야 합니다.

SELECT p FROM Product p WHERE p.number = ?1;

위 문장에서 Product는 엔티티 클래스 이름, p.number는 엔티티의 속성입니다.

리포지토리 쿼리 메서드 생성하기

쿼리 메서드는 크게 동작을 결정하는 주제(Subject)와 서술어(Predicate)로 구분합니다. 'find... By', 'exists... By'와 같은 키워드로 주제를 정하며 'By'는 서술어의 시작을 나타내는 구분자 역할을 합니다. 서술어 부분은 검색 및 정렬 조건을 지정하는 영역입니다. 기본적으로 엔티티의 속성으로 정의할 수 있고, AND나 OR를 사용해 조건을 확장하는 것도 가능합니다.

 

리포지토리의 쿼리 메서드 생성 예시

// (리턴타입) + {주제 + 서술어(속성)} 구조의 메서드
List<Person> findByLastNameAndEmail(String lastName, String email);

쿼리 메서드의 주제 키워드

조회 키워드

  • find ~ By: 하나의 엔티티를 조회하는데 사용, 못 찾으면 null 리턴
  • get ~ By: 하나의 엔티티를 조회하는데 사용, 지연 로딩을 사용하여 프록시 객체를 얻음
  • search ~ By: 조건을 정의하여 엔티티들의 리스트를 조회하는데 사용
  • stream ~ By: Stream 타입으로 엔티티들을 조회하는데 사용

exists ~ By

특정 데이터가 존재하는지 확인하는 키워드입니다.

boolean existsByNumber(Long number);

 

count ~ By

조회 쿼리를 수행한 후 쿼리 결과로 나온 레코드의 개수를 리턴합니다.

long CountByName(String name);

 

delete ~ By, remove ~ By

삭제 쿼리를 수행합니다. 

 

~First{number}~, ~Top{number}~

쿼리를 통해 조회된 결괏값의 개수를 제한하는 키워드입니다. 

List<Product> findFirst5ByName(String name);
List<Product> findTop10ByName(String name);

조건자 키워드

Is

값의 일치를 조건으로 사용하는 조건자 키워드입니다. Equals와 동일한 기능을 합니다.

Product findByNumberIs(Long number);
Product findByNumberEquals(Long number);

 

(Is)Not

값의 불일치를 조건으로 사용하는 조건자 키워드입니다.

Product findByNumberIsNot(Long number);
Product findByNumberNot(Long number);

 

(Is)Null, (Is)NotNull

값이 Null인지 검사하는 조건자 키워드입니다.

List<Product> findByUpdatedAtNull();
List<Product> findByUpdatedAtNotNull();

 

 

(Is)True, (Is)False

boolean 타입으로 지정된 칼럼값을 확인하는 키워드입니다.

Product findByisActiveTrue();
Product findByisActiveFalse();

 

And, Or

여러 조건을 묶을 때 사용합니다.

Product findByNumberAndName(Long number, String name);
Product findByNumberOrName(Long number, String name);

(Is)GreaterThan, (Is)LessThan, (Is)Between

숫자나 datetime 칼럼을 대상으로 한 비교 연산에 사용할 수 있는 조건자 키워드입니다. GreaterThan, LessThan 키워드는 비교 대상에 대한 초과/미만의 개념으로 비교 연산을 수행하고, 경곗값을 포함하려면 Equal 키워드를 추가하면 됩니다.

List<Product> findByPriceIsGreaterThan(Long price);
List<Product> findByPriceIsLessThanEqual(Long price);
List<Product> findByPriceIsBetween(Long lowPrice, Long highPrice);

 

(Is)StartingWith(StartsWith), (Is)EndingWith(EndsWith), (Is)Containing(Contains), (Is)Like

칼럼값에서 일부 일치 여부를 확인하는 조건자 키워드입니다. SQL 쿼리문에서 값이 일부를 포함하는 값을 추출할 때 사용하는 % 키워드와 동일한 역할을 하는 키워드입니다.

Containing 키워드는 문자열의 양 끝, StartingWith 키워드는 문자열의 앞, EndingWith 키워드는 문자열의 끝에 %가 배치됩니다.

 List<Product> findByNameStartingWith(String namePrefix); 
 List<Product> findByDescriptionEndingWith(String descriptionSuffix);
 List<Product> findByNameContaining(String nameSubstring);

Like 키워드는 인자로 %를 명시적으로 입력해야 합니다. 

List<Product> findByNameLike(String namePattern); // ex) namePattern = "Appl%"

 

참고

  • 스프링 부트 핵심 가이드 "스프링 부트를 활용한 애플리케이션 개발 실무" , 장정우, 2022

'Development > Spring' 카테고리의 다른 글

[Spring] QueryDSL  (2) 2024.03.01
[Spring] JPA의 정렬과 페이징 처리  (0) 2024.02.29
[Spring] 스프링 부트에서 테스트 코드 작성하기  (0) 2024.02.23
[Spring] Lombok  (0) 2024.02.21
[Spring] OpenSessionInViewFilter  (0) 2024.02.21