반응형
쿼리를 소스로 작성해야 하는 경우가 있는데 세련 된 방식으로 사용할 수 있도록 도와줍니다.
SQL, JPQL을 코드로 작성을 도와주는 빌더 API입니다.
JPA에서 제공하는 @Query에서 다양한 조회를 하기에는 다소 한계가 있는데
이를 해결하기 위한 조회 프레임워크로 querydsl이 있습니다.
JPA를 좀더 효율적으로 사용할 수 있도록 도와줍니다.
관련 정보는 아래 사이트에서 얻을 수 있습니다.
www.querydsl.com/static/querydsl/4.0.1/reference/ko-KR/html_single/
1. 의존성 추가
apply plugin: "io.spring.dependency-management"
compile("com.querydsl:querydsl-core") // querydsl
compile("com.querydsl:querydsl-jpa") // querydsl
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정
annotationProcessor("jakarta.persistence:jakarta.persistence-api")
annotationProcessor("jakarta.annotation:jakarta.annotation-api")
def generated='src/main/generated'
sourceSets {
main.java.srcDirs += [ generated ]
}
tasks.withType(JavaCompile) {
options.annotationProcessorGeneratedSourcesDirectory = file(generated)
}
clean.doLast {
file(generated).deleteDir()
}
2. gradle의 complieJava 실행
Q로 시작하는 entity들이 생성됩니다.
3. QuerydslConfig 생성
package com.otrodevym.spring.base.common.Querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Configuration
public class QuerydslConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
3. 테스트 방법
3-1 DB 생성
create table querydsl_test (
id int not null auto_increment,
name char(50) not null,
primary key (id)
);
3-2. QuerydslTest 생성
package com.otrodevym.spring.base.common.Querydsl;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class QuerydslTest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Builder
public QuerydslTest(String name) {
this.name = name;
}
}
3-3. QuerydslRepository 생성
package com.otrodevym.spring.base.common.Querydsl;
import org.springframework.data.jpa.repository.JpaRepository;
public interface QuerydslRepository extends JpaRepository<QuerydslTest, Long> {
}
3-4. QuerydslRepositorySupportMy 생성
package com.otrodevym.spring.base.common.Querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
import org.springframework.stereotype.Repository;
import java.util.List;
import static com.otrodevym.spring.base.common.Querydsl.QQuerydslTest.querydslTest;
@Repository
public class QuerydslRepositorySupportMy extends QuerydslRepositorySupport {
private final JPAQueryFactory jpaQueryFactory;
public QuerydslRepositorySupportMy(JPAQueryFactory jpaQueryFactory) {
super(QuerydslTest.class);
this.jpaQueryFactory = jpaQueryFactory;
}
public List<QuerydslTest> findByName(String name) {
return jpaQueryFactory
.selectFrom(querydslTest)
.where(querydslTest.name.eq(name))
.fetch();
}
}
3-5. QuerydslController 생성
package com.otrodevym.spring.base.common.Querydsl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/dsl")
public class QuerydslController {
@Autowired
private QuerydslRepository querydslRepository;
@Autowired
private QuerydslRepositorySupportMy querydslRepositorySupportMy;
@GetMapping("name")
public void QuerydslNameTest() {
String name = "test";
querydslRepository.save(new QuerydslTest(name));
List<QuerydslTest> list = querydslRepositorySupportMy.findByName(name);
list.forEach(querydslTest -> System.out.println(querydslTest.getName()));
}
}
3-6. Postman 테스트
3-7. 결과
반응형
'개발(합니다) > Java&Spring' 카테고리의 다른 글
[spring boot 설정하기-8] security 설정 및 테스트 소스 (1) | 2021.04.14 |
---|---|
[spring boot 설정하기-7] restdocs 설정 및 테스트 소스 (0) | 2021.04.10 |
[spring boot 설정하기-5] liquibase 설정 및 연동 (0) | 2021.04.08 |
[spring boot 설정하기-4] Swagger 설정 및 사용 방법 (0) | 2021.04.07 |
[spring boot 설정하기-3.2] JPA 설정 및 사용 방법 (0) | 2021.04.06 |