swimminginthecode DIVE!

BACK/Spring

JPA - QueryDSL

dazz6 2024. 12. 5. 18:00

JPA를 사용하면서 SQL 과 비슷한듯 다른 JPQL Query가 제일 어려웠다...

웬만하면 이름 규칙으로 해결하면서 작업했지만... 쿼리를 코드로 작성할 수 있다고 해서 적용해 보았다.

 

굳이 JavaScript에서 TypeScript를 사용해서 작은 실수들을 잡아 주는 것처럼

컴파일 시점에 오류를 잡을 수 있기 때문에 일석이조!

implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

의존성을 추가해 준다.

여러 블로그를 보면서 의존성을 추가해 봤는데 오류가 죽어도 해결이 안 되었고...

버전 문제인 건 알지만 그 어떤 포스팅의 해결법도 적용이 안 되었으나

어떤 딱 하나의 블로그를 보고 https://velog.io/@juhyeon1114/Spring-QueryDsl-gradle-%EC%84%A4%EC%A0%95-Spring-boot-3.0-%EC%9D%B4%EC%83%81

겨우 해결했다!!! (감사합니다)

@Configuration
public class QueryDslConfig {
    @Bean
    public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
        return new JPAQueryFactory(entityManager);
    }
}

@Configuration 어노테이션으로 의존성 주입을 위한 클래스를 하나 만들어 준다.

public interface ExampleRepositoryDSL {
    List<Example> findByCategoryAndEtc(String ex1, String ex2);
}

public interface ExampleRepository extends JpaRepository<Example, Integer>, ExampleRepositoryDSL {
}

JpaRepository를 상속받은 ExampleRepository가 이미 존재하는 가정 하에

Custom Repository를 만들어 준 다음 ExampleRepository 상속에 추가해 준다.

이후에는 ExampleRepository의 메소드를 사용해 줬던 것처럼 ExampleRepositoryDSL의 메소드를 사용할 수 있다.

@Repository
@RequiredArgsConstructor
public class ExampleRepositoryDSLImpl implements ExampleRepositoryDSL {

    private final JPAQueryFactory queryFactory;

    @Override
    public List<Example> findByCategoryAndEtc(String ex1, String ex2) {
        QExample example = QExample.example;

        return queryFactory.selectFrom(example)
                .where(
                        Example.category.eq(ex1),
                        Example.category.eq(ex2)
                )
                .fetch();
    }
}

ExampleRepositoryDSL의 메소드를 Override 하여 쿼리를 지정해 준다.

JPQL을 코드로 풀어서 쓴다고 생각하면 된다.

 

QueryDSL을 사용하면 IntelliJ의 자동완성을 사용하여 실수 확률을 줄일 수 있고 속도도 빠르다!

가독성도 좋아서 추후 수정이 필요할 때 유지보수가 용이할 것 같다.