본문 바로가기
기술/Spring-Boot

[QueryDSL/SpringBoot] Gradle에서의 QueryDSL 설정

by Zabee52 2021. 12. 10.

QueryDSL

QueryDSL에 대한 정보는 많다. pom.xml 쓰던 시절에 쓰던 정보 말이다. 근데 Gradle에서 어떻게 시작해야 하는지는 잘 안 나와있다. 심지어 공식문서도 Getting Started에 Gradle에서 사용하는 방법에 대해서는 명시되어 있지 않다. 오이오이, '공식문서'쿤... 장난하는 거지.....? '모두'의 '희망希望' 인 네가 이렇게 나온다구.....?

 

허 참..... 내 살다살다 이렇게 정보가 모든 곳이 제각각인 것은 처음본다.

스프링부트의 maven과 gradle에 대한 정보가 섞여나오는 것 뿐 아니라, QueryDSL 설정에 대해서도 사람마다 전부 뒤죽박죽으로 되어있어서 알맞는 방법을 찾는게 어려웠다. 정말.

 

그래서 여러 사이트를 많이 헤멨고 그만큼 실수 하기도 했다.

 

How to bootstrap JPA programmatically without the persistence.xml configuration file - Vlad Mihalcea

Introduction One of my Twitter followers asked me if there is any documentation for bootstrapping JPA programmatically so that we can replace the persistence.xml configuration file with a Java configuration: Previously, I wrote an article about bootstrappi

vladmihalcea.com

강을 지나...

Bootstrapping JPA Programmatically in Java | Baeldung

네시 ㅎㅇ ㅋㅋ

산을 건너..... (주소가 불러와지지 않아 네시로 대체함)

 

Spring Boot에 QueryDSL을 사용해보자

1. QueryDSL PostRepository.java Spring Data JPA가 기본적으로 제공해주는 CRUD 메서드 및 쿼리 메서드 기능을 사용하더라도, 원하는 조건의 데이터를 수집하기 위해서는 필연적으로 JPQL…

tecoble.techcourse.co.kr

동굴을 뚫고.......

 

QueryDSL 공부 1 - queryDSL 설정

QueryDSL 은 JPA 를 사용할때 동적쿼리나 복잡한 쿼리들을 자바로 만들어 낼 수 있도록 도와주는 라이브러리이다. 쿼리가 자바로 작성되기 때문에 컴파일 시점에 오류를 잡아낼 수 있고 , 가독성 있

ugo04.tistory.com

번개를 피해.........

 

[Querydsl] 프로젝트 설정 및 테스트

모든 소스 코드는 여기 있습니다. Querydsl 을 사용하기 위해 프로젝트 설정부터 차근차근 달려봅시다! 먼저 자바 버전은 11 , 스프링 버전은 2.5.2 를 선택하였고 gradle 프로젝트로 생성하여 아래 네

jaime-note.tistory.com

많은 시도와 시행착오(시간 많이 걸렸다!) 끝에 마침내 정보가 교집합을 이루는 게시글을 찾아냈다.

 

블로그를 시작하겠다 마음 먹고나서는 개념만 적어놓고 코드뭉치 같은 건 잘 안 적으려고 했는데, 이건 놓치면 다음에 세팅할 때 또 같은 고생을 할 것 같아서 기록을 해놓는다.

 

 

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를 실행시켜줘야 한다.

Q Entity가 생성된 모습.

 

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과의 만남 후기를 적자면, 쓰고보니 엄청 좋다. 나중에 프로젝트 할 때 애용하게 될 것 같다.

근데, 좋긴 한데..... 공식 문서가 인터넷에서 떠도는 정보보다 도움이 되지 않았다보니 버려진 기술의 느낌이 들어서 어딘가 찝찝한 기분이 든다.....

댓글