JPA에서는 데이터베이스와 상호작용하기 위해 SQL 쿼리를 작성하거나, JPQL(Java Persistence Query Language)을 사용해 데이터 조회 및 조작을 수행할 수 있습니다.
그러나 수동으로 쿼리를 작성하는 것은 번거롭고 오류가 발생할 수 있습니다. 이를 해결하기 위해 Spring Data JPA에서는 Query Method라는 강력한 기능을 제공합니다.
Query Method란❓
Query Method는 메서드 이름을 기반으로 자동으로 쿼리를 생성하여 데이터베이스에서 데이터를 조회할 수 있게 해주는 기능입니다.
JpaRepository 인터페이스에서 해당 인터페이스와 매핑되어 있는 테이블에 요청하고자 하는 SQL을 메서드 이름을 사용하여 선언할 수 있으며, 이를 통해 복잡한 JPQL이나 SQL 쿼리문을 작성하지 않고도, 메서드 이름만으로 필요한 쿼리를 쉽게 작성할 수 있습니다.
위와 같이 Query Methods는 개발자가 이미 정의되어있는 규칙에 맞게 메서드를 선언하면 해당 메서드 이름을 분석하여 SimpleJpaRepository에서 구현이 됩니다.
Query Method의 주요 메서드
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
// 이름으로 사용자 검색
List<User> findByName(String name);
// 이메일로 사용자 검색
User findByEmail(String email);
}
findByFieldName : 단순 조건
List<User> findByAge(int age);
findByFieldName 메서드는 User 엔티티에서 나이가 주어진 값과 일치하는 모든 사용자를 조회합니다.
findByFieldNameAndAnotherField : 복합 조건
List<User> findByLastNameAndAge(String lastName, int age);
findByLastNameAndAge 메서드는 성과 나이가 모두 일치하는 사용자를 조회합니다.
findByFieldNameOrderByFieldNameAsc/Desc : 정렬
List<User> findByAgeOrderByLastNameAsc(int age); // 오름차순
List<User> findByAgeOrderByLastNameDesc(int age); // 내림차순
findByFieldNameOrderByFieldNameAsc/Desc메서드는 나이가 주어진 값과 일치하는 사용자들을 성(이름) 순으로 정렬하여 조회합니다.
findByFieldNameContaining : 부분 일치
List<User> findByNameContaining(String substring);
findByFieldNameContaining 메서드는 이름이 주어진 문자열을 포함하는 모든 사용자를 조회합니다.
findByFieldNameIsNull : Null 체크
List<User> findByEmailIsNull();
findByFieldNameIsNull 메서드는 이메일 이 없는 사용자들을 조회합니다.
findByFieldNameNot : 예외적인 조건
List<User> findByAgeNot(int age);
findByFieldNameNot 메서드는 나이가 주어진 값이 아닌 모든 사용자를 조회합니다.
Query Method의 동작 확인
위와 같이 데이터 베이스에 데이터가 존재합니다.
이때 내용(contents)에 특정 키워드가 포함된 메모를 조회하는 API를 구하고자 합니다.
1. Controller를 통해 keyword를 Query String 방식으로 전달받아 메모를 조회하는 API를 추가합니다.
getMemosBykeyword()라는 메서드를 만들고, Query String방식을 사용하기 위해서 @RequestParam 어노테이션을 사용합니다.
@RequestParam 어노테이션은 생략이 가능합니다.
2. MemoService에 getMemosByKeyword 기능을 수행하는 메서드를 구현합니다.
- contents 필드에서 특정 문자열이 포함된 메모를 조회합니다.
- 조회된 결과를 modifiedAt 필드(수정 시간)에 따라 내림차순(Desc)으로 정렬합니다.
3. POSTMAN을 사용해서 테스트 결과를 확인해 보겠습니다.
contentes : 1
contentes : 빵
수정 시간(modifiedAt)을 기준으로 내림차순으로 정렬된 것을 확인할 수 있습니다.
그러면 빵 ➡️ 초코빵으로 변경하면 어떻게 될까요 ❓
수정 시간(modifiredAt)이 변경되면서 수정한 시각이 제일 최신 즉 제일 높은 숫자가 되기 때문에 "초코빵"이 맨 위에 있는것을 확인할 수 있습니다.
'Framework > JPA' 카테고리의 다른 글
[JPA] 비관적 락(Pessimistic Lock)을 통한 동시성 제어 및 업데이트 손실(Lost Update)확인하기 (0) | 2024.08.21 |
---|---|
[JPA] @Lock 어노테이션이란 무엇일까❓: 다양한 LockModeType 잠금 모드 (0) | 2024.08.21 |
[JPA] JPA Auditing란 무엇일까❓(@EnableJpaAuditing, @MappedSuperclass, @EntityListeners) (0) | 2024.07.27 |
[JPA] JPA의 복잡함을 줄이는 Spring Data JPA (0) | 2024.07.27 |
[JPA] 트랜잭션 관리와 영속성 컨텍스트의 관계 (@Transaction, 트랜잭션 전파) (0) | 2024.07.27 |