일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Animation
- typescript
- JavaScript
- db
- listview
- Maui
- .NET
- AnimationController
- Flutter
- 자바스크립트
- Binding
- 오류
- 파이어베이스
- HTML
- 플러터
- page
- MVVM
- 리엑트
- MSSQL
- GitHub
- 바인딩
- MS-SQL
- 깃허브
- React JS
- 함수
- 애니메이션
- Firebase
- 마우이
- spring boot
- 닷넷
Archives
- Today
- Total
개발노트
9. [Spring Boot] 쿼리 메소드 (Repository 안의 메소드명에 따라 쿼리가 달라진다.) 본문
서버 개발/Spring Boot
9. [Spring Boot] 쿼리 메소드 (Repository 안의 메소드명에 따라 쿼리가 달라진다.)
mroh1226 2024. 5. 9. 16:50반응형
쿼리 메소드.
Spring Data JPA에서 사용할 수 있는 쿼리 메서드의 종류와 각각의 의미를 설명하겠습니다. 쿼리 메서드는 메서드의 이름을 기반으로 Spring Data JPA가 자동으로 쿼리를 생성하여 실행하는 기능을 제공합니다. 아래는 일반적으로 사용되는 쿼리 메서드들과 그 의미를 설명한 것입니다:
- 기본 쿼리 메서드:
- Spring Data JPA는 JpaRepository 인터페이스를 상속받은 Repository에서 기본적인 CRUD(Create, Read, Update, Delete) 기능을 제공합니다. 예를 들어, save, findById, findAll, deleteById 등의 메서드가 포함됩니다.
- 조건에 따른 검색 메서드:
- 엔티티의 특정 필드 값을 기준으로 조건에 따라 검색하는 메서드입니다.
- 예시:
- findByFieldName(Type fieldName): 주어진 필드 값과 일치하는 엔티티 검색
- findByFieldNameAndOtherFieldName(Type fieldName, OtherType otherFieldName): 두 개의 필드 값 조합으로 엔티티 검색
- findByFieldNameGreaterThan(Type value): 주어진 값보다 큰 필드 값의 엔티티 검색
- findByFieldNameIn(Collection<Type> values): 주어진 값 목록에 포함된 필드 값의 엔티티 검색
- 정렬과 제한 메서드:
- 검색 결과를 정렬하거나 제한하는 메서드입니다.
- 예시:
- findByFieldNameOrderByOtherFieldNameAsc(Type fieldName): 주어진 필드 값을 기준으로 오름차순으로 정렬된 엔티티 검색
- findFirstByOrderByFieldNameDesc(): 필드 값을 기준으로 내림차순으로 정렬된 첫 번째 엔티티 검색
- findTop3ByOrderByFieldNameDesc(): 필드 값을 기준으로 내림차순으로 정렬된 상위 3개 엔티티 검색
- 네이티브 쿼리 지원:
- Spring Data JPA는 @Query 어노테이션을 사용하여 네이티브 SQL 쿼리를 직접 정의할 수 있습니다. 이를 통해 복잡한 검색이나 특정 데이터베이스 기능을 활용할 수 있습니다.
- 페이징과 정렬 메서드:
- 검색 결과를 페이징하거나 정렬하는 메서드입니다.
- 예시:
- findByFieldName(Pageable pageable): 페이징된 결과 반환
- findByFieldName(Pageable pageable, Sort sort): 페이징 및 정렬된 결과 반환
- 동적 쿼리 메서드:
- 조건에 따라 쿼리를 동적으로 생성하는 메서드입니다. **Query By Example**이라는 기능을 사용하여 엔티티 객체의 필드 값에 따라 동적으로 쿼리를 구성할 수 있습니다.
- 커스톰 쿼리 메서드:
- @Query 어노테이션을 사용하여 사용자가 직접 정의한 JPQL(Java Persistence Query Language) 쿼리를 실행할 수 있습니다.
이러한 다양한 쿼리 메서드를 활용하여 간단하고 효율적인 데이터 액세스를 구현할 수 있습니다. 메서드명을 적절히 정의하고 명명 규칙을 따르면 Spring Data JPA가 자동으로 쿼리를 생성하여 데이터베이스와 상호작용할 수 있습니다.
findBy로 시작하는 메서드의 명명 규칙.
이 규칙을 따르지 않으면 Spring Data JPA가 메서드를 인식하지 못하고 에러가 발생할 수 있습니다.
- 메서드명 구성:
- findBy 다음에는 엔티티 클래스의 필드 이름이 옵니다. 필드 이름은 카멜 케이스로 작성되어야 합니다.
- 예를 들어, 엔티티 클래스 **Recipe**가 있다면, findBy 다음에는 해당 엔티티의 필드명이 옵니다. 예를 들어, name, id, category 등이 가능한 필드명입니다.
- 조건 표현:
- 필드 이름 뒤에는 조건을 표현할 수 있습니다. 일반적으로 사용되는 조건 표현은 Equals, IgnoreCase, GreaterThan, LessThan, Like 등이 있습니다.
- 예를 들어, findByCategory(String category), findByNameAndCategory(String name, String category), findByIdGreaterThan(Long id), findByNameIgnoreCase(String name) 등이 가능한 형태입니다.
- 타입 매개변수:
- 메서드의 매개변수는 해당 필드의 타입과 일치해야 합니다.
- 예를 들어, findByCategory(String category) 메서드에서 category 매개변수의 타입은 엔티티 클래스의 category 필드의 타입과 일치해야 합니다.
- And, Or, In:
- 여러 필드를 조합하여 검색할 수 있습니다. 필드명 사이에 And, Or 키워드를 사용하여 조건을 결합할 수 있습니다.
- 예를 들어, findByNameAndCategory(String name, String category), findByCategoryOrDescription(String category, String description) 등이 가능한 형태입니다.
- 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) |
반응형
'서버 개발 > Spring Boot' 카테고리의 다른 글
11. [Spring Boot] DTO 사용하기 (JSON 데이터 커스텀하기) (0) | 2024.05.14 |
---|---|
10. [Spring Boot] Entity 관계 매핑하기(@ManyToOne, @OneToMnay) (0) | 2024.05.13 |
8. [Spring Boot] @ManyToOne 무한재귀 호출 문제 해결하기 (0) | 2024.04.30 |
7. [Spring Boot] PropertyReferenceException 에러 해결 (Java "_" 언더바 인식 못함 문제) (0) | 2024.04.30 |
6. [Spring Boot] application.yml 설정하기 (0) | 2024.04.29 |
Comments