Spring/QueryDSL

프로젝트 생성 - QueryDSL 설정과 검증

느리지만 꾸준하게 2022. 4. 19. 19:27

일단 간단하게 프로젝트 세팅을 마치고

 

 

 

 

 

QueryDSL 설정과 검증

처음 시도하는 거지만 차근차근 해보자.

build.gradle 아래처럼 세팅

// build.gradle

plugins {
   id 'org.springframework.boot' version '2.6.6'
   id 'io.spring.dependency-management' version '1.0.11.RELEASE'
   //querydsl 추가
   id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
   id 'java'
}

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'

   //querydsl 추가
   implementation 'com.querydsl:querydsl-jpa'

   compileOnly 'org.projectlombok:lombok'
   runtimeOnly 'com.h2database:h2'
   annotationProcessor 'org.projectlombok:lombok'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

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
}
//querydsl 추가 끝

 

entity package 만들어주고 Hello class에다가 작성 이후에 compilerQuerydsl 더블클릭

package study.querydsl.entity;


import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter @Setter
public class Hello {

    @Id
    @GeneratedValue
    private Long id;
}

 

 

 

 

 

 

error 뜬다. 여기서 해결

build.gradle 아래와 같이 설정

buildscript {
   ext {
      queryDslVersion = "5.0.0"
   }
}

plugins {
   id 'org.springframework.boot' version '2.6.0'
   id 'io.spring.dependency-management' version '1.0.11.RELEASE'
   //querydsl 추가
   id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
   id 'java'
}

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'
   //querydsl 추가
   implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
   implementation "com.querydsl:querydsl-apt:${queryDslVersion}"


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

test {
   useJUnitPlatform()
}

//querydsl 추가 시작
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
   jpa = true
   querydslSourcesDir = querydslDir
}
sourceSets {
   main.java.srcDir querydslDir
}
compileQuerydsl{
   options.annotationProcessorPath = configurations.querydsl
}
configurations {
   compileOnly {
      extendsFrom annotationProcessor
   }
   querydsl.extendsFrom compileClasspath
}
//querydsl 추가 끝

 

 

  • clean 하면 build 폴더가 다 지워짐
  • compileQuerydsl하면 build - generated - querydsl - QHello 다 만들어짐
  • compileJava도 마찬가지로 build 생성되게 해줌

 

 

QHello 파일은 git에 올리면 안된다.

build 폴더에 처리를 하게되면 하위내용들을 gitignore 처리가 되어서 안올라간다. 즉 gitignore 처리나 별도 처리를 안해도 된다.

 

만약 src - generated 밑에나 다른데 처리를 하게되면 gitignore를 해줘야 한다.

 

 

 

QueryDSL을 써서 돌아가는걸 확인해주자.

// QuerydslApplicationTests

package study.querydsl;

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Hello;
import study.querydsl.entity.QHello;

import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import static org.assertj.core.api.Assertions.*;

@SpringBootTest
@Transactional
class QuerydslApplicationTests {


	// spring 최신버전
	@Autowired
	EntityManager em;
	// java 표준스펙
//	@PersistenceContext
	@Test
	void contextLoads() {
		Hello hello = new Hello();
		em.persist(hello);

		JPAQueryFactory query = new JPAQueryFactory(em);
		QHello qHello = new QHello("h");

		
		// querydsl도 잘돌아간다.
		Hello result = query
				.selectFrom(qHello)
				.fetchOne();

		assertThat(result).isEqualTo(hello);
		
		// lombok으로 세팅
		assertThat(result.getId()).isEqualTo(hello.getId());
	}

}

QHello를 new QHello말고 아래와 같이 QHello.hello;으로 할 수 있다.

@Test
void contextLoads() {
   Hello hello = new Hello();
   em.persist(hello);

   JPAQueryFactory query = new JPAQueryFactory(em);
   QHello qHello = QHello.hello;

 

 

 

 

h2 db 설치할때 권한을 한번주자. (1.4.199 version)

chmod 755 h2.sh

아래 순서대로 h2 db에 접근

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 실전! QueryDSL >

https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard

 

실전! Querydsl - 인프런 | 강의

Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런...

www.inflearn.com

 

 

 

 

 

 

 

 

 

 

'Spring > QueryDSL' 카테고리의 다른 글

검색 조건 쿼리  (0) 2022.04.19
기본 Q-Type 활용  (0) 2022.04.19
JPQL vs Querydsl  (0) 2022.04.19
예제 도메인 모델 동작확인  (0) 2022.04.19
스프링 부트 설정 - JPA, DB  (0) 2022.04.19