[QueryDSL] 1. QueryDSL ์†Œ๊ฐœ

2022. 10. 5. 17:07ใ†์ธํ”„๋Ÿฐ/์‹ค์ „! QueryDSL

728x90

 

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

 

์‹ค์ „! Querydsl - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

Querydsl์˜ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค๋ฌด ํ™œ์šฉ๊นŒ์ง€, ํ•œ๋ฒˆ์— ํ•ด๊ฒฐํ•ด๋ณด์„ธ์š”!, - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ...

www.inflearn.com

์ธํ”„๋Ÿฐ - ์‹ค์ „! QueryDSL ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ , ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‡

 

 

1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ์„ค์ • 

https://start.spring.io/

์Šคํ”„๋ง ๋ถ€ํŠธ ์Šคํƒ€ํ„ฐ์— ๋“ค์–ด๊ฐ€์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด ์ค„ ๊ฒƒ์ด๋‹ค. 

 

์‚ฌ์šฉ ๊ธฐ๋Šฅ: 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 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์น˜ 

https://www.h2database.com

: ๊ฐœ๋ฐœ์ด๋‚˜ ํ…Œ์ŠคํŠธ ์šฉ๋„๋กœ ๊ฐ€๋ณ๊ณ  ํŽธ๋ฆฌํ•œ 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์— ์ถ”๊ฐ€ 

 

โ—๏ธ์ฐธ๊ณ 

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋กœ๊ทธ๋กœ ๋‚จ๊ธฐ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹œ์Šคํ…œ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, 

์šด์˜์‹œ์Šคํ…œ์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ผญ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

 

 

 

 

 

 

 

 

728x90