본문 바로가기

JAVA

Spring Data JPA

728x90

1. Spring Data JPA란?

 

스프링 데이터 JPA는 스프링 데이터의 하위 프로젝트로 JPA 를 한단계 추상한 Repository 인터페이스를 제공한다. 스프링 환경에서 JPA를 사용하게 되면 보통 스프링 데이터 JPA를 사용하게 된다.

 

스프링 데이터 JPA를 사용하기 위해선 spring-data-jpa 의존성을 추가해야된다.

다음과 같이 추가할수 있다.

<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.3.3.RELEASE</version>
</dependency>

 

스프링 데이터 JPA의 장점은 어플리케이션을 실행할때 Repository 인터페이스를 찾아서 해당 인터페이스를 구현하는 클래스를 동적으로 생성해서 빈으로 등록하기 떄문에 개발자가 직접 Repository 클래스를 구현할 필요가 없다.

 

2. JpaRepository 인터페이스

 

2-1 JpaRepository 란?

 

JpaRepository는 스프링 데이터 JPA 에서 CRUD 기능을 처리하기 위한 인터페이스다.

내부적으로 다음과 같은 상속관계를 가지고 있으며 CrudRepository에서는 CRUD 에 대한 API가 명시되어있고, PagingAndSorrtingRepository에는  페이징과 소팅과 관련된 API들이 명시되어 있다.

 

이 인터페이스가 명시한 주요 API는 다음과 같다.

 

save(S) : 엔터티를 새로 만들어서 저장하거나 이미 있는 엔터티를 수정한다. (em.persist() 호출)

delete(T) : 엔터티 하나를 삭제한다. em.delete()

findOne(T)  : 엔터티 하나를 조회한다. em.find()

findAlll() : 엔터티 전체를 조회한다. 정렬(Sort)나 페이징(Paging)을 적용할 수도 있다.

 

2-2 쿼리 메소드

쿼리 메소드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나이다. 사전에 정의한 규칙에 따라 메소드 이름만으로 해당하는 JPQL 쿼리를 자동으로 생성해서 실행한다.

 

예를 들어 이름으로 멤버들을 조회하고 싶다면 다음과 같이 추가하면된다.

 

다음과 같이 원하는 쿼리가 생긴다.

 

쿼리 메소드에 대한 규칙은 다음과 같다.

 

And

findByLastnameAndFirstname

… where x.lastname = ?1 and x.firstname = ?2

Or

findByLastnameOrFirstname

… where x.lastname = ?1 or x.firstname = ?2

Is, Equals

findByFirstname,findByFirstnameIs,findByFirstnameEquals

… where x.firstname = ?1

Between

findByStartDateBetween

… where x.startDate between ?1 and ?2

LessThan

findByAgeLessThan

… where x.age < ?1

LessThanEqual

findByAgeLessThanEqual

… where x.age <= ?1

GreaterThan

findByAgeGreaterThan

… where x.age > ?1

GreaterThanEqual

findByAgeGreaterThanEqual

… where x.age >= ?1

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

IsNull, Null

findByAge(Is)Null

… where x.age is null

IsNotNull, NotNull

findByAge(Is)NotNull

… where x.age not null

Like

findByFirstnameLike

… where x.firstname like ?1

NotLike

findByFirstnameNotLike

… where x.firstname not like ?1

StartingWith

findByFirstnameStartingWith

… where x.firstname like ?1 (parameter bound with appended %)

EndingWith

findByFirstnameEndingWith

… where x.firstname like ?1 (parameter bound with prepended %)

Containing

findByFirstnameContaining

… where x.firstname like ?1 (parameter bound wrapped in %)

OrderBy

findByAgeOrderByLastnameDesc

… where x.age = ?1 order by x.lastname desc

Not

findByLastnameNot

… where x.lastname <> ?1

In

findByAgeIn(Collection<Age> ages)

… where x.age in ?1

NotIn

findByAgeNotIn(Collection<Age> ages)

… where x.age not in ?1

True

findByActiveTrue()

… where x.active = true

False

findByActiveFalse()

… where x.active = false

IgnoreCase

findByFirstnameIgnoreCase

… where UPPER(x.firstame) = UPPER(?1)

 

메소드 반환값으로 List, Set 과 같은 Collection을 사용할수 있고, Optional 또한 지원한다.

2-3 @Query, @NamedQuery

직접 쿼리를 명시하고 싶으면경우 

@Query 나 @NamedQuery를 사용하면 된다.

 

@NamedQuery는 jpa 에서 제공하는 기능으로 다음과 같이 @Entity 클래스에 정의하면 된다.

 

@Query또한 @NamedQuery와 비슷한 기능인데 이건 스프링 데이터 JPA에서 제공하는 기능이다.

Repository 클래스에 @Query를 붙이고 JPQL를 사용해서 쿼리를 작성하거나 해당 DB 언어(nativeQuery=true)로 사용하면 된다. 

 

2-4 정렬, 페이징

 

스프링 데이터 JPA에서는 쿼리메소드에 페이징과 정렬기능을 사용할수 있는 파라미터를 제공한다.

 

import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

 

Pageable 은 1) 첫페이지, 2) 보여줄 페이지 수, 3) 데이터 정렬방법으로 객체를 만들고

Pageable 인터페이스의 구현체인 PageRequest를 인수로 넘겨준다.

 

'JAVA' 카테고리의 다른 글

Java 멀티쓰레드 동기화 - (1) Volatile  (0) 2020.10.03
JPA 프록시와 연관관계 관리  (0) 2020.09.04
JDBC, MyBatis  (0) 2020.08.27
JAVA 8 - 람다 추가  (0) 2020.08.15
JAVA 8 (2) - Optional  (0) 2020.08.15