[Spring] QueryDsl gradle 설정 (Spring boot 3.x , 2.x ) (1)

hyewon jeong·2023년 6월 5일
4

Spring

목록 보기
43/65
post-thumbnail

querydsl단독으로 쓸 때는 아니고, spring data jpa와 같이 쓰는 경우이다.

💻 개발 환경

  • OS: Ubuntu20.04 (wsl)
  • IDE: IntelliJ
  • Jdk: openjdk 17버전
  • Gradle언어: Groovy

1. Spring boot 3.x 이상

⭐ 1-1. build.gradle 설정

gradle 의존관계 보기

./gradlew dependencies --configuration compileClasspath
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.0'
    id 'io.spring.dependency-management' version '1.1.0'
   // id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" // ⭐ Querydsl 플러그인 사용 X 추후 배포시 gradlew 할때 에러 발생 
}

group = 'study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'

// ⭐1. Spring boot 3.x이상에서 QueryDsl 패키지를 정의하는 방법
// queryDsl 관련 코드생성 기능 제공
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' 
// queryDsl 라이브러리     
    annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}


tasks.named('test') {
    useJUnitPlatform()
}

// 김영한강의에서는 3.x 에서는 아래 주석된 설정을 하라고 했지만 나의 경우 에러 발생하여 주석처리하고 했더니 되었다. 참고
//clean {
//    delete file('src/main/generated')
//}

Gradle 콘솔 사용법
./gradlew clean compileQuerydsl

⭐ 1-2. build > clean 클릭

⭐ 1-3. Q class 생성 방법(인텔리제이)

  1. 아래 그림과 같이
    other > compileJava 또는 클릭하면 Q파일이 생성된다.
  2. 만약 other > compileQueryDslJava 버튼이 만들어 지지 않는다면
    other > compileQueryDslJava 클릭으로도 가능하다.
  3. build > build 클릭으로도 가능하다.

2번과 3번의 차이는
2. compileJava 는 자바소스코드(.java)파일을 자바 컴파일러를 사용하여 자바바이트코드(.class)로 컴파일링하고 3.build 전체 프로젝트를 빌드한다.
일반적으로 개발자는 build 태스크를 실행하여 전체 프로젝트를 빌드하며, compileJava 태스크는 내부적으로 자동으로 실행되므로 개발자가 직접 호출할 필요는 없습니다.

⭐ 1-4. Q 타입 생성 확인

build > generated >querydsl> study.querydsl.entity.QHello.java 파일이 생성되어 있어야 함

참고: Q타입은 컴파일 시점에 자동 생성되므로 버전관리(GIT)에 포함하지 않는 것이 좋다. 앞서 설정에서 생성 위치를 gradle build 폴더 아래 생성되도록 했기 때문에 이 부분도 자연스럽게 해결된다. (대부분 gradle build 폴더를 git에 포함하지 않는다.)

생성된 Q flie

public class QHello extends EntityPathBase<Hello> {
  private static final long serialVersionUID = -1670026820L;
  public static final QHello hello = new QHello("hello");
  public final NumberPath<Long> id = this.createNumber("id", Long.class);

  public QHello(String variable) {
    super(Hello.class, PathMetadataFactory.forVariable(variable));
  }

  public QHello(Path<? extends Hello> path) {
    super(path.getType(), path.getMetadata());
  }

  public QHello(PathMetadata metadata) {
    super(Hello.class, metadata);
  }
}

Test

@SpringBootTest
@Transactional
class QueryDsl3ApplicationTests {
@PersistenceContext // 스프링데이터 jpa에서 자동 빈 주입 , @Autowired 사용시 빈등록 코드를 별도로 직접 작성하여 주입해야한다.
EntityManager em;
  @Test
  void contextLoads() {
    Hello hello = new Hello();
    em.persist(hello);
    JPAQueryFactory query = new JPAQueryFactory(em); QHello qHello = new QHello("hello");
    Hello result = query
        .selectFrom(qHello)
        .fetchOne();

    Assertions.assertThat(result).isEqualTo(hello); //Querydsl Q타입이 정상 동작하는가?
    Assertions.assertThat(result.getId()).isEqualTo(hello.getId());//롬복 @Getter확인
  }
}

💻 개발 환경

  • OS: Ubuntu20.04 (wsl)
  • IDE: IntelliJ
  • Jdk: openjdk 11버전
  • Gradle언어: Groovy

2. Spring boot 2.X(3.0미만)

build.gradle 설정을 제외하고는 3.0 방법과 동일하다 . (2-2 ~2-4 동일)

⭐ 2-1. build.gradle 설정

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.12'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'

}

group = 'study'
version = '0.0.1-SNAPSHOT'
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'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'

    //Querydsl 추가
    implementation 'com.querydsl:querydsl-jpa'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"



    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

//Querydsl 추가, 자동 생성된 Q클래스 gradle clean으로 제거
clean {
    delete file('src/main/generated')
}

////querydsl 추가 시작 ( 버전 마다 안에 내용이 다를 수 있다. 구글링 요망. 김영한 강의에서는 2.x 버전에는 위의 코드는 넣지 않고 아래 주석 처리된 부분을 설정하라고 되어 있지만 나의  경우 에러발생하여 이렇게 하니깐 되었다. )
//def querydslDir = "$buildDir/generated/querydsl"
//querydsl {
//    jpa = true
//    querydslSourcesDir = querydslDir
//}
//sourceSets {    //sourceSets 있으면 인텔리제이가 자동으로 인코드한다.
//    main.java.srcDir querydslDir
//}
//configurations {
//    querydsl.extendsFrom compileClasspath //컴파일
//}
//compileQuerydsl {
//    options.annotationProcessorPath = configurations.querydsl  // Qfile 생성해줌
//}
////querydsl 추가 끝

⭐ 2-2. build > clean 클릭

⭐ 2-3. Q class 생성 방법(인텔리제이)

  1. 아래 그림과 같이
    other > compileJava 또는 클릭하면 Q파일이 생성된다.
  2. 만약 other > compileQueryDslJava 버튼이 만들어 지지 않는다면
    other > compileQueryDslJava 클릭으로도 가능하다.
  3. build > build 클릭으로도 가능하다.

⭐ 2-4. Q 타입 생성 확인

build > generated >querydsl> study.querydsl.entity.QHello.java 파일이 생성되어 있어야 함

profile
개발자꿈나무

0개의 댓글