QueryDSL을 사용하게된 이유, 그리고 장점

jonghyukLee·2022년 8월 30일
0
post-thumbnail

안녕하세요.
현재 진행중인 프로젝트에 QueryDSL을 사용하게 되었는데, 사용하게 된 이유와 QueryDSL을 사용했을 때 얻을 수 있는 장점, 그리고 간단한 사용 방식에 대해서 정리 해보겠습니다.

QueryDSL

정적 타입을 이용하며 문자가 아닌 코드로 SQL 쿼리를 작성할 수 있게 해주고, 쿼리를 생성해주는 프레임워크

사용 이유

Spring Data JPA의 기본 기능으로 구현하기 까다로운 메서드를 JPQL로 작성할 때, 쿼리가 복잡할 경우 문자열이 길어진다.
또한, 런타임 시점에서 에러가 발생했을 때, 한 눈에 문법적 오류를 파악하기 힘들다.

장점

  • 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 발견할 수 있다.
  • 동적 쿼리 작성이 편하다.
  • 쿼리결과의 재사용이 가능하다.
  • IDE를 사용할 경우 자동완성을 활용할 수 있다.

QueryDSL적용

build.gradle

  • buildscript
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
  • plugins

id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"

  • dependencies
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 추가 끝

코드

DTO

@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;
}
  • DTO 클래스에 생성자 위치에 @QueryProjection 어노테이션을 붙이면, 빌드 시 Q타입의 DTO클래스가 생성된다.

컴파일

  • compileQuerydsl 눌러서 컴파일, build success 확인

구현

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

profile
머무르지 않기!

0개의 댓글