2022. 10. 5. 17:07ใ์ธํ๋ฐ/์ค์ ! QueryDSL
https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard
์ธํ๋ฐ - ์ค์ ! QueryDSL ๊ฐ์๋ฅผ ๋ฃ๊ณ , ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ์ต๋๋ค. ๐
1๏ธโฃ ํ๋ก์ ํธ ํ๊ฒฝ ์ค์
์คํ๋ง ๋ถํธ ์คํํฐ์ ๋ค์ด๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํด ์ค ๊ฒ์ด๋ค.
์ฌ์ฉ ๊ธฐ๋ฅ: spring web, spring data jpa, h2 database, lombok
SpringBoot version: 2.7.4 (๊ฐ์์์๋ 2.2.2 ๋ฒ์ ์ ์ฌ์ฉํ์ง๋ง ์๊ฐ์ด ๋ง์ด ์ง๋ ์ง๊ธ ๋ค์ผ๋ ๋ฒ์ ์ด ๋ง์ด ์ฌ๋ผ๊ฐ๋ค.)
groupId: study
artifactId: querydsl
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-devtools'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'
๊น์ํ ๊ฐ์ฌ๋ ์ปค๋ฆฌ๋ฅผ ๊ณ์ ๋ฐ๋ผ๊ฐ๋ค๋ณด๋ ์ด์ ๋ ์๋์ผ๋ก ์ค์ ํด์ฃผ๋
IntelliJ Gradle ๋์ ์๋ฐ๋ก ๋ฐ๋ก ์คํํ๋๋ก ์ค์ ํด์ฃผ๊ณ , ๋กฌ๋ณต ์ ์ฉ ํด์ฃผ๊ธฐ
์ธํ ๋ฆฌ์ ์ด ์ฌ์ฉํ๋ ๋ถ๋ค ์ฐธ๊ณ ํ์๊ธธ,,
2๏ธโฃ Querydsl ์ค์ ๊ณผ ๊ฒ์ฆ
build.gradle์ Querydsl ์ถ๊ฐํด์ฃผ๊ธฐ
//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"
-> ๊ฐ์์์ ์ ๊ณตํ๋ ์ค์ ์ ํ๊ณ ๋๋ฆฌ๋๋ฐ ์๋ฌ๊ฐ ๋์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์์ ์ถ๊ฐํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์
//Querydsl ์ถ๊ฐ, ์๋ ์์ฑ๋ Qํด๋์ค gradle clean์ผ๋ก ์ ๊ฑฐ
clean {
delete file('src/main/generated')
}
์ด๊ฑฐ ์ถ๊ฐํด์ฃผ๊ธฐ
Hello
-> Querydsl ํ๊ฒฝ์ค์ ๊ฒ์ฆํ๊ธฐ ์ํด Hello ์ํฐํฐ๋ฅผ ์์ฑํ๋ค.
๊ฒ์ฆ์ฉ Qํ์ ์์ฑ
Gradle -> Tasks -> build -> clean
Gradle -> Tasks -> other -> compileJava
Qํ์ ์์ฑ ํ์ธ
build -> generated -> querydsl
study.querydsl.entity.QHello.java ํ์ผ์ด ์์ฑ๋์ด ์์ด์ผ ํ๋ค!
QHello
โ๏ธ์ฐธ๊ณ
Qํ์ ์ ์ปดํ์ผ ์์ ์ ์๋์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋ฒ์ ๊ด๋ฆฌ (git) ์ ํฌํจํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
gradle build ํด๋ ์๋์ ์์ฑ๋๋๋ก ํ์ผ๋ฉด ์ด ๋ถ๋ถ์ ์๋์ผ๋ก ํด๊ฒฐํด์ค๋ค.( ๋๋ถ๋ถ gradle build ํด๋๋ git ์ ํฌํจํ์ง ์๋๋ค.)
QuerydslApplicationTest
: ํ ์คํธ ์ผ์ด์ค๋ก ์คํ ๊ฒ์ฆํ๊ธฐ
์ฐ์ jpa์์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํธ๋์ญ์ ์์์ ์ํ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ @Transactional ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ EntityManager๋ฅผ ์ฃผ์ ๋ฐ๊ณ ,
Querydsl Qํ์ ์ด ๋์ํ๋์ง ํ์ธํด๋ดค๋ค.
-> ํ ์คํธ ์ํ ๊ฒฐ๊ณผ ์ด๋ก๋น์ด ๋๋ฉด ํ ์คํธ ์ฑ๊ณต!
๐ฅ ์ฐธ๊ณ
์คํ๋ง ๋ถํธ์ ์๋ฌด๋ฐ ์ค์ ๋ ํ์ง ์์ผ๋ฉด h2 DB ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋๋ก JVM ์์์ ์คํํ๋ค.
3๏ธโฃ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ดํด๋ณด๊ธฐ
- Querydsl ๋ผ์ด๋ธ๋ด ์ดํด๋ณด๊ธฐ
querydsl-apt : Querydsl ๊ด๋ จ ์ฝ๋ ์์ฑ ๊ธฐ๋ฅ ์ ๊ณต
querydsl-jpa: querydsl ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์คํ๋ง ๋ถํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ดํด๋ณด๊ธฐ
spring-boot-starter-web
spring-boot-starter-tomcat: ํฐ์บฃ (์น์๋ฒ)
spring-webmvc: ์คํ๋ง ์น MVC
spring-boot-starter-data-jpa
spring-boot-starter-aop
spring-boot-starter-jdbc : HikariCP ์ปค๋ฅ์ ํ
hibernate + JPA : ํ์ด๋ฒ๋ค์ดํธ + JPA
spring-data-jpa : ์คํ๋ง ๋ฐ์ดํฐ JPA
spring-boot-starter (๊ณตํต)
: ์คํ๋ง ๋ถํธ + ์คํ๋ง ์ฝ์ด + ๋ก๊น
spring-boot : spring-core
spring-boot-starter-logging : logback, slf4j
- ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
spring-boot-starter-test
junit : ํ ์คํธ ํ๋ ์์ํฌ, ์คํ๋ง๋ถํธ 2.2 ๋ถํฐ junit5 ์ฌ์ฉ
mockito : ๋ชฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
assertj : ํ ์คํธ ์ฝ๋๋ฅผ ์ข ๋ ํธํ๊ฒ ์์ฑํ๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
spring-test: ์คํ๋ง ํตํฉ ํ ์คํธ ์ง์
โญ๏ธ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์คํ๋ง MVC
- JPA, ํ์ด๋ฒ๋ค์ดํธ
- ์คํ๋ง ๋ฐ์ดํฐ JPA
- QueryDSL
๐ ๊ธฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- h2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ผ์ด์ธํธ
- ์ปค๋ฅ์ ํ: ๋ถํธ ๊ธฐ๋ณธ์ HicariCP
- ๋ก๊น slf4j & Logback
- ํ ์คํธ
4๏ธโฃ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์น
: ๊ฐ๋ฐ์ด๋ ํ ์คํธ ์ฉ๋๋ก ๊ฐ๋ณ๊ณ ํธ๋ฆฌํ DB, ์น ํ๋ฉด ์ ๊ณต
5๏ธโฃ ์คํ๋ง ๋ถํธ ์ค์ - JPA, DB
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:
format_sql: true
logging:
level:
org.hibernate.SQL: debug
org.hibernate.type: trace
spring.jpa.hibernate.ddl-auto: create
: ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ํ ์ด๋ธ์ ๋ชจ๋ drop ํ๊ณ ๋ค์ ์์ฑํ๋ค.
-> ํ ์คํธ ์ฉ๋๋ก๋ง ์ถ์ฒ..!!!
โ๏ธ์ฐธ๊ณ : ๋ชจ๋ ๋ก๊ทธ ์ถ๋ ฅ์ ๊ฐ๊ธ์ ๋ก๊ฑฐ๋ฅผ ํตํด ๋จ๊ฒจ์ผ ํ๋ค.
jpa.properties.hiberante.show_sql : true
-> show_sql ์ต์ ์ System.out์ ํ์ด๋ฒ๋ค์ดํธ ์คํ sql์ ๋จ๊ธฐ๊ธฐ ๋๋ฌธ์ ์ถ์ฒ x
logging.level.org.hibernate.SQL: debug
-> ์ด ์ต์ ์ logger๋ฅผ ํตํด์ ํ์ด๋ฒ๋ค์ดํธ ์คํ sql์ ๋จ๊ธด๋ค. ์ด๊ฑฐ ์ฌ์ฉ!
๐ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋ก๊ทธ ๋จ๊ธฐ๊ธฐ
logging.level.org.hibernate.type = trace
-> SQL ์คํ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ก๊ทธ๋ก ๋จ๊ธด๋ค.
๐ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋ก๊ทธ ๋จ๊ธฐ๊ธฐ
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'
build.gradle์ ์ถ๊ฐ
โ๏ธ์ฐธ๊ณ
์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ก๊ทธ๋ก ๋จ๊ธฐ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์คํ ์์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ ๋จ๊ณ์์๋ ํธํ๊ฒ ์ฌ์ฉํด๋ ๋์ง๋ง,
์ด์์์คํ ์ ์ ์ฉํ๊ธฐ ์ํด์๋ ๊ผญ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.