Java & Spring/Spring

JPA - Querydsl 사용법 및 실습

DJ.Kang 2024. 10. 4. 14:36

1. build.gradle 설정

dependencies {

    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

// Querydsl 설정부
def generated = 'src/main/generated'

tasks.withType(JavaCompile).configureEach {
    options.getGeneratedSourceOutputDirectory().set(file(generated))
}

clean {
    delete file (generated)
}

 

2. gradle실행(clean -> build)

 

3. QClass 생성 확인

 

4. JpaRepository와 함께 사용하기 위해 JPAQueryFactory Bean등록

@Configuration
public class QueryDslConfig {

    @PersistenceContext
    private EntityManager entityManager;

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

 

※ 아래 JPQL코드를 QueryDsl을 사용하여 실행해보려고한다.

 public interface TodoRepository extends JpaRepository<Todo, Long>, CustomTodoRepository {
    @Query("SELECT t FROM Todo t " +
            "LEFT JOIN t.user " +
            "WHERE t.id = :todoId")
    Optional<Todo> findByIdWithUser(@Param("todoId") Long todoId);
    }

 

1. CustomTodoRepository interface 구현

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

 

2. TodoRepositoryImpl 구현

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

@RequiredArgsConstructor
public class TodoRepositoryImpl implements CustomTodoRepository{

    @Autowired
    private final JPAQueryFactory jpaQueryFactory;

    @Override
    public Optional<Todo> findByIdWithUser(Long todoId) {
        return Optional.ofNullable(
                jpaQueryFactory
                        .selectFrom(todo)
                        .leftJoin(todo.user, user).fetchJoin()
                        .where(todo.id.eq(todoId))
                        .fetchOne()
        );
    }
}
  • JPAQueryFactory를 @Autowired해준다.
  • QClass들을 import해준다.
  • Optional.ofNullable()로 감싸서 null에 대한 처리를 한다.
  • jpqQueryFactory를 사용해서 쿼리문을 작성한다.
  • fetchJoin()을 사용해서 N+1문제를 예방한다.