본문 바로가기
Web/Spring

[Query dsl] maven QueryDsl 설정

by Geunny 2022. 7. 11.
반응형
QueryDSL이란

Querydsl 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 프레임워크. 

 

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>

 

 

사용법

Entity 클래스 작성

 

package com.chk.reservation.template.entity;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

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

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class TestEntity {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

 

2. Repository

 

Repository 작성시 JPARepository 를 사용할 경우, QueryDsl 을 이용하는 인터페이스를 JPARepository에 상속받아 사용할 수 있다.

인터페이스의 경우 xxxCustomRepository로 명명, 구현체의 경우 xxxRepositoryImpl로 작성.

구현체의 명명을 xxxRepositoryImpl로 작성하지 않으면 QueryDsl에서 해당 인스턴스를 찾지 못함.

 

사용될 엔티티는 id,name 값만 가진 매우 간단한 객체로 만듬.

 

@Entity
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class TestEntity {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

 

TestRepository

import com.chk.reservation.template.entity.TestEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface TestRepository extends JpaRepository<TestEntity, Long> , TestCustomRepository{
}

 

TestCustomRepository

public interface TestCustomRepository {
    List<TestEntity> findAllTest();
}

TestRepositoryImpl

import java.util.List;

import static com.chk.reservation.template.entity.QTestEntity.testEntity;

@RequiredArgsConstructor
public class TestRepositoryImpl implements TestCustomRepository{

    private final JPAQueryFactory factory;

    @Override
    public List<TestEntity> findAllTest() {
        return factory.selectFrom(testEntity).fetch();
    }
}

여기서 사용되는 testEntity는 Q클래스를 생성해 주어야 사용 가능함.

Q클래스는 Entity 클래스 작성후 인텔리제이 기준 아래 기능으로 생성가능하다.

Gradle의 경우 Q클래스를 build해주는 작업을 build.gradle에 작성해 주어야 한다.

 

또한 xxxRepositoryImpl 에서 사용되는 JPAQueryFactory 객체를 Bean으로 등록해 주어야 사용가능하다.

 

@Configuration
@EnableJpaAuditing
public class JPAConfig {

    private final EntityManager entityManager;

    public JPAConfig(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Bean
    public JPAQueryFactory jpaQueryFactory(){
        return new JPAQueryFactory(entityManager);
    }

}

스프링에서 사용되는 EntityManager를 주입받아 JPAQueryFactory를 빈으로 등록해 준다.

 

사용될 서비스 객체

 

TestService

@Service
@RequiredArgsConstructor
public class TestService {

    private final TestRepository repository;

    public List<TestEntity> findAllTest(){
        return repository.findAllTest();
    }
}

 

3. 테스트 코드 작성

 

테스트 데이터

TestServiceTest

 

@SpringBootTest
class TestServiceTest {

    @Autowired
    private TestService testService;

    @Test
    void 전체조회(){
        assertThat(testService.findAllTest().size()).isEqualTo(4);
    }

}

 

결과

 

댓글