본문 바로가기

Study/JPA

[JPA] Spring Data JPA와 QueryDSL 이해

Spring Data JPA와 QueryDSL 이해


Spring Data JPA

소개

  • 지루하게 반복되는 CRUD 문제를 세련된 방법으로 해결
  • 개발자는 인터페이스만 작성
  • 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입

사용법

  • 어지간한 쿼리는 JPARepository<>를 상속시키면 다 구현되어 있다.

  • 특정 조건으로 조회쿼리를 짜야할 때 인터페이스만 만들어도 알아서 SPQL을 만들어 주기도 한다.

  • 페이징 처리도 Pageable 인터페이스를 상속받은 객체를 파라미터로 넣어주면 알아서 페이징 처리를 해준다.

    Pagable page = new PageRequest(1,20,new Sort...);    // 정렬도 가능
    page<Member> result = memberRepository.findByName("hello",page);
  • @Query를 사용해서 직접 JPQL 지정

    public interface MemberRepository extends JPARepository<Member, Long>{
        @Query("SELECT m FROM Member m WHERE m.username = ?1")
        Mamber findByUsername(String username, Pageable pageable)
    }

QueryDSL

  • SQL, JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API
  • JPQ 크리테리아에 비해서 편리하고 실용적임
  • 오픈소스

SQL, JPQL은 Type-check 불가능, 해당 로직을 실행하기 전까지 작동 여부 확인 불가

장점

  • 문자가 아닌 코드로 작성
  • 컴파일 시점에 문법 오류 발견
  • 코드 자동완성(IDE)
  • 단순하고 쉬움: 코드 모양이 JPQL과 거의 비슷
  • 동적 쿼리

예시

  • 동적 쿼리
String name = "member";
int age = 9;
QMember m = QMember.member;
BooleanBuilder builder = new BooleanBuilder();
if(name != null){
    builder.and(m.name.contains(name));
}
if(age != 0){
    builder.and(m.age.gt(age));
}

List<Member> list = query.selectFrom(m).where(builder).fetch();

  • 자바문법을 사용할 수 있어서 함수 사용( 가독성 ) + 재사용 가능
...
return query.selectFrom(coupon).where(
                            coupon.type.eq(typeParam),
                            isServiceanle()
                            ).fetch();

private BooleanExpression isServiceable(){
    return coupon.status.eq("LIVE").and(marketing.viewCount.lt(marketing.maxCount));
}

'Study > JPA' 카테고리의 다른 글

[JPA] 객체 지향 쿼리  (0) 2022.01.13
[JPA] JPA 내부 구조  (0) 2022.01.12
[JPA] 양방향 매핑  (0) 2022.01.12
[JPA] 연관관계 매핑  (0) 2022.01.11
[JPA] JPA 필드와 컬럼 매핑  (0) 2022.01.10