강의는 스프링부트 2.x 버전이라 3.x버전으로 세팅하는 법을 정리해보려 한다.
강의 자료에 3.x 버전 설명이 있지만 중간 중간 설명이 달라서 환경설정하는데 예상보다 오래걸렸다;;
1. 프로젝트 생성
접속 >> https://start.spring.io/
이렇게 선택하고 GENERATE 버튼을 누르면 zip 폴더가 다운로드 된다.
원하는 폴더로 옮긴 뒤 압축을 풀어준다.
2. IntelliJ 설정
프로젝트 시작
File -> Open -> querydsl -> build.gradle
프로젝트 JDK 17 이상으로 맞추기
File -> Project Structure -> Project
Gradle 설정
File -> Settings -> Build, Execution, Deployment -> Build Tools -> Gradle
lombok 플러그인
File -> Settings -> Plugin
Lombok 플러그인을 받아준다.
lombok 사용 설정
File -> Settings -> Annotation Processors
Enable annotaion processing을 체크해준다.
build.gradle 설정
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.8'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'study'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(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'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
//Querydsl 추가
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
//쿼리 파라미터 로그 남기기
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
}
tasks.named('test') {
useJUnitPlatform()
jvmArgs '-Xshare:off'
}
//Querydsl 추가, 자동 생성된 Q클래스 gradle clean으로 제거
clean {
delete file('src/main/generated')
}
⭐jvmArgs '-Xshare:off'
: Querydsl 검증테스트 할 때 아래와 같은 오류가 떠서 추가해준 코드다.
OpenJDK 64-bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
3. Querydsl 환경설정 검증
Querydsl이 잘 설정됐다면, 검증용 엔티티 생성 후 재빌드 했을 때 Q타입이 생성되어야한다.
검증용 엔티티 생성
package study.querydsl.entity;
import lombok.Getter;
import lombok.Setter;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
@Getter @Setter
public class Hello {
@Id @GeneratedValue
private Long id;
}
검증용 Q타입 생성
인텔리제이 우측에 Gradle 탭이 있다.
Gradle -> Tasks -> build -> clean
Gradle을 clean해준 뒤, 새로고침 아이콘을 눌러서 재빌드 해준다.
(⭐스프링부트 3.x 버전부터 other 밑에 compileQuerydsl이 없다.)
Q타입 생성 확인
build -> classes 밑으로 쭉쭉 열어보면 QHello.java 파일이 생성되어있다.
(강의에서는 build -> generated 경로지만, 이건 강사님이 스프링부트 2.x버전으로 강의를 찍으신거라 경로를 직접 설정해줬기 때문임. 경로가 꼭 강의와 같지 않아도 된다. QHello.java가 만들어졌다면 성공이다.)
4. JPA, DB 설정 - application.yml
원래 이 설정 전에 H2 데이터베이스를 설치하고 DB접속까지 마친 상태여야 한다.
H2는 2.1.214 버전 이상을 다운 받으면 된다.
DB접속까지 마쳤다면, resources 하위에 application.properties 파일을 지우고 application.yml 파일을 새로 만들어준다.
⭐들여쓰기가 중요하다! 틀리면 오류난다.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/querydsl
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
# show_sql: true
format_sql: true
logging.level:
org.hibernate.SQL: debug
org.hibernate.type: trace
5. Querydsl 테스트 케이스로 실행 검증
package study.querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
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.test.annotation.Commit;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Hello;
import study.querydsl.entity.QHello;
@SpringBootTest
@Transactional
@Commit
public class QuerydslApplicationTests {
@Autowired
EntityManager em;
@Test
void contextLoads() {
Hello hello = new Hello();
em.persist(hello);
JPAQueryFactory query = new JPAQueryFactory(em);
QHello qHello = QHello.hello; //Querydsl Q타입 동작 확인
Hello result = query
.selectFrom(qHello)
.fetchOne();
Assertions.assertThat(result).isEqualTo(hello);
//lombok 동작 확인 (hello.getId())
Assertions.assertThat(result.getId()).isEqualTo(hello.getId());
}
}
강의 자료에는 javax라고 되어있는데 그대로 붙여넣기하면 오류난다.
javax로 써있는 것은 모두 jakarta로 바꿔줘야한다.
'인프런 김영한 강의 정리 > 실전! Querydsl' 카테고리의 다른 글
[Querydsl] 기본 문법(4) - Case문 (0) | 2024.08.09 |
---|---|
[Querydsl]기본 문법(3) - 서브 쿼리 (0) | 2024.08.09 |
[Querydsl] 기본 문법(2) - 조인 (0) | 2024.08.08 |
[Querydsl] fetchResults(), fetchCount() 대체하기 (0) | 2024.08.07 |
[Querydsl] 기본 문법(1) - JPQL과 차이, 조회 (0) | 2024.08.06 |