본문 바로가기
웹개발/spring && springboot

스프링 JPA QueryDSL

by 지구별 여행자 임탱 2024. 4. 3.
728x90

JPA(Java Persistence API)와 QueryDSL을 함께 사용하면, 복잡한 쿼리를 타입 안전하게 작성할 수 있으며, 동적 쿼리를 편리하게 구성할 수 있습니다. QueryDSL은 JPA의 강력한 파트너로, 개발자가 SQL이나 JPQL을 직접 작성하는 대신, 자바 코드로 쿼리를 표현할 수 있게 해줍니다.

 

QueryDSL의 기본 개념
 타입 안전성: QueryDSL은 컴파일 시점에 쿼리의 문법 오류를 잡아내므로, 런타임 시점의 오류를 줄일 수 있습니다.
 동적 쿼리: 복잡한 조건에 따라 쿼리를 동적으로 생성할 수 있어, 다양한 비즈니스 로직에 유연하게 대응할 수 있습니다.
 IDE 지원: 자동 완성과 같은 IDE의 지원을 받을 수 있어, 쿼리 작성이 더욱 편리해집니다.

 

QueryDSL 적용 방법
  의존성 추가: 프로젝트에 QueryDSL 관련 의존성을 추가합니다.

// build.gradle 예시
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor 'com.querydsl:querydsl-apt'


엔티티에 대한 Q 클래스 생성: QueryDSL은 엔티티 클래스를 기반으로 Q 클래스를 생성합니다. 이 Q 클래스를 사용하여 쿼리를 구성합니다.
리포지토리에서 QueryDSL 사용: 생성된 Q 클래스를 사용하여 리포지토리에서 쿼리를 구성하고 실행합니다

@Repository
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
    private final JPAQueryFactory queryFactory;

    public UserRepositoryCustomImpl(EntityManager em) {
        this.queryFactory = new JPAQueryFactory(em);
    }

    @Override
    public List<User> findUsersByCondition(String condition) {
        return queryFactory
                .selectFrom(user)
                .where(user.name.eq(condition))
                .fetch();
    }
}

 

장점
 - 복잡한 쿼리나 특정 데이터베이스 기능을 사용해야 할 때, 직접 쿼리를 작성함으로써 더 정밀한 제어가 가능합니다.
 - 특정 쿼리에 대해 데이터베이스 수준에서 성능 최적화를 진행할 수 있으며, 이는 JPA 메소드 기반 쿼리보다 더 효율적일 수 있습니다.


단점
 - JPQL이나 Native Query는 문자열 기반으로 작성되므로, 컴파일 시점에 타입 체크가 이루어지지 않아 오류 발생 가능성이 높습니다.
 - 쿼리가 복잡해질수록 이해하고 유지보수하기 어려워질 수 있으며, 특히 Native Query의 경우 데이터베이스에 종속적이어서 이식성이 낮습니다.
 - 조건에 따라 쿼리를 동적으로 변경해야 하는 경우, 문자열을 조작하는 방식으로 구현해야 하므로 코드가 복잡해지고 오류가 발생하기 쉽습니다.