지난 시간에는 스프링 데이터 JPA가 기본적으로 제공하는 간단한 메소드들을 살펴보았다.
그렇다면 이번에는 “특정 이름을 가진 회원 중 나이가 15살보다 많은 사람만 찾고 싶을 때” 어떻게 하면 될까?
순수 JPA 방식
순수 JPA로 작성한다면 JPQL을 직접 써야 한다.
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
return em.createQuery("select m from Member m where m.username = :username and m.age > :age", Member.class)
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
이렇게 문자열로 직접 쿼리를 작성하고, 파라미터도 일일이 넣어줘야 한다. 코드도 길어지고, 나중에 필드 이름이 바뀌면 쿼리도 직접 수정해야 한다.
스프링 데이터 JPA 방식
스프링 데이터 JPA에서는 같은 기능을 메소드 이름만으로 표현할 수 있다.
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}
끝이다.
여기서 중요한 점은 메소드 이름을 규칙에 맞게 작성하면 스프링이 자동으로 JPQL을 만들어 실행한다는 것이다.
- findBy → 조회를 의미
- Username → 엔티티의 username 필드를 조건으로 사용
- And → 조건을 이어 붙임
- AgeGreaterThan → age 필드가 주어진 값보다 큰 조건
즉, 위 메소드는 다음 JPQL과 같다.
select m from Member m where m.username = ? and m.age > ?
스프링 데이터 JPA가 제공하는 기능들
스프링 데이터 JPA는 메소드 이름만으로도 다양한 쿼리를 만들어낸다. 자주 쓰이는 것들을 정리해보면 다음과 같다.
countBy → 개수 조회
long countByAgeGreaterThan(int age);
// age가 주어진 값보다 큰 회원 수를 반환
existsBy → 존재 여부 확인
boolean existsByUsername(String username);
// 특정 이름을 가진 회원이 존재하는지 true/false 반환
deleteBy → 조건에 맞는 데이터 삭제
long deleteByUsername(String username);
// username이 일치하는 회원을 삭제하고, 삭제된 행 수 반환
findFirst3By / findTop3By → 일부만 조회
List<Member> findTop3ByOrderByAgeDesc();
// 나이가 많은 순으로 상위 3명 조회
findDistinctBy → 중복 제거
List<Member> findDistinctByUsername(String username);
// username이 같은 결과는 한 번만 반환
findBy…OrderBy… → 정렬 포함 조회
List<Member> findByUsernameOrderByAgeDesc(String username);
// username이 같은 회원들을 나이 내림차순으로 정렬해 반환
findBy…Between → 구간 조회
List<Member> findByAgeBetween(int start, int end);
// 나이가 start 이상, end 이하인 회원들 조회
findBy…Containing → 부분 문자열 검색
List<Member> findByUsernameContaining(String keyword);
// username 안에 keyword가 포함된 회원 조회 (SQL의 LIKE %keyword%)
즉, 단순히 이름을 조합하는 것만으로도 조회, 삭제, 정렬, 페이징, 중복 제거, 문자열 검색까지 가능하다. 복잡한 JPQL을 매번 직접 작성할 필요 없이, 자주 쓰는 쿼리는 이름 규칙으로 해결하는 것이 스프링 데이터 JPA의 큰 장점이다.
마무리하며
정리하자면, 스프링 데이터 JPA는 메소드 이름만으로 쿼리를 자동 생성해주기 때문에,
직접 JPQL을 작성할 필요가 없다. 코드가 짧아지고, 엔티티 필드명과 연결되기 때문에 필드가 바뀌면 애플리케이션 실행 시점에 오류도 바로 잡을 수 있다.
감사합니다.
'스프링 데이터 JPA' 카테고리의 다른 글
| [스프링] 스프링 Data JPA(6) @EntityGraph (0) | 2025.08.21 |
|---|---|
| [스프링] 스프링 Data JPA(5) 벌크성 수정쿼리 (0) | 2025.08.21 |
| [스프링] 스프링 Data JPA(4) JPA 페이징과 정렬 (0) | 2025.08.21 |
| [스프링] 스프링 Data JPA(3) @Query, 리포지토리 메소드에 쿼리 정의하기 (0) | 2025.08.21 |
| [스프링] 스프링 Data JPA에 대하여 (4) | 2025.08.16 |
