IT/development

[jpa] querydsl ์„ธํŒ…(feat. ํ™˜๊ฒฝ์„ค์ •๋งŒ ๋‹ค๋ฃธ)

์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž 2022. 11. 21.

๋ชฉ์ฐจ

    querydsl ์˜ˆ์ œ

     

    JPA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋™์  ๋ฐ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ querydsl์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜์ธ๋ฐ ์ด๊ฒŒ ์„ธํŒ…ํ•˜๊ธฐ๊ฐ€ ์ข€ ๊นŒ๋‹ค๋กœ์›€

    ๊ทธ๋ž˜์„œ ์ด ๊ณณ์— ๋‚ด๊ฐ€ ๋‚˜์ค‘์— ๋ณด๊ธฐ์œ„ํ•ด ๋ฉ”๋ชจ๋ฅผ ํ•ด๋‘ 

    ์ฒ˜์Œ ํ•œ๋ฒˆ๋งŒ ํ•ด๋‘๋ฉด ๋‚˜์ค‘์—” ๋ณต๋ถ™/์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋จ

    ์ด ๊ธ€์—์„œ๋Š” querydsl ๊ธฐ๋ณธ ์„ธํŒ… ๋ฐฉ๋ฒ•๋งŒ ๋‹ค๋ฃธ

     

    mybatis์™€ ๋น„๊ตํ•ด์„œ ๊ฐœ์ธ์ ์œผ๋กœ ์ œ์ผ ์ข‹์€ ์ ์€ mybatis๋Š” ๋Ÿฐํƒ€์ž„ ๋•Œ ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ๋Œ๋ ค๋ด์•ผ์ง€๋งŒ ์—๋Ÿฌ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ querydsl์€ ์ž๋ฐ”์ฝ”๋“œ๋ผ์„œ ์˜คํƒˆ์ž๊ฐ€ ๋ฌธ๋ฒ• ์—๋Ÿฌ๊ฐ€ ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ๋‹จ๊ณ„์—์„œ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

    querydsl ์„ธํŒ… ๋ฐฉ๋ฒ• ๐Ÿ˜Ž

    build.gradle ์„ค์ • ๐Ÿ˜„

    // ์Šคํ”„๋ง๋ถ€ํŠธ 2.6x ๋ฒ„์ „์—์„œ ์„ธํŒ…ํ•จ
    
    buildscript {
        ext {
            queryDslVersion = "5.0.0"
        }
    }
    
    plugins {
        id 'org.springframework.boot' version '2.6.12'
        id 'io.spring.dependency-management' version '1.0.14.RELEASE'
        //querydsl ์ถ”๊ฐ€
        id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
        id 'java'
    }
    
    group = 'study'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'
    
    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        //querydsl ์ถ”๊ฐ€
        implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
        implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8'
    
        annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"
        compileOnly 'org.projectlombok:lombok'
        runtimeOnly 'com.h2database:h2'
        annotationProcessor 'org.projectlombok:lombok'
        //ํ…Œ์ŠคํŠธ์—์„œ lombok ์‚ฌ์šฉ
        testCompileOnly 'org.projectlombok:lombok'
        testAnnotationProcessor 'org.projectlombok:lombok'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    
    //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 ์ถ”๊ฐ€ ๋
    
    tasks.named('test') {
        useJUnitPlatform()
    }

     

    complieQuerydsl ๐Ÿ˜™

    build.gradle์— ์„ค์ • ์ถ”๊ฐ€ ํ›„ ์ธํ…”๋ฆฌ์ œ์ด ๊ธฐ์ค€์œผ๋กœ ํ•˜๋‹จ์˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์šฐ์ธก Gradle์˜ compileQuerydsl ์„ ํƒํ•ด์„œ ์ปดํŒŒ์ผ ์‹คํ–‰

    ๋นŒ๋“œ ์„ฑ๊ณต ์‹œ ์•„๋ž˜์ฒ˜๋Ÿผ build.gradle์—์„œ ์„ค์ •ํ•ด ๋†“์€ ๋นŒ๋“œ ๋””๋ ‰ํ† ๋ฆฌ์— Q๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์–ด ์žˆ๋‹ค.

    querydsl์—์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ด QํŒŒ์ผ์ด๋‹ค.

     

    ์ด์ œ querydsl์„ ์‚ฌ์šฉํ•  ์ค€๋น„๋Š” ๋‹ค ๋˜์—ˆ๋‹ค.

    ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด querydsl์„ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ EntityManager๋ฅผ ์ฃผ์ž… ๋ฐ›์•„ JPAQueryFactory๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ, ์ž์„ธํ•œ ๋ฌธ๋ฒ•์€ ์ฐจ์ฐจ ์˜ฌ๋ฆด ์˜ˆ์ •์ž„(์•„์ง ์ œ๋Œ€๋กœ ์ˆ™์ง€๊ฐ€ ๋œ๊ฒŒ ์•„๋‹ˆ๋ผ..)

    ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ์ทจํ–ฅ์— ๋”ฐ๋ผ  ๋‹ค์–‘ํ•จ

    ์‚ฌ์šฉ ๋ฌธ๋ฒ•์€ SQL๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค.(SELECT FROM...)

    JPAQueryFactory ์†Œ์Šค๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ EntityManager๋ฅผ parameter๋กœ ๋ฐ›๋Š”๊ฒŒ ๋ณด์ธ๋‹ค.

     

    ๋Œ“๊ธ€