백엔드 부트캠프/TIL

[내일배움캠프Spring-55일차] Qeury Dsl 설정하기

sintory-04 2025. 5. 7. 15:04

1. Gradle 설정

dependencies {
    // Query Dsl
    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"
}

// Querydsl generated 경로 설정
def querydslDir = "build/generated/querydsl"

tasks.withType(JavaCompile) {
    options.generatedSourceOutputDirectory = file(querydslDir)
}

clean {
    delete file(querydslDir)
}

- 의존성에는 위와 같이 추가했고, 추가적으로 Generated 경로를 설정해주었다.

- 블로그들 다양하게 참고해보았지만, 이상하게,, 몇몇은 안되었지만 해당 설정은 잘 되는 거같다 !

- 여기서 중요한건 Spring 3.0 이상 버전이라는 것 !

2. 애플리케이션 실행

- 애플리케이션 실행할 때, 사진 과 같이 QEntity 가 생성되었는지 확인 해야한다.

- 만약 잘 되지 않을 시, 파일을 삭제하고 다시 실행하는 등의 행위를 해야한다.

3. Config 설정

- 저렇게 generated 가 생성된 것이라면 ! 반은 온 것이다.

- QueryDSL 를 사용할 것이라고 이제 Config 설정을 해주어야하

package org.example.expert.config;

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@RequiredArgsConstructor
public class QuerydslConfig {

    private final EntityManager entityManager;

    @Bean
    public JPAQueryFactory jpaQueryFactory() {
        return new JPAQueryFactory(entityManager);
    }
}

4. Repository Interface 만들기

public interface TodoCustomRepository {
    Optional<Todo> findByIdWithUser(Long todoId);
}

5. TodoCustomRepositoryImpl 만들기

@Repository
@RequiredArgsConstructor
public class TodoCustomRepositoryImpl implements TodoCustomRepository{

    private final JPAQueryFactory jpaQueryFactory;

    @Override
    public Optional<Todo> findByIdWithUser(Long todoId) {
        return Optional.ofNullable(
                jpaQueryFactory
                        .selectFrom(todo)
                        .leftJoin(todo.user).fetchJoin()
                        .where(todo.id.eq(todoId))
                        .fetchOne()
        );
    }
}

- 이렇게 설정하면 끝 : > !