build.gradle
buildscript {
ext {
//QueryDsl 버전 변수
queryDslVersion = "5.0.0"
}
}
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.15'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
//QueryDsl 플러그인
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
group = 'com.supercoding'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '11'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'io.springfox:springfox-boot-starter:3.0.0'
implementation 'io.springfox:springfox-swagger-ui:3.0.0'
implementation 'org.slf4j:slf4j-api:1.7.31'
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
//QueryDsl 의존성
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// JWT 라이브러리
implementation "io.jsonwebtoken:jjwt:0.9.1"
// 스프링 시큐리티 라이브러리
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
}
tasks.named('test') {
useJUnitPlatform()
}
//QueryDsl 기타 설정
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
configurations {
querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
gradle > other > compileQuerydsl 실행
gradle에 명시한 path로 가보면
QEnttiy들 생성 완료
config file 생성
@Configuration
public class QueryDslConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
Repository 구조는 처음 JPA와 병행하며 사용해야해서 도메인당 3개의 파일로 구성
oooCustomRepository (인터페이스 생성)
public interface ShopCustomRepository {
ViewShopListResponse findShopListWithNextCursor(ViewShopListRequest viewShopListRequest , Double latitude, Double longitude);
}
oooCustomRepositoryImpl (oooCustomRepository을 상속 받아 QueryDsl을 사용할 구현 클래스)
@Repository
@RequiredArgsConstructor
public class ShopCustomRepositoryImpl implements ShopCustomRepository {
private final JPAQueryFactory jpaQueryFactory;
@TimeTrace
@Override
public ViewShopListResponse findShopListWithNextCursor(ViewShopListRequest request, Double latitude, Double longitude) {
//구현 부분
}
}
다음 포스팅은 처음 써보는 QueryDSL로 커서 페이지네이션을 구현해보는 내용을 작성해보겠다.