JPA

QueryDSL 설정방법

심나라 2022. 10. 23. 12:00
728x90

 

QueryDSL은 JAP 표준은 아니고 오픈소스 프로젝트로, Criteria처럼 JPQL 빌더 역할을 합니다.

QueryDSL 설정방법에 대한 설명입니다.

 

 

개발환경

  • IntelliJ IDEA 2022.2 (Community Edition)
  • Spring Boot 2.7.4 (Java : 11)
  • Gradle 7.5
  • QueryDSL 5.0.0 (queryDsl 플러그인 : 1.0.10)

 

 

build.gradle 파일

buildscript {
	ext {
		queryDslVersion = "5.0.0"
	}
}

plugins {
	id 'org.springframework.boot' version '2.7.4'
	id 'io.spring.dependency-management' version '1.0.14.RELEASE'
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"	// queryDsl 플러그인 추가
	id 'java'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	//QueryDSL dependency 추가
	implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"		// QueryDSL JPA 라이브러리
	annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"	// 쿼리 타입(Q)을 생성할 때 필요한 라이브러리
}

// QueryDSL Script 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
}
// QueryDSL Script End

 

 

Member.java

@Data
@Entity
@Table(name="MEMBER")
public class Member {
    @Id
    @Column(name="ID")
    private String id;

    @Column(name="NAME", nullable=false, length=10)
    private String username;

    @Column(name="AGE")
    private Integer age;
}

 

 

QueryDslMain.java 

Querydsl 이 정상적으로 동작하는지 테스트 하기위한 파일 입니다. 

import com.querydsl.jpa.impl.JPAQueryFactory;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;

public class QueryDslMain {

    public static void main(String[] args) {

        // 엔티티 매니저 팩토리 - 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
        // 엔티티 매니저 - 생성
        EntityManager em = emf.createEntityManager();
        // 트랜잭션 - 획득
        EntityTransaction tx = em.getTransaction();

        try {
            tx.begin();     // 트랜잭션 - 시작
            queryDsl(em);   // 비즈니스 로직 실행
            tx.commit();    // 트랜잭션 - 커밋
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();     // 엔티티 매니저 - 종료
            emf.close();    // 엔티티 매니저 팩토리 - 종료
        }

    }
    private static void queryDsl(EntityManager em) {

        JPAQueryFactory query = new JPAQueryFactory(em);
        QMember qMember = new QMember("m");

        List<Member> memberList = query.selectFrom(qMember)
                .where(qMember.username.eq("hong"))
                .orderBy(qMember.id.desc())
                .fetch();

        for(Member member : memberList) {
            System.out.println("member : " + member);
        }

    }
}

 

[참고자료]

 

728x90