반응형
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);
}
}
결과
'Web > Spring' 카테고리의 다른 글
[Spring Cloud] Eureka 서버 기동하기 (0) | 2022.08.18 |
---|---|
[Spring] 트랜잭션 전파(Transactional Propagation) (0) | 2022.07.13 |
[스프링구조] 스프링에서의 싱글톤 (0) | 2022.05.18 |
[Spring] 프로젝트 tomcat 서버 url (Context-path) 변경 (feat.오늘의삽질) (0) | 2020.08.18 |
[Spring] Spring 프로젝트 구동시 xml 구동원리 (0) | 2020.08.16 |
댓글