728x90

build.gradle 설정

plugins {
    ...
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

...

dependencies {
    ...
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"

    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

// QENTITY 설치 경로
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}

sourceSets {
    main.java.srcDir querydslDir
}

configurations {
    querydsl.extendsFrom compileClasspath
}

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}
...
  • $buildDir/generated/querydsl에 QEntity를 설치하는 이유는 아무래도 Compile과 함께 생성되는 파일이다 보니, 사라지는 등의 문제가 발생할 수 있고, 그렇게 되면 깃이 꼬일 수도 있어서 각자 컴파일해서 사용하려는 의도이지 않을까 생각한다.
  • annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" @Entity를 탐색하여 Q클래스 생성
  • gradle 새로 고침 후 gradle -> other -> compileQuerydsl을 눌러준다.
    • QEntity 생성

Querydsl configuration 설정

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuerydslConfiguration {

  @PersistenceContext
  private EntityManager entityManager;

  @Bean
  public JPAQueryFactory jpaQueryFactory(){
    return new JPAQueryFactory(entityManager);
  }

}

Repository 생성

기존에 Spring Data JPA를 사용하고 있었기 때문에 RecommendRepository Interface를 생성하여 JpaRepository를 상속받아 Repository를 사용하고 있었다.

public interface RecommendRepository extends JpaRepository<Recommend, Long> {
  ...
}

이곳에 Querydsl를 사용할 Repository를 CustomRepository를 하나 더 생성한다.

CustomRepository 인터페이스 생성

Recommend Entity에 관한 Repository를 생성할 예정이므로 인터페이스 이름은 CustomRecommendRepository로 명명한다.

public interface CustomRecommendRepository {

}

RecommendRepository에 상속

public interface RecommendRepository extends JpaRepository<Recommend, Long>,
    CustomRecommendRepository {
  ...
}

CustomRecommendRepository를 구현할 구현체 클래스 생성

public class RecommendRepositoryImpl implements CustomRecommendRepository {

  public RecommendRepositoryImpl(EntityManager entityManager) {
    JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
  }
}

예제

public interface CustomRecommendRepository {

  List<Recommend> getListBySort(String sort);

}

CustomRecommendRepository에 구현하고 싶은 메서드를 작성한 후

public class RecommendRepositoryImpl implements CustomRecommendRepository {

  private final JPAQueryFactory queryFactory;

  public RecommendRepositoryImpl(EntityManager entityManager) {
    this.queryFactory = new JPAQueryFactory(entityManager);
  }

  @Override
  public List<Recommend> getListBySort(String sort) {
    return queryFactory.select(QRecommend.recommend)
        .from(QRecommend.recommend)
        .fetch();
  }
}

구현체에서 queryFactory를 사용하여 메서드를 온전히 구현하면 된다.
QEntity를 사용하며, 해당 부분은 다음과 같이 스태틱으로 Import 해서 사용한다.

import static com.content_i_like.domain.entity.QRecommend.recommend;
...
public class RecommendRepositoryImpl implements CustomRecommendRepository {
  ...

  @Override
  public List<Recommend> getListBySort(String sort) {
    return queryFactory.select(recommend)
        .from(recommend)
        .fetch();
  }
}

예제는 queryFactory사용을 보여주기 위한 예제일 뿐입니다. 해당 코드는 작성자의 의도대로 구현되지 않았습니다.

 

 

참조

 

Spring Boot 에서 QueryDSL JPA 사용하기

QueryDSL 을 본격적으로 사용해보자

velog.io

 

 

QueryDsl SpringBoot 3.0의 gradle 설정을 공유합니다. - 인프런 | 자유주제

최근 스프링부트 3.0이 나옴에 따라 QueryDSL 설정 내용을 공유합니다.아래 설정 내용중 Querydsl 추가 라고 나온 부분만 추가하시면 됩니다.스프링 부트: 3.0.0, 자바: 17 기준입니다!plugins { id 'java' id 'o

www.inflearn.com

 

반응형
코드플리