※ springBoot에 Querydsl설정 방법이 궁금하다면 아래 링크 참조!
2022.08.06 - [기술/Spring] - [SpringBoot] Querydsl 설정
Querydsl 사용방법 3가지
- QuerydslRepositorySupport와 JpaRepository 각각 사용
- JpaRepository에서 Querydsl 사용 가능하도록 설정하여 사용
- 상속 없이 Querydsl 사용
1. QuerydslRepositorySupport, JpaRepository 각각 사용
@Repository
public class ReviewRepositorySupport extends QuerydslRepositorySupport {
private final JPAQueryFactory jpaQueryFactory;
public StoreRepositorySupport(JPAQueryFactory jpaQueryFactory) {
super(Review.class);
this.jpaQueryFactory = jpaQueryFactory;
}
public List<Review> findByUser(User user){
return jpaQueryFactory.selectFrom(review)
.where(
review.user.eq(user)
)
.orderBy(review.createdAt.desc())
.fetch();
}
...
}
복잡한 쿼리는 Querydsl을 사용하기 위해 QuerydslRepositorySupport를 상속한 ReviewRepositorySupport를 생성한다.
단, 기본 생성자가 없어 명시해주어야 한다.
public interface ReviewRepository extends JpaRepository<Review,Long> {}
Jpa로 작성 가능한 간단한 쿼리 사용을 위해 JpaRepository를 상속한 ReviewRepository를 생성한다.
이렇게 구현한다면 service계층에서 ReviewRepositorySupport와 ReviewRepository를 모두 의존해야 한다.
2. JpaRepository에서 Querydsl 사용 가능하게 설정
※ 필자는 프로젝트에 이 방법을 사용함
모두 3개의 Repository를 생성해야 한다.
- ReviewRepository <interface>
- ReviewRepositoryCustom <interface>
- ReviewRepositoryImpl <class>
@Repository
public interface ReviewRepository extends JpaRepository<Review,Long>,ReviewRepositoryCustom {}
service계층에서 의존성 주입하여 사용할 interface
public interface ReviewRepositoryCustom {
List<Review> findByUser(User user);
List<Review> findByStore(Store store);
List<Review> findAllByIsBlindFalse();
}
Custom함수로 만들어 줄 함수를 선언한다.
@RequiredArgsConstructor
public class ReviewRepositoryImpl implements ReviewRepositoryCustom {
private final JPAQueryFactory jpaQueryFactory;
//리뷰 조회 - userID
@Override
public List<Review> findByUser(User user){
return jpaQueryFactory.selectFrom(review)
.where(
review.user.eq(user)
)
.orderBy(review.createdAt.desc())
.fetch();
}
}
위의 커스텀 함수를 상속받아 사용한다.
이렇게 구성했을 때 실행이 가능한 이유는 Spring Data Jpa에서는 Custom Repository를
JpaRepository 상속 클래스에서 사용할 수 있도록 기능을 지원하기 때문이다.
※ 일종의 공식으로 Custom이 붙은 인터페이스를 상속한 Impl의 코드는
Custom인터페이스를 상속한 JpaRepository에서 상속할 수 있기 때문이다.
자세한 내용은 아래 링크의 공식문서 확인
3. 상속, 구현 없이 Querydsl 사용
JpaQueryFactory으로만 Querydsl을 사용할 수 있다.
@RequiredArgsConstructor
@Repository
public class ReviewQueryRepository {
private final JPAQueryFactory queryFactory;
public List<Review> findByUser(User user){
return jpaQueryFactory.selectFrom(review)
.where(
review.user.eq(user)
)
.orderBy(review.createdAt.desc())
.fetch();
}
}
위 방법의 장점은 특정 Entity만 사용해야 한다는 제약이 없다.
그러므로 Core 기능이 아닌 어드민/API 등에서 특정 Entity를 메인으로 확정할 수 없는 경우
자주 변경되는 기능에 대해서는 위처럼 선언해서 사용하면 된다.
특정 방법이 정답은 없으니 필요에 따라 선택해서 사용하면 되겠다!
끝!
참고 문서:
'👩💻 개발 > ⚙️ BACKEND' 카테고리의 다른 글
[Spring/Java] @Builder / 빌더패턴 (0) | 2022.08.12 |
---|---|
[Spring/Java] modelMapper (4) | 2022.08.11 |
[SpringBoot] Querydsl 설정 (1) | 2022.08.06 |
[SpringBoot] Thymleaf css, js 파일 추가 및 사용법 (0) | 2022.07.27 |
[SpringBoot] 스프링부트에서 Thymeleaf 와 JSP 같이 쓰기 (0) | 2022.07.24 |