QueryDSL
QueryDSL에 대한 정보는 많다. pom.xml 쓰던 시절에 쓰던 정보 말이다. 근데 Gradle에서 어떻게 시작해야 하는지는 잘 안 나와있다. 심지어 공식문서도 Getting Started에 Gradle에서 사용하는 방법에 대해서는 명시되어 있지 않다. 오이오이, '공식문서'쿤... 장난하는 거지.....? '모두'의 '희망希望' 인 네가 이렇게 나온다구.....?
허 참..... 내 살다살다 이렇게 정보가 모든 곳이 제각각인 것은 처음본다.
스프링부트의 maven과 gradle에 대한 정보가 섞여나오는 것 뿐 아니라, QueryDSL 설정에 대해서도 사람마다 전부 뒤죽박죽으로 되어있어서 알맞는 방법을 찾는게 어려웠다. 정말.
그래서 여러 사이트를 많이 헤멨고 그만큼 실수 하기도 했다.
강을 지나...
Bootstrapping JPA Programmatically in Java | Baeldung
산을 건너..... (주소가 불러와지지 않아 네시로 대체함)
동굴을 뚫고.......
번개를 피해.........
많은 시도와 시행착오(시간 많이 걸렸다!) 끝에 마침내 정보가 교집합을 이루는 게시글을 찾아냈다.
블로그를 시작하겠다 마음 먹고나서는 개념만 적어놓고 코드뭉치 같은 건 잘 안 적으려고 했는데, 이건 놓치면 다음에 세팅할 때 또 같은 고생을 할 것 같아서 기록을 해놓는다.
1. Gradle.build
buildscript {
ext {
queryDslVersion = "5.0.0" // queryDSL 버전 변수
}
}
plugins {
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" // queryDSL (1)
}
dependencies {
//querydsl (2)
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
implementation "com.querydsl:querydsl-core:${queryDslVersion}"
}
def querydslDir = "$buildDir/generated/querydsl" // queryDSL (3)
querydsl { // queryDSL (4)
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets { // queryDSL (5)
main.java.srcDir querydslDir
}
configurations { // queryDSL (6)
querydsl.extendsFrom compileClasspath
}
compileQuerydsl { // queryDSL (7)
options.annotationProcessorPath = configurations.querydsl
}
아직 gradle에 대한 지식이 일천해 코드를 해석하진 못 했다.
2. CompileQueryDsl
- Entity를 정의한 뒤 Gradle의 compileQueryDsl를 실행시켜줘야 한다.
3. Service
- 이제 QueryDSL을 사용할 준비가 된 것이다!
@Service
@RequiredArgsConstructor
public class PostService {
private final EntityManager entityManager;
// .....
private Post randomPostPick(User user, List<Long> readingPostIdList) {
JPAQuery<Post> query = new JPAQuery<>(entityManager);
QPost qPost = new QPost("p");
// 예시 코드
QueryResults<Post> queryResults = query.from(qPost)
.where(qPost.user.ne(user)
.and(qPost.postId.notIn(readingPostIdList))
)
.offset(index)
.limit(1)
.fetchResults();
if(queryResults.isEmpty()){
return null;
}else {
return queryResults.getResults().get(0);
}
}
// .....
}
위 코드는 아래의 코드를 QueryDSL로 적용시킨 사례이다.
Page<Post> postPage = postRepository
.findAllByUserNotAndPostIdNotIn(
user,
readingPostIdList,
PageRequest.of(idx, 1)
);
if (postPage.hasContent()) {
Post post = postPage.getContent().get(0);
}
나중에 복사 붙여넣기 하기 편하도록 미리 제대로 정리해 보았다.
옛날에는 롬복도 이렇게 설정하기 어려웠던 시절이 있었다고 하던데..... 이것도 편해지는 시대가 오겠지? 그러면 진짜 감사..... 압도적 감사.....!
고생 끝에 맛 본 짧은 QueryDSL과의 만남 후기를 적자면, 쓰고보니 엄청 좋다. 나중에 프로젝트 할 때 애용하게 될 것 같다.
근데, 좋긴 한데..... 공식 문서가 인터넷에서 떠도는 정보보다 도움이 되지 않았다보니 버려진 기술의 느낌이 들어서 어딘가 찝찝한 기분이 든다.....
'기술 > Spring-Boot' 카테고리의 다른 글
빌더패턴 제네릭 클래스에 적용하기 (1) | 2021.12.24 |
---|---|
JPA에서의 페이징 기법, 빠를까? (0) | 2021.12.23 |
JPA에서 쓰는 페이징(Paging) 기법이 뭘까? (0) | 2021.12.09 |
@Autowired는 왜 별로일까? (0) | 2021.11.28 |
의존성 주입(DI)이 뭘까? (0) | 2021.11.28 |
댓글