Spring Data JPA - 메소드 이름으로 쿼리 생성


Spring Data JPA 쿼리 메소드 기능
메소드 이름으로 쿼리 생성

JPA와 Spring Data JPA를 활용한 쿼리 생성 방법

Java Persistence API (JPA)와 Spring Data JPA는 Java 개발자들이 데이터베이스에 대한 쿼리를 더 쉽고 효율적으로 생성하고 관리할 수 있게 해줍니다. 이 두 기술은 메소드 이름을 분석해 JPQL (Java Persistence Query Language) 쿼리를 생성하고 실행하는 기능을 제공합니다. 이 포스트에서는 이러한 방법을 사용해 이름과 나이를 기준으로 회원을 조회하는 방법에 대해 설명하겠습니다.

순수 JPA 리포지토리를 사용한 방법

먼저 순수 JPA를 사용하여 메소드를 작성해 보겠습니다.

MemberJpaRepository.kt
1
2
3
4
5
6
fun findByUsernameAndAgeGreaterThan(username: String, age: Int): List<Member> {
return em.createQuery("select m from Member m where m.username = :username and m.age > :age", Member::class.java)
.setParameter("username", username)
.setParameter("age", age)
.resultList
}

이 메소드는 입력된 사용자 이름과 나이를 기준으로 Member 엔티티를 검색합니다. 해당 메소드의 테스트 코드는 다음과 같습니다.

MemberJpaRepositoryTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
@Test
fun findByUsernameAndAgeGreaterThan() {
val member1 = Member(username = "AAA", age = 10)
val member2 = Member(username = "AAA", age = 20)
memberJpaRepository.save(member1)
memberJpaRepository.save(member2)

val result = memberJpaRepository.findByUsernameAndAgeGreaterThan("AAA", 15)
assertThat(result[0].username).isEqualTo("AAA")
assertThat(result[0].age).isEqualTo(20)
assertThat(result.size).isEqualTo(1)
}

Spring Data JPA를 사용한 방법

다음으로, Spring Data JPA를 사용하여 같은 쿼리를 생성해 보겠습니다. Spring Data JPA를 사용하면 구현체 없이 인터페이스만으로 쿼리를 생성할 수 있습니다.

MemberRepository.kt
1
2
3
4
5
interface MemberRepository: JpaRepository<Member, Long> {

fun findByUsernameAndAgeGreaterThan(username: String, age: Int): List<Member>

}

Spring Data JPA는 위와 같이 메소드 이름만으로 쿼리를 생성하고 실행합니다. 이는 개발자가 쿼리를 직접 작성하는 노력을 줄이고 코드의 가독성을 향상시킵니다.

Spring Data JPA는 다양한 쿼리 메소드를 지원합니다.

  • 조회: find...By, read...By, query...By, get...By
  • COUNT: count...By 반환 타입 long
  • EXISTS: exists...By 반환 타입 boolean
  • 삭제: delete...By, remove...By 반환 타입 long`
  • DISTINCT: findDistinct, findMemberDistinctBy
  • LIMIT: findFirst3, findFirst, findTop, findTop3

더 자세한 정보는 Spring Data JPA 공식 문서를 참조하세요.

주의할 점은, 이러한 기능은 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 함께 변경해야 합니다. 그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생합니다. 이렇게 애플리케이션 로딩 시점에 오류를 인지할 수 있는 것은 스프링 데이터 JPA의 매우 큰 장점입니다.

소스코드

참조