12장 스프링 데이타 JPA

  • 스프링 데이타 JPA 기능 학습 및 적용

  • 소개 스프링 데이타 JPA는 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트다. 이 프로젝트는 데이터 접근 계층을 개발할 때 지루하게 반복되는 CRUD 문제를 세련된 방법으로 해결한다. 우선 CRUD를 처리하기 위한 공통 인터페이스를 제공한다. 그리고 리포지토리를 개발할 때 인터페이스만 작성하면 실행 지점에 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입해준다. 따라서 데이터 접근 계층을 개발할 때 구현 클래스 없이 인터페이스만 작성해도 개발을 완료할 수 있다.

  • 환경설정

    • 라이브러리 설정
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>1.8.0.RELEASE</version>
    </dependency>
    
    • 환경설정

    <jpa:repositories base-package="jpabook.jpashop.repository"/>

  • 스프링 데이타 JPA는 간단한 CRUD 기능을 공통으로 처리하는 JpaRepository 인터페이스를 제공한다.

    public interface JapRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>{
    ...
    }
    
    public interface MemberRepository extends JpaRepository<Member, Long>{}
    

스프링 데이타 JPA 쿼리 메소드 기능

public interface MemberRepository extends Repository<Member, Long> {
List<Member> findByEmailAndName(String email, String name);
}
select m from Member m where m.email=?1 and m.name=?2
Keyword Sample JPQL snippet
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 findByAgeIsNull … 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 ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection age) … 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)
  • 스프링 데이터 모듈
    • Repository, CrudRepository, PagingAndSortingRepository
  • 스프링 데이타 JPA
    • 스프링 데이터 모듈에 추가로 JPA에 특화된 기능을 제공한다.

http://docs.spring.io/spring-data/jpa/docs/1.8.0.RELEASE/reference/html/#project

  • 스프링 데이타 JPA와 QueryDSL 통합
    org.springframework.data.querydsl.QueryDslPredicateExecutor
    org.springframework.data.querydsl.QueryDslRepositorySupport
    

RM Repository

  • commons-data-1.0.1-SNAPSHOT 사용
import com.rsupport.commons.data.GenericRepositoryJpa;
public interface ConferenceRepository extends GenericRepository<Conference, String> {

@Repository("conferenceRepository")
public class ConferenceRepositoryJpa extends GenericRepositoryJpa<Conference, String> implements ConferenceRepository {

  public ConferenceRepositoryJpa() {
    super(Conference.class);
  }

  @Override
  public List<ConferenceEndpoint> getByConferenceId(String id) {
  JPAQuery query = new JPAQuery(getEntityManager());
  QConference qConference = QConference.conference;
  QConferenceEndpoint qConferenceEndpoint = QConferenceEndpoint.conferenceEndpoint;
  QEndpoint qEndpoint = QEndpoint.endpoint;

  query.from(qConference).innerJoin(qConference.conferenceEndpoints, qConferenceEndpoint)
.join(qConferenceEndpoint.endpoint, qEndpoint).where(qConference.id.eq(id));

  query.orderBy(qConferenceEndpoint.updatedDt.asc());
  • dependency querydsl 3.4.1
    <dependency>
      <groupId>com.mysema.querydsl</groupId>
      <artifactId>querydsl-apt</artifactId>
      <version>${querydsl.version}</version>
    </dependency>
    <dependency>
      <groupId>com.mysema.querydsl</groupId>
      <artifactId>querydsl-jpa</artifactId>
      <version>${querydsl.version}</version>
    </dependency>
    <dependency>
      <groupId>com.mysema.querydsl</groupId>
      <artifactId>querydsl-sql</artifactId>
      <version>${querydsl.version}</version>
      <exclusions>
          <exclusion>
              <groupId>javax.validation</groupId>
              <artifactId>validation-api</artifactId>
          </exclusion>
          <exclusion>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-api</artifactId>
          </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>com.mysema.querydsl</groupId>
      <artifactId>querydsl-sql-codegen</artifactId>
      <version>${querydsl.version}</version>
    </dependency>
    

results matching ""

    No results matching ""