Spring Data Jpa 쿼리 메소드란?
Spring-data-jpa의 JpaRepository는 메소드 이름 규칙에 따라 쿼리를 만들어주는 기능이 있습니다.
쿼리 메소드 기능을 사용해서 AND 조건, OR 조건 등 여러 조건을 사용해서 쿼리를 생성할 수 있습니다.
Spring Data Jpa Query 메소드 공식 문서 바로가기
Entity, 데이터 준비
예시로 사용할 엔티티입니다.
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
@Entity
@Getter
public class TestEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(length = 20)
private String name;
private Integer code;
private LocalDate date;
}
데이터는 이렇게 넣겠습니다.
insert into test_entity(code, date, name)
values
(1000, '2024-01-01', 'name1'),
(2000, '2024-02-01', 'name2'),
(3000, '2024-03-01', 'name3'),
(4000, '2024-04-01', 'name4'),
(5000, '2024-05-01', 'name5');
데이터 준비가 완료되었습니다.
Spring Data Jpa 쿼리 메소드 기본 사용법
Spring Data JPA의 쿼리 메소드는 메소드 이름을 기반으로 쿼리를 자동으로 생성합니다.
다음과 같이 JpaRepository를 상속받은 인터페이스에서 메소드를 정의할 수 있습니다:
import java.time.LocalDate;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
public interface TestRepository extends JpaRepository<TestEntity, Long> {
// 단일 검색
List<TestEntity> findByName(String name);
// 여러 조건 검색(AND)
List<TestEntity> findByNameAndCode(String name, Integer code);
// 여러 조건 검색(OR)
List<TestEntity> findByNameOrCodeOrDate(String name, Integer code, LocalDate date);
}
findBy + 컬럼명을 사용하면 컬럼명과 일치하는 데이터를 찾는 조건을 추가합니다.
조건을 여러개 사용하고 싶다면 AND나 OR로 연결해서 사용하면 됩니다.
쿼리는 다음과 같이 생성됩니다.
// 단일 검색 findByName(String name)
select te1_0.id,te1_0.code,te1_0.date,te1_0.name from test_entity te1_0 where te1_0.name=?
// AND 다중 검색 findByNameAndCode(String name, Integer code)
select te1_0.id,te1_0.code,te1_0.date,te1_0.name from test_entity te1_0 where te1_0.name=? and te1_0.code=?
// OR 다중 검색
select te1_0.id,te1_0.code,te1_0.date,te1_0.name from test_entity te1_0 where te1_0.name=? or te1_0.code=? or te1_0.date=?
Spring Data Jpa 조건 사용 예제
LIKE 조건 사용
List<TestEntity> findByNameContaining(String name);
name 컬럼에 특정 문자열이 포함된 엔티티를 검색합니다.
SQL 쿼리로는 WHERE name LIKE %name%와 같습니다.
BETWEEN 조건 사용
List<TestEntity> findByDateBetween(LocalDate startDate, LocalDate endDate);
특정 날짜 범위 내에 있는 엔티티를 검색합니다.
SQL 쿼리로는 WHERE date BETWEEN startDate AND endDate와 같습니다.
정렬 조건 사용
List<TestEntity> findByNameOrderByCodeDesc(String name);
name 컬럼이 일치하는 엔티티를 code 컬럼을 기준으로 내림차순 정렬하여 검색합니다.
페이징 사용
Spring Data JPA는 페이징 기능도 지원합니다.
페이징과 정렬을 사용하려면 Pageable 인터페이스를 메소드 인수로 추가합니다.
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
public interface TestRepository extends JpaRepository<TestEntity, Long> {
Page<TestEntity> findByName(String name, Pageable pageable);
}
이 메소드는 name 컬럼이 일치하는 결과를 페이징 처리하여 반환합니다.
읽으면 좋은 글
[Java] Spring Jpa Repository 메소드 명명규칙 정리