Skip to content

feat(todo): QueryDSL로 할 일 단건 조회 구현#8

Merged
usersy628 merged 1 commit into
devfrom
feature/lv8
Jun 16, 2026
Merged

feat(todo): QueryDSL로 할 일 단건 조회 구현#8
usersy628 merged 1 commit into
devfrom
feature/lv8

Conversation

@usersy628

Copy link
Copy Markdown
Owner

작업 내용

  • 기존 JPQL로 작성되어 있던 findByIdWithUser를 QueryDSL 기반 구현으로 변경했습니다.
  • QueryDSL 사용을 위해 의존성과 JPAQueryFactory 설정을 추가했습니다.
  • TodoRepositoryCustom, TodoRepositoryImpl을 추가하여 커스텀 Repository 구조로 분리했습니다.
  • 할 일 단건 조회 시 User 연관관계를 fetchJoin으로 함께 조회하도록 구현했습니다.
  • 이를 통해 단건 조회 응답 생성 과정에서 todo.getUser() 접근 시 추가 조회 쿼리가 발생하지 않도록 개선했습니다.

변경 파일

  • build.gradle

    • QueryDSL JPA 의존성 추가
    • QueryDSL annotation processor 설정 추가
  • PersistenceConfig

    • JPAQueryFactory Bean 등록
  • TodoRepository

    • TodoRepositoryCustom 상속 추가
    • 기존 JPQL 기반 findByIdWithUser 제거
  • TodoRepositoryCustom

    • findByIdWithUser 커스텀 메서드 선언
  • TodoRepositoryImpl

    • QueryDSL을 사용한 findByIdWithUser 구현
    • leftJoin(todo.user).fetchJoin()으로 User 연관관계 함께 조회
  • TodoRepositoryTest

    • QueryDSL Repository 테스트를 위해 PersistenceConfig import
    • 테스트용 User, Todo 데이터를 직접 저장한 뒤 조회 검증

주요 변경 내용

기존 JPQL 기반 조회를 제거했습니다.

@Query("SELECT t FROM Todo t " +
    "LEFT JOIN t.user " +
    "WHERE t.id = :todoId")
Optional<Todo> findByIdWithUser(@Param("todoId") Long todoId);

QueryDSL 커스텀 구현으로 변경했습니다.

@Override
public Optional<Todo> findByIdWithUser(Long todoId) {
    Todo foundTodo = queryFactory
            .selectFrom(todo)
            .leftJoin(todo.user).fetchJoin()
            .where(todo.id.eq(todoId))
            .fetchOne();

    return Optional.ofNullable(foundTodo);
}

테스트 방법

Repository 테스트를 통해 findByIdWithUser가 Todo와 User를 함께 조회하는지 확인했습니다.

@DataJpaTest
@Import(PersistenceConfig.class)
class TodoRepositoryTest {
    // 테스트용 User, Todo 저장 후 findByIdWithUser 조회 검증
}

테스트에서 확인한 내용은 다음과 같습니다.

  • 테스트용 UserTodo를 저장합니다.
  • 저장한 Todo의 id로 findByIdWithUser를 호출합니다.
  • 조회 결과가 존재하는지 확인합니다.
  • 조회된 Todo에서 User 정보에 접근했을 때 정상적으로 값이 조회되는지 확인합니다.

해결한 문제

기존 JPQL 조회 방식은 과제 요구사항인 QueryDSL 전환 대상이었습니다.

이번 수정으로 findByIdWithUser를 QueryDSL로 전환했고, fetchJoin을 사용하여 할 일 단건 조회 시 필요한 작성자 정보를 함께 조회하도록 했습니다.

고민한 부분

  • Spring Data JPA Repository에 QueryDSL 구현을 붙이기 위해 Custom Repository 구조를 사용했습니다.
  • Service 코드는 기존처럼 todoRepository.findByIdWithUser(todoId)를 호출하도록 유지하여 변경 범위를 줄였습니다.
  • Todo.user는 LAZY 연관관계이므로 단건 조회 응답 생성 시 추가 쿼리가 발생하지 않도록 fetchJoin을 적용했습니다.
  • @DataJpaTest에서는 일반 설정 Bean이 자동으로 포함되지 않을 수 있어, 테스트에서 PersistenceConfig를 import하여 JPAQueryFactory Bean을 사용할 수 있도록 했습니다.

- QueryDSL 의존성 및 JPAQueryFactory 설정 추가
- TodoRepository 커스텀 구현체 추가
- findByIdWithUser를 QueryDSL fetchJoin 기반으로 전환
- 할 일 단건 조회 시 User 연관관계를 함께 조회하도록 수정
@usersy628 usersy628 merged commit cf7e027 into dev Jun 16, 2026
@usersy628 usersy628 deleted the feature/lv8 branch June 16, 2026 01:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant