Defining Query Methods

2024. 10. 19. 19:20Spring Boot/Spring Data JPA

Spring Data에서는 리포지토리 프록시를 통해 메서드 이름을 기반으로 데이터 저장소에 맞는 쿼리를 생성하는 두 가지 주요 접근 방식을 제공합니다. 아래에 각 접근 방식에 대한 상세한 설명을 제공합니다.

1. 메서드 이름에서 쿼리 파생

직접적인 메서드 이름 파생

이 접근 방식에서는 Spring Data가 리포지토리 인터페이스의 메서드 이름을 분석하여 자동으로 쿼리를 생성합니다. 리포지토리에서 메서드를 정의할 때, Spring Data는 메서드 이름을 분석하여 실행할 적절한 쿼리를 생성합니다.

작동 방식:

  • 명명 규칙: 메서드 이름은 공통 작업(예: find, read, delete 등)과 필터링 기준(예: 속성 이름)으로 구성된 키워드를 사용하여 형성됩니다.
    • findByLastName(String lastName)은 특정 성(last name)을 가진 모든 엔티티를 검색하는 쿼리로 변환될 수 있습니다.
    • countByAgeGreaterThan(int age)는 지정된 값보다 나이가 많은 엔티티의 수를 계산하는 쿼리를 생성할 수 있습니다.
  • 예를 들어:
    • 쿼리 생성: Spring Data는 리플렉션과 명명 패턴을 사용하여 메서드 시그니처와 일치하는 쿼리를 작성하고, 이를 데이터 저장소에 대
      해 실행합니다.
    • 제한 사항: 이 접근 방식의 효과는 데이터 저장소의 기능에 따라 다릅니다. 예를 들어, 모든 쿼리가 파생될 수 있는 것은 아니며,
      특정 복잡한 쿼리는 메서드 이름을 통해 직접적으로 지원되지 않을 수 있습니다.

2. 수동 쿼리 정의 사용

수동 쿼리 정의

메서드 이름으로 원하는 쿼리를 충분히 표현할 수 없는 경우나, 명명 규칙으로는 표현할 수 없는 더 복잡한 쿼리를 위해 @Query 어노테이션을 사용하여 쿼리를 명시적으로 정의할 수 있습니다.

작동 방식:

  • @Query 어노테이션: 리포지토리 메서드에 @Query를 사용하여 사용자 정의 쿼리를 지정할 수 있습니다. 이 쿼리는 JPQL (Java Persistence Query Language) 쿼리, SQL 쿼리(관계형 데이터 저장소의 경우), 또는 데이터 저장소가 지원하는 네이티브 쿼리일 수 있습니다.
  • 예를 들어
  • @Query("SELECT u FROM User u WHERE u.age > :age") List<User> findUsersOlderThan(@Param("age") int age);
  • 유연성: 이 방법은 쿼리를 실행할 때 더 많은 유연성과 제어를 제공합니다. 복잡한 조인, 서브쿼리, 또는 데이터 저장소의 특정 기능을 사용할 수 있습니다.
  • 호환성: 수동으로 정의한 쿼리의 특정 구문과 기능은 사용하는 데이터 저장소에 따라 다릅니다(JPA, MongoDB 등).

쿼리 생성 전략

어떤 접근 방식을 사용할지 결정하기 위해 Spring Data는 여러 요소를 고려하는 전략을 사용합니다:

  • 메서드 명명 패턴: 먼저 메서드 이름이 쿼리로 변환될 수 있는 인식 가능한 패턴을 따르는지 확인합니다.
  • 쿼리의 복잡성: 단순 쿼리의 경우 메서드 이름 파생을 선호합니다. 반면에 복잡하거나 사용자 정의 요구 사항이 있는 경우에는 수동 쿼리가 사용됩니다.
  • 데이터 저장소 기능: 이 전략은 특정 데이터 저장소의 기능과 제한 사항도 고려하여 쿼리 생성 방식을 조정합니다.

Spring Data는 메서드 이름 파생과 수동 쿼리 정의를 통해 쿼리를 생성하는 강력한 추상화를 제공합니다. 이러한 이중 접근 방식은 개발자가 단순 쿼리에 대해 메서드 이름의 간편함을 활용하면서도 필요할 때 사용자 정의 쿼리를 작성할 수 있는 유연성을 제공합니다. 이러한 옵션 간의 선택을 최적화하기 위해 Spring Data는 특정 사용 사례와 기본 데이터 저장소의 기능에 따라 쿼리 생성을 조정하는 전략을 사용합니다.

 

'Spring Boot > Spring Data JPA' 카테고리의 다른 글

Query Creation  (0) 2024.10.19
Query Lookup Strategies  (0) 2024.10.19
Persisting Entities  (0) 2024.10.19
Configuration  (3) 2024.10.19
Defining Repository Interfaces  (0) 2024.10.19