QueryDSL

Haechan Kim·2023년 4월 12일
0

Spring

목록 보기
36/68
post-custom-banner

https://velog.io/@soyeon207/QueryDSL-Spring-Boot-에서-QueryDSL-JPA-사용하기

entity 클래스와 매핑되는 querydsl Q클래스 객체
querydsl은 컴파일 단계에서 엔티티를 기반으로 Q클래스를 생성하는데 JPAAnnotationProcessor가 컴파일 시점에 작동해서 @Entity 어노테이션을 찾아 해당 파일 분석해 QClass 만든다.
QClass는 entity와 형태 똑같은 static class 이다.
querydsl은 쿼리 작성 시 QClass 기반으로 쿼리 실행함.

querydsl과 jparepository 함께 사용하려면 각 역할 별 파일 만들거나 두 개의 의존성 가져야 함.
spring data custrom repository

스프링에서 queryDSL 사용하는 방법 총 3가지 존재.
1. spring data jpa custom repository
2. QueryRepositorySupport
3. JPAQueryFactory

  1. spring data jpa custom repository
    customRepository를 jpaRepository 상속 클래스에서 함께 상속받아 사용 가능.

repo랑 repoImpl 두 개 만들어야 함.

repo(인터페이스)가 다중상속 받고, 커스텀 repo 인터페이스 구현은 repoImpl이 함.
사용자는 repo 인터페이스 di 받아서 사용.

그런데 repoImpl은 repo 직접 구현 x, 어떻게 사용할까?

사용자 정의 구현 클래스인 경우 jpa가 파일명이 repo 인터페이스 이름 + impl인 클래스 찾아서
인터페이스에 jpaRepository 인젝션 할 때 impl 객체 삽입해주기 떄문에 사용 가능!

반드시 구현체 이름이 인터페이스 이름 + Impl 이어야 함.

이 경우 총 3개의 repository 관련 파일이 생성됨.

  1. Repository (인터페이스)
    JpaRepository와 Custom interface 상속한 파일
    사용자는 해당 파일 DI 받아서 사용.
public interface ContentRepository extends JpaRepository<Content, Long>, ContentRepositoryCustom {
}
  1. RepositoryCustom (인터페이스)
    QueryDsl로 커스텀 해서 사용할 메소드 선언하는 파일
public interface ContentRepositoryCustom {
}
  1. RepositoryImpl (구현 클래스)
    RepositoryCustom 인터페이스에 선언한 메소드 구현 파일
@RequiredArgsConstructor
public class ContentRepositoryImpl implements ContentRepositoryCustom {
	private final JPAQueryFactory queryFactory;
}
  1. JPAQueryFactory
    JPAQueryFactory만 있으면 querydsl 기능 모두 사용할 수 있음.
    사용하려는 Q 클래스 import 해서 사용하는 방식.
    단점 : 이렇게 하면 엔티티 save, delete 하는 리포지토리와 query 하는 리포지토리 나뉘어짐.
@RequiredArgsConstructor
@Repository
public class ContentQueryRepository {
  private final JPAQueryFactory queryFactory;
  
  public List<Content> findByTitle(String title) {
    return queryFactory
              .selectFrom(content)
              .where(content.title.eq(title))
              .fetch();
    	}
}
post-custom-banner

0개의 댓글