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사용을 보여주기 위한 예제일 뿐입니다. 해당 코드는 작성자의 의도대로 구현되지 않았습니다.
참조
반응형
'Server > Spring&Spring Boot' 카테고리의 다른 글
[Junit] MultipartFile과 DTO가 있는 컨트롤러 테스트 (1) | 2023.02.01 |
---|---|
[Junit] 테스트 코드 할 때 가상의 Token 만들어주기 (0) | 2023.01.31 |
[Spring] TomcatServletWebServerFactory Port 설정 (0) | 2023.01.28 |
[Spring Boot] AWS S3에 파일 업로드 (0) | 2023.01.26 |
[Spring] test code에 대한 회고 (0) | 2023.01.24 |