공부하다죽어라
article thumbnail
Published 2021. 6. 10. 13:48
[JPA] QueryDsl Maven 설정 개발/JAVA
QueryDSL이란

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

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

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

Maven 설정은 다음과 같다.

 

1. pom.xml

 

<plugins>
			....
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/java</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            ....
 <plugins>  

 

 

        <!-- QueryDSL APT Config -->
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>${querydsl.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- QueryDSL JPA Config -->
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${querydsl.version}</version>
        </dependency>

 

 

 

2. 엔티티 클래스 생성 (Hello.java)

 

package com.book.userservice;

import lombok.AccessLevel;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Hello {
    @Id @GeneratedValue
    private Long id;
    private String name;

    public Hello(String name){
        this.name = name;
    }
}

 

테스트하고싶은 엔티티를 생성합니다.

 

 

3. Generate Sources and Update Folders

 

QHello가 자동으로 생성된 모습

 

mvn clean install 을 실행하면, target/generated-sources/java 디렉토리에 Query가 생성됩니다.

 

 

4. 테스트 코드 작성

 

package com.book.userservice;

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import static org.assertj.core.api.Assertions.assertThat;

@Transactional
@SpringBootTest
class HelloTest {

    @PersistenceContext
    EntityManager em;

    @Test
    void contextLoads() {
        Hello hello = new Hello("TEST");

        em.persist(hello);

        em.flush();
        em.clear();
        QHello h = new QHello("m"); // variable -> 별칭
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);

        Hello data = queryFactory
                .selectFrom(h)
                .fetchOne();

        assertThat(data.getName()).isEqualTo("TEST");

    }
}

 

다음은 단위테스트 결과입니다.

 

 

성공적으로 Hibernate가 쿼리를 작성한 모습을 볼 수 있습니다.

 

이렇게 Maven 기반 QueryDsl 설정을 마쳤습니다.

첫줄에서 말했듯이 QueryDsl은 동적쿼리를 쉽게 만들어주고 JPQL에서 String type으로 쿼리를 작성하던 것 과는 다르게 컴파일 레벨에서 오류를 잡아줘서 개발자들의 생산성을 올리는데 매우 좋습니다. 짱짱!

'개발 > JAVA' 카테고리의 다른 글

[JPA] 영속성 컨텍스트  (0) 2021.05.14
profile

공부하다죽어라

@슥혁

감사합니다 👍🏻