Hibernate/QueryDSL

[JPA] queryDSL 기본 설정

유혁스쿨 2023. 6. 20. 11:18
728x90
반응형

[build.gradle 파일]

 

1.  최 상단 queryDslVersion 추가 (spring boot 2.6.0 이상일 경우)

buildscript {
   ext {
      queryDslVersion = "5.0.0"
   }
}

2. plugin 추가

id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"

 

3. dependencies 라이브러리 추가

implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"

 

4. 하단 추가코드 - test {useJUnitPlatform()} 하위에 추가

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의 Gradle Build 경로 및 기타 설정들을 추가하는 작업이다.

 

5. gradle refresh

코끼리 버튼 클릭

 

6. 빌드 성공 확인 (QType 확인)을 위한 엔티티 생성

 

package study.querydsl.entity;

import lombok.*;

import javax.persistence.*;

@Entity
@Getter @Setter
public class Hello {

    @Id @GeneratedValue
    private Long id;
}

 

7. queryDSL 빌드 관련 프로세싱

 

1) Gradle - Tasks - other - compileQuerydsl 더블클릭

 

2) 우측 project의 build - generated - querydls - study - querydsl - entity - QHello 확인

QHello는 queryDSL이 Hello엔티티를 대상으로 생성한 파일이다.

 

(Generated된 Q파일은 깃에 올리지 않는다 - 위에 설정한대로 build폴더에 넣었때는 깃에 올라가지 않는다^^)

 

8. 테스트

 

 

 

 

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.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;

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

@SpringBootTest
@Transactional
class QuerydslApplicationTests {

//	@Autowired //스프링 환경에서 동작 가능
	@PersistenceContext //스프링을 포함한 다른 컨테이너의경우 사용
	EntityManager em;
	@Test
	void contextLoads() {
		Hello hello = new Hello();
		em.persist(hello);

		JPAQueryFactory query = new JPAQueryFactory(em); //최신 버전에서 권장
//		QHello qHello = new QHello("h");
		QHello qHello = QHello.hello; // QHello.java에 static으로 선언됨
		Hello result = query
						.selectFrom(qHello)
						.fetchOne();

		assertThat(result).isEqualTo(result);
		assertThat(result.getId()).isEqualTo(hello.getId());

	}
}

 

 

 

728x90
반응형