안녕하세요.
현재 진행중인 프로젝트에 QueryDSL을 사용하게 되었는데, 사용하게 된 이유와 QueryDSL을 사용했을 때 얻을 수 있는 장점, 그리고 간단한 사용 방식에 대해서 정리 해보겠습니다.
정적 타입을 이용하며 문자가 아닌 코드로 SQL 쿼리를 작성할 수 있게 해주고, 쿼리를 생성해주는 프레임워크
Spring Data JPA의 기본 기능으로 구현하기 까다로운 메서드를 JPQL로 작성할 때, 쿼리가 복잡할 경우 문자열이 길어진다.
또한, 런타임 시점에서 에러가 발생했을 때, 한 눈에 문법적 오류를 파악하기 힘들다.
- 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 발견할 수 있다.
- 동적 쿼리 작성이 편하다.
- 쿼리결과의 재사용이 가능하다.
- IDE를 사용할 경우 자동완성을 활용할 수 있다.
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
implementation"com.querydsl:querydsl-jpa:${queryDslVersion}"
annotationProcessor"com.querydsl:querydsl-apt:${queryDslVersion}"
//querydsl 추가 시작
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 추가 끝
@QueryProjection
public UserCompanyResponse(String companyName, String companyLocation, String companyPhone, String companyIntroduction, List<BusinessHour> businessHours, String profile, String qnaLink, String instaLink, List<CompanyLink> etcLinks) {
this.companyName = companyName;
this.companyLocation = companyLocation;
this.companyPhone = companyPhone;
this.companyIntroduction = companyIntroduction;
this.businessHours = businessHours;
this.profile = profile;
this.qnaLink = qnaLink;
this.instaLink = instaLink;
this.etcLinks = etcLinks;
}
public class UserRepositoryImpl implements UserRepositoryCustom {
private final JPAQueryFactory queryFactory;
public UserRepositoryImpl(EntityManager em) {
queryFactory = new JPAQueryFactory(em);
}
@Override
public UserCompanyResponse getCompanyByDomain(String companyDomain) {
return queryFactory.select(new QUserCompanyResponse(
user.companyName,
user.companyLocation,
user.companyPhone,
user.companyIntroduction,
user.businessHours,
user.profile,
user.qnaLink,
user.instaLink,
user.etcLinks))
.from(user)
.where(user.companyDomain.eq(companyDomain))
.fetchOne();
}
}
출처: 김영한님의 실전! Querydsl