Today
-
Yesterday
-
Total
-

ABOUT ME

-

  • Spring Boot | Querydsl, Gradle 설정하기 (Eclipse)
    ▼ Backend/└ QueryDsl 2021. 10. 19. 13:12
    반응형

    ▶ Querydsl이란

    Querydsl 정적 타입을 이용해서 SQL과 같은 쿼리를 생성 할 수 있도록 해 주는 (JPQL 사용성을 높이기 위해 확장한) 프레임워크다. 문자열로 작성하거나 XML 파일에 쿼리를 작성하는 대신, Querydsl이 제공하는 플루언트(Fluent) API를 이용해서 쿼리를 생성할 수 있다.

     

    사용 이유에는 여러 가지가 있지만..

    • JPQL을 사용하더라도, 복잡한 로직의 경우 개행이 포함된 쿼리 문자열이 길어지기 때문에
    • 동적 쿼리를 메소드로 구조화하여 관리를 편하게 하기 위해

    단순 문자열과 비교해서 Fluent API를 사용할 때의 장점은 다음과 같다.

    • IDE의 코드 자동 완성 기능 사용
    • 문법적으로 잘못된 쿼리를 허용하지 않음
    • 도메인 타입과 프로퍼티를 안전하게 참조할 수 있음
    • 도메인 타입의 리팩토링을 더 잘할 수 있음

     

    build.gradle

    전체 설정에 대한 코드를 올렸지만 아래 부분만 추가하면 된다.

    // Querydsl START
     ... 
    // Querydsl END
     안의 내용만 추가한다.

    추가 후 적용한다.
    프로젝트 우 클릭  →  Gradle  →  Refresh Gradle Project

     

    buildscript {
        ext {
            queryDslVersion = "5.0.0"
        }
    }
    
    plugins {
        id 'org.springframework.boot'
        version '2.5.5'
        id 'io.spring.dependency-management'
        version '1.0.11.RELEASE'
        id 'java'
        id 'war'
        // Querydsl START
        id "com.ewerk.gradle.plugins.querydsl"
        version "1.0.10"
        // Querydsl END
    }
    
    group = 'sample'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: '*.jar')
    
        // Querydsl START
        implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
        implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
        // Querydsl END
    
        implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    
    test {
        useJUnitPlatform()
    }
    
    //Querydsl START
    def querydslDir = "$buildDir/generated/querydsl"
    
    querydsl {
        jpa = true
        querydslSourcesDir = querydslDir
    }
    
    sourceSets {
        main.java.srcDir querydslDir
    }
    
    configurations {
        querydsl.extendsFrom compileClasspath
    }
    
    compileQuerydsl {
        options.annotationProcessorPath = configurations.querydsl
        // querydslDir 경로에 존재하는 파일을 삭제하는 코드, 필요시 주석해제
        //if (file(querydslDir).exists()) delete(file(querydslDir))
    }
    //Querydsl END

     

     

    Gradle Tasks build
    Gradle Tasks 탭에서 해당 프로젝트 선택  →  build 우 클릭 Run Gradle Tasks

    Gradle Tasks 탭이 없는 경우
    상단 탭 Window  →  Show View  →  other  →  gradle 검색  →  Gradle Task

     

     

     

    build(빌드)가 완료되면 build.gradle에서 설정했던
    def querydslDir = "$buildDir/generated/querydsl"

    부분에 따라서 해당 경로에 QClass들이 생성된다.

     

    /프로젝트경로/build/generated

     

     

    이제 생성된 QClass 경로를 프로젝트 Java Build Path에 추가한다.

    프로젝트 우 클릭   Build Path    Configure Build Path..
    Add Folder.. 를 통해 생성된 경로를 querydsl 경로까지 추가한다.

     

     

     

    JPAQueryFactory를 Bean으로 등록한다.

     

    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import com.querydsl.jpa.impl.JPAQueryFactory;
    
    @Configuration
    public class QueryDslConfig {
    
        @PersistenceContext
        private EntityManager entityManager;
    
        @Bean
        public JPAQueryFactory jpaQueryFactory() {
            return new JPAQueryFactory(entityManager);
        }
    }

     

     

    jpaQueryFactory를 이용해 QAdmin의 admin 엔티티를 select 한다.

    그 외에 조건, 조인, 그룹, 서브 쿼리 등을 사용할 수 있다.
    https://querydsl.com/static/querydsl/4.0.1/reference/ko-KR/html_single/#intro

     

    import com.querydsl.jpa.impl.JPAQueryFactory;
    import lombok.RequiredArgsConstructor;
    import org.springframework.stereotype.Repository;
    
    @RequiredArgsConstructor
    @Repository
    public class AdminRepository {
    	
    	private final JPAQueryFactory jpaQueryFactory;
        	private QAdmin admin = QAdmin.admin;
     
    	public List<Admin> findAll() {
    		return jpaQueryFactory.from(admin).fetch();
    	}
        
        	public Admin findByLgnId(String lgnId) {
    		return jpaQueryFactory.from(admin).where(admin.lgnId.eq(lgnId)).fetchOne();
    	}
     }
    반응형

    댓글

Designed by Tistory.