JPA Query Methods :: Spring Data JPA
JPA Query Method
개념
JPA Query Method는 메서드 이름만으로 쿼리를 생성하는 Spring Data JPA의 강력한 기능입니다.
개발자는 메서드의 이름 규칙을 따라 작성하기만 하면, Spring Data JPA가 자동으로 JPQL(Java Persistence Query Language) 쿼리를 생성해 실행합니다.
장점
- SQL 작성 필요 없음: 메서드 이름만으로 쿼리를 작성할 수 있습니다.
- 자동화된 쿼리 생성: Spring Data JPA가 자동으로 JPQL을 생성해줍니다.
- 간결하고 직관적: 쿼리의 목적을 메서드 이름으로 표현하므로 코드의 가독성이 높아집니다.
JPA Query Method 작성 규칙
기본 형식
findBy 또는 readBy, queryBy로 시작하고 필드명을 추가합니다.
예시:
- findBy[Field명]
- findBy[Field명]And[Field명]
- findBy[Field명]Or[Field명]
키워드와 설명
키워드 | 설명 | 예시 |
And | 여러 조건을 AND로 결합합니다. | findByNameAndAge(String name, int age) |
Or | 여러 조건을 OR로 결합합니다. | findByNameOrEmail(String name, String email) |
Between | 값이 특정 범위 사이에 있는 경우 | findByAgeBetween(int start, int end) |
LessThan | 값이 지정된 값보다 작은 경우 | findByAgeLessThan(int age) |
GreaterThan | 값이 지정된 값보다 큰 경우 | findByAgeGreaterThan(int age) |
Like | 특정 패턴과 일치하는 경우 | findByNameLike(String pattern) |
OrderBy | 결과를 정렬합니다. | findByNameOrderByAgeAsc(String name) |
Top/First | 상위 n개의 결과를 가져옵니다. | findTop3ByOrderBySalaryDesc() |
사용 예제
User 엔티티
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
private int age;
// Getters and Setters
}
UserRepository (JpaRepository 상속)
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
// 단일 조건
List<User> findByName(String name);
// AND 조건
List<User> findByNameAndAge(String name, int age);
// OR 조건
List<User> findByNameOrEmail(String name, String email);
// Between 조건
List<User> findByAgeBetween(int start, int end);
// Like 조건
List<User> findByNameLike(String pattern);
// 정렬
List<User> findByNameOrderByAgeAsc(String name);
// Top n
List<User> findTop3ByOrderByAgeDesc();
}
Controller 사용 예
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserRepository userRepository;
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@GetMapping("/findByName")
public List<User> getUsersByName(@RequestParam String name) {
return userRepository.findByName(name);
}
@GetMapping("/findTop")
public List<User> getTop3UsersByAge() {
return userRepository.findTop3ByOrderByAgeDesc();
}
}
Named Query
개념
Named Query는 미리 정의된 쿼리를 엔티티 클래스 또는 XML 파일에 선언해두고 사용하는 방법입니다.
JPQL 또는 네이티브 SQL 쿼리를 작성할 수 있습니다.
장점
- 재사용성: 여러 곳에서 동일한 쿼리를 사용할 수 있습니다.
- SQL 최적화: 쿼리를 미리 정의해두므로 성능이 향상됩니다.
- 복잡한 쿼리 작성 가능: JPA Query Method로 표현하기 어려운 복잡한 쿼리를 작성할 수 있습니다.
Named Query 작성법
1. JPQL 기반 Named Query
Entity 클래스에 @NamedQuery 어노테이션을 사용합니다.
User 엔티티
import jakarta.persistence.*;
@Entity
@NamedQuery(
name = "User.findByEmail",
query = "SELECT u FROM User u WHERE u.email = :email"
)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
2. Repository에서 호출
public interface UserRepository extends JpaRepository<User, Long> {
// Named Query 호출
User findByEmail(@Param("email") String email);
}
3. 네이티브 SQL 기반 Named Query
User 엔티티
import jakarta.persistence.*;
@Entity
@NamedNativeQuery(
name = "User.findByNameNative",
query = "SELECT * FROM user WHERE name = :name",
resultClass = User.class
)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
Repository에서 호출
public interface UserRepository extends JpaRepository<User, Long> {
// 네이티브 Named Query 호출
@Query(name = "User.findByNameNative", nativeQuery = true)
List<User> findByNameNative(@Param("name") String name);
}
정리
기능 | JPA Query Method | Named Query |
작성 방식 | 메서드 이름 기반 자동 생성 | 미리 정의된 JPQL 또는 SQL 사용 |
간단한 쿼리 | 매우 적합 | 적합 |
복잡한 쿼리 | 표현이 어려움 | 표현 가능 (JPQL/SQL 자유롭게 사용) |
재사용성 | 낮음 | 높음 |
성능 최적화 | 일반적 | 성능 최적화 가능 |
핵심 요약
- JPA Query Method: 메서드 이름만으로 간단한 쿼리를 쉽게 생성합니다.
- Named Query: 복잡하고 재사용이 필요한 쿼리를 미리 선언하고 실행합니다.
'Spring' 카테고리의 다른 글
Spring Data JPA - Pageable (0) | 2025.01.17 |
---|---|
Spring Data JPA - Sort (0) | 2025.01.17 |
Spring MVC 아키텍처 계층 구조 + Entity와 DTO를 변환하는 이유 (0) | 2025.01.16 |
ModelMapper 라이브러리 (0) | 2025.01.16 |
Spring Data JPA 개요 (0) | 2025.01.15 |