개발노트

9. [Spring Boot] 쿼리 메소드 (Repository 안의 메소드명에 따라 쿼리가 달라진다.) 본문

서버 개발/Spring Boot

9. [Spring Boot] 쿼리 메소드 (Repository 안의 메소드명에 따라 쿼리가 달라진다.)

mroh1226 2024. 5. 9. 16:50
반응형

쿼리 메소드.

Spring Data JPA에서 사용할 수 있는 쿼리 메서드의 종류와 각각의 의미를 설명하겠습니다. 쿼리 메서드는 메서드의 이름을 기반으로 Spring Data JPA가 자동으로 쿼리를 생성하여 실행하는 기능을 제공합니다. 아래는 일반적으로 사용되는 쿼리 메서드들과 그 의미를 설명한 것입니다:

  1. 기본 쿼리 메서드:
    • Spring Data JPA는 JpaRepository 인터페이스를 상속받은 Repository에서 기본적인 CRUD(Create, Read, Update, Delete) 기능을 제공합니다. 예를 들어, save, findById, findAll, deleteById 등의 메서드가 포함됩니다.
  2. 조건에 따른 검색 메서드:
    • 엔티티의 특정 필드 값을 기준으로 조건에 따라 검색하는 메서드입니다.
    • 예시:
      • findByFieldName(Type fieldName): 주어진 필드 값과 일치하는 엔티티 검색
      • findByFieldNameAndOtherFieldName(Type fieldName, OtherType otherFieldName): 두 개의 필드 값 조합으로 엔티티 검색
      • findByFieldNameGreaterThan(Type value): 주어진 값보다 큰 필드 값의 엔티티 검색
      • findByFieldNameIn(Collection<Type> values): 주어진 값 목록에 포함된 필드 값의 엔티티 검색
  3. 정렬과 제한 메서드:
    • 검색 결과를 정렬하거나 제한하는 메서드입니다.
    • 예시:
      • findByFieldNameOrderByOtherFieldNameAsc(Type fieldName): 주어진 필드 값을 기준으로 오름차순으로 정렬된 엔티티 검색
      • findFirstByOrderByFieldNameDesc(): 필드 값을 기준으로 내림차순으로 정렬된 첫 번째 엔티티 검색
      • findTop3ByOrderByFieldNameDesc(): 필드 값을 기준으로 내림차순으로 정렬된 상위 3개 엔티티 검색
  4. 네이티브 쿼리 지원:
    • Spring Data JPA는 @Query 어노테이션을 사용하여 네이티브 SQL 쿼리를 직접 정의할 수 있습니다. 이를 통해 복잡한 검색이나 특정 데이터베이스 기능을 활용할 수 있습니다.
  5. 페이징과 정렬 메서드:
    • 검색 결과를 페이징하거나 정렬하는 메서드입니다.
    • 예시:
      • findByFieldName(Pageable pageable): 페이징된 결과 반환
      • findByFieldName(Pageable pageable, Sort sort): 페이징 및 정렬된 결과 반환
  6. 동적 쿼리 메서드:
    • 조건에 따라 쿼리를 동적으로 생성하는 메서드입니다. **Query By Example**이라는 기능을 사용하여 엔티티 객체의 필드 값에 따라 동적으로 쿼리를 구성할 수 있습니다.
  7. 커스톰 쿼리 메서드:
    • @Query 어노테이션을 사용하여 사용자가 직접 정의한 JPQL(Java Persistence Query Language) 쿼리를 실행할 수 있습니다.

이러한 다양한 쿼리 메서드를 활용하여 간단하고 효율적인 데이터 액세스를 구현할 수 있습니다. 메서드명을 적절히 정의하고 명명 규칙을 따르면 Spring Data JPA가 자동으로 쿼리를 생성하여 데이터베이스와 상호작용할 수 있습니다.


findBy로 시작하는 메서드의 명명 규칙.

이 규칙을 따르지 않으면 Spring Data JPA가 메서드를 인식하지 못하고 에러가 발생할 수 있습니다.

  1. 메서드명 구성:
    • findBy 다음에는 엔티티 클래스의 필드 이름이 옵니다. 필드 이름은 카멜 케이스로 작성되어야 합니다.
    • 예를 들어, 엔티티 클래스 **Recipe**가 있다면, findBy 다음에는 해당 엔티티의 필드명이 옵니다. 예를 들어, name, id, category 등이 가능한 필드명입니다.
  2. 조건 표현:
    • 필드 이름 뒤에는 조건을 표현할 수 있습니다. 일반적으로 사용되는 조건 표현은 Equals, IgnoreCase, GreaterThan, LessThan, Like 등이 있습니다.
    • 예를 들어, findByCategory(String category), findByNameAndCategory(String name, String category), findByIdGreaterThan(Long id), findByNameIgnoreCase(String name) 등이 가능한 형태입니다.
  3. 타입 매개변수:
    • 메서드의 매개변수는 해당 필드의 타입과 일치해야 합니다.
    • 예를 들어, findByCategory(String category) 메서드에서 category 매개변수의 타입은 엔티티 클래스의 category 필드의 타입과 일치해야 합니다.
  4. And, Or, In:
    • 여러 필드를 조합하여 검색할 수 있습니다. 필드명 사이에 And, Or 키워드를 사용하여 조건을 결합할 수 있습니다.
    • 예를 들어, findByNameAndCategory(String name, String category), findByCategoryOrDescription(String category, String description) 등이 가능한 형태입니다.
  5. OrderBy:
    • 정렬을 위해 OrderBy 절을 사용할 수 있습니다. 정렬 방향은 필드명 뒤에 Asc 또는 **Desc**를 추가하여 지정합니다.
    • 예를 들어, **findByCategoryOrderByCreatedAtDesc(String category)**와 같이 사용할 수 있습니다.

올바른 명명 규칙을 사용하여 메서드를 정의하면 Spring Data JPA가 자동으로 해당 메서드를 인식하고 실행할 수 있습니다. 하지만 명명 규칙을 지키지 않거나 엔티티 클래스의 필드명과 매개변수 타입이 일치하지 않으면 Spring Data JPA가 메서드를 인식하지 못하고 에러가 발생합니다.

예를 들어, **findByCocktailId(Long cocktailId)**와 같이 메서드를 정의하면 Spring Data JPA는 Cocktail 엔티티의 cocktailId 필드를 사용하여 **cocktailId**를 검색 조건으로 사용할 것으로 예상합니다. 이에 따라 Cocktail 엔티티 클래스에는 cocktailId 필드가 있어야 합니다


쿼리 메서드 형식 설명 예시.

findByFieldName(Type fieldName) 주어진 필드 값과 일치하는 엔티티 검색 findByFirstName(String firstName)
findByFieldNameAndOtherFieldName(Type fieldName, OtherType otherFieldName) 두 개의 필드 값 조합으로 엔티티 검색 findByFirstNameAndLastName(String firstName, String lastName)
findByFieldNameGreaterThan(Type value) 주어진 값보다 큰 필드 값의 엔티티 검색 findByAgeGreaterThan(int age)
findByFieldNameLessThan(Type value) 주어진 값보다 작은 필드 값의 엔티티 검색 findByPriceLessThan(BigDecimal price)
findByFieldNameIn(Collection<Type> values) 주어진 값 목록에 포함된 필드 값의 엔티티 검색 findByCategoryIn(List<String> categories)
findByFieldNameOrderByOtherFieldNameAsc(Type fieldName) 주어진 필드 값을 기준으로 오름차순으로 정렬된 엔티티 검색 findByLastNameOrderByFirstNameAsc(String lastName)
findFirstByOrderByFieldNameDesc() 필드 값을 기준으로 내림차순으로 정렬된 첫 번째 엔티티 검색 findFirstByOrderByCreatedDateDesc()
findTop3ByOrderByFieldNameDesc() 필드 값을 기준으로 내림차순으로 정렬된 상위 3개 엔티티 검색 findTop5ByOrderByScoreDesc()
findByFieldNameIgnoreCase(String value) 대소문자를 무시하고 주어진 값과 일치하는 엔티티 검색 findByLastNameIgnoreCase(String lastName)
findByFieldNameContaining(String keyword) 주어진 키워드를 포함하는 필드 값의 엔티티 검색 findByTitleContaining(String keyword)
findByFieldNameIsNull() 특정 필드 값이 null인 엔티티 검색 findByAddressIsNull()
findByFieldNameNotNull() 특정 필드 값이 null이 아닌 엔티티 검색 findByEmailNotNull()
findByFieldNameTrue() boolean 타입 필드 값이 true인 엔티티 검색 findByActiveTrue()
findByFieldNameFalse() boolean 타입 필드 값이 false인 엔티티 검색 findByDeletedFalse()
findByFieldNameStartingWith(String prefix) 주어진 접두사로 시작하는 필드 값의 엔티티 검색 findByCodeStartingWith(String prefix)
findByFieldNameEndingWith(String suffix) 주어진 접미사로 끝나는 필드 값의 엔티티 검색 findByTitleEndingWith(String suffix)
findByFieldNameContainingIgnoreCase(String keyword) 대소문자를 무시하고 주어진 키워드를 포함하는 필드 값의 엔티티 검색 findByDescriptionContainingIgnoreCase(String keyword)
반응형
Comments