2. Querydsl 설정과 검증

민정·2023년 1월 1일

QueryDSL

목록 보기
2/18
post-thumbnail

📌 build.gradle 설정

스프링부트 2.6부터는 Querydsl 5.0을 사용한다고 한다!

아래와 같이 build.gralde에 작성해주었다.

buildscript {
	ext {
		queryDslVersion = "5.0.0"
	}
}

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

	//querydsl 추가
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

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'
	testImplementation 'org.projectlombok:lombok:1.18.22'
	compileOnly 'org.projectlombok:lombok'

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

	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 class 생성

main/java/study/querydsl/entity 패키지 안에 Hello.class 생성

@Entity
@Getter @Setter
public class Hello {

    @Id @GeneratedValue
    private Long id;
}



Q파일 생성하기

✨ compileQuerydsl 클릭

오른쪽 Gradle탭 - Task/other/compileQuerydsl 클릭

build.gradle에서 querydslDir을 보면 build/generated/querydsl로 설정
-> 해당 폴더 sources root로 설정!

compileQuerydsl 클릭하면 build/generated/querydsl (= sources root) 아래 main/java 하위에 생성한 Hello 클래스의 위치와 같은 패키지의 장소QHello가 생성된다.

build process에 comileQuerydsl이 들어있어서 build해도 Q파일 생성된다.

✨생성된 QHllo 확인

Hello.java가 있는 패키지와 같은 위치의 패키지에 QHello.java가 생겼다.




build 폴더, Q파일 삭제, 생성

✨ build 폴더, Q파일 - 삭제

cmd 창에서 해당 프로젝트 최상단에서 gradlew clean하면 build 파일 사라지면서 생성된 Q 파일도 날라간다.

✨ build 폴더, Q파일 - 생성

cmd 창에서 해당 프로젝트 최상단에서 gradlew compileQuerydsl 실행
다시 build 파일과 Q파일들이 생성된다.

gradlew compileJava 해도 똑같이 생성된다.

✨ 생성된 Q파일은 git에 올리지 않는다!

시스템이 자동으로 생성해주는 파일들이라서, 라이브러리 버전이 올라감에 따라서 세부적인 사항들이 변경될 수 있다.

git에서 관리하면 버전 향상에 따른 변경 사항까지 commit 해야한다.

build폴더는 보통 gradle에서 자동으로 ignore
-> 따라서 별도의 gitignore 처리 필요 없음

단, src 아래에 생성하거나 하면 gitignore 설정 필요



✔ Test 작성

spring initializr가 기본적으로 만들어준 Test파일 속 contextLoads에 Test 작성했다.

@SpringBootTest
@Transactional
class QuerydslApplicationTests {

	@Autowired
	EntityManager em;
	// 참고: spring 표준 스펙에서는 @Autowired 대신 @PersistenceContext 사용, spring 최신버전에서는 @Autowired 사용 가능

	@Test
	void contextLoads() {
		Hello hello = new Hello();
		em.persist(hello); // hello 엔티티 저장

		JPAQueryFactory query = new JPAQueryFactory(em);// querydsl 사용을 위해 JPAQueryFactory 생성
		QHello qHello = new QHello("h");// alias(별칭) 설정
		/*
		QHello qHello = new QHello("h");를
		다음과 같이 사용도 가능: QHello qHello = QHello.hello;

		만들어진 QHello를 보면 static final로 hello라고 자기 자신을 만들어서 필드로 선언해놓음
		 */


		// querydsl사용 - 내 생각) em.find(hello)랑 같은건데 querydsl을 사용한 버전인 듯
		Hello result = query
				.selectFrom(qHello) // querydsl을 쓸 때, query와 관련된것은 Q타입을 넣어야함
				.fetchOne();

		assertThat(result).isEqualTo(hello);// querydsl 동작 확인
		assertThat(result.getId()).isEqualTo(hello.getId());// 롬복 동작 확인
	}
}

🟢 테스트 성공

테스트에서는 테스트 종료 후 자동 롤백 시켜서 쿼리 날라가는 쿼리문이 콘솔에 나오지 않는다.
-> @Commit을 사용하면 테스트 종료 후, 롤백하지 않는다!

참고: 스프링 부트에 아무런 설정도 하지 않으면 h2 DB를 메모리 모드로 JVM안에서 실행한다.


출처

김영한 강사님 - 인프런 실전! Querydsl

0개의 댓글