TIL(Today I Learned)

[Spring] QueryDSL 관련 코드 정리

yunseohhe 2024. 10. 10. 21:13

build.gradle

// querydsl
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"

 

QueryDslConfig

package org.example.expert.config;

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

@Configuration
public class QueryDslConfig {

    @PersistenceContext
    private EntityManager em;

    @Bean
    public JPAQueryFactory jpaQueryFactory() {
        return new JPAQueryFactory(JPQLTemplates.DEFAULT, em);
    }
}

 

위에 2가지를 설정했으면 자동으로 Q클래스가 생성됩니다.

그리고 파일 루트는 밑의 사진처럼 ".build" 하위에 생성되는 것이 정상입니다.

설정 후 1
설정 후 2

 


QueryRepository

QueryRepository를 만든다.

(밑에는 예시 코드이다.)

package org.example.expert.domain.todo.repository;

import org.example.expert.domain.todo.entity.Todo;

import java.util.Optional;

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

 

QueryRepositoryImpl

QueryRepository를 구현할 클래스를 만든다.

(밑에는 예시 코드이다.)

package org.example.expert.domain.todo.repository;

import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.example.expert.domain.todo.entity.Todo;
import org.springframework.stereotype.Repository;

import java.util.Optional;

import static org.example.expert.domain.todo.entity.QTodo.todo;
import static org.example.expert.domain.user.entity.QUser.user;

@Repository
@RequiredArgsConstructor
public class TodoQueryRepositoryImpl implements TodoQueryRepository {

    private final JPAQueryFactory queryFactory;

    @Override
    public Optional<Todo> findByIdWithUser(Long todoId) {

        Todo result = queryFactory
                .selectFrom(todo)
                .leftJoin(todo.user, user).fetchJoin()
                .where(todo.id.eq(todoId))
                .fetchOne();

        return Optional.ofNullable(result);
    }

}

 

Repository

밑의 사진과 같이 기존 Repository에서 다중 상속을 받는다.

(QueryDSL을 사용하기 위해 기존에 사용하였던 메서드는 주석처리 또는 삭제해준다.

왜냐면  QueryRepositoryImpl 클래스 파일에서 구현했기때문이다.)