숨밈
들숨에 건강을 날숨에 재력을
숨밈
전체 방문자
오늘
어제
  • 분류 전체보기 (55)
    • 💻 프로젝트 (8)
      • 🍝 홍잇 (5)
      • 🏕 캠퍼 (3)
    • 👩‍💻 개발 (30)
      • ⚙️ BACKEND (16)
      • 🖥 FRONTEND (3)
      • 📡 DEVOPS (7)
      • 💡SOFTWARE (4)
    • 📑 개발 이론 (13)
      • 🚎 JAVA (1)
      • 🌱 SPRING (12)
    • 📚 CS (2)
      • 🔎 Infra (2)
    • 📔 회고 (2)

블로그 메뉴

  • 홈
  • 태그
  • 글쓰기

인기 글

태그

  • springboot
  • django-rest-auth_custom
  • django-rest-auth
  • 자바스크립트
  • django-auth
  • jsp
  • Tistory
  • notion
  • 스프링
  • 스프링부트
  • 프리코스
  • 타임리프
  • querydsl
  • static final
  • Django

티스토리

hELLO · Designed By 정상우.
숨밈

들숨에 건강을 날숨에 재력을

[SpringBoot] Jpa Repository와 Querydsl 사용방법
👩‍💻 개발/⚙️ BACKEND

[SpringBoot] Jpa Repository와 Querydsl 사용방법

2022. 8. 6. 14:30

 

※ springBoot에 Querydsl설정 방법이 궁금하다면 아래 링크 참조!

2022.08.06 - [기술/Spring] - [SpringBoot] Querydsl 설정

 

Querydsl 사용방법 3가지

  1. QuerydslRepositorySupport와 JpaRepository 각각 사용
  2. JpaRepository에서 Querydsl 사용 가능하도록 설정하여 사용
  3. 상속 없이 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를 메인으로 확정할 수 없는 경우

자주 변경되는 기능에 대해서는 위처럼 선언해서 사용하면 된다.

 

특정 방법이 정답은 없으니 필요에 따라 선택해서 사용하면 되겠다!

 

끝!

 


참고 문서:

https://jojoldu.tistory.com/372

https://jessyt.tistory.com/51

저작자표시 (새창열림)

'👩‍💻 개발 > ⚙️ 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
    '👩‍💻 개발/⚙️ BACKEND' 카테고리의 다른 글
    • [Spring/Java] @Builder / 빌더패턴
    • [Spring/Java] modelMapper
    • [SpringBoot] Querydsl 설정
    • [SpringBoot] Thymleaf css, js 파일 추가 및 사용법
    숨밈
    숨밈
    기술블로그

    티스토리툴바