본문 바로가기
Spring/Spring Data JPA

[Spring Data JPA] Fetch Join (N + 1 Issue) - QuickStart 4

by 임채훈 2021. 12. 12.

2021.12.12 - [Spring/Spring Data JPA] - [Spring Data JPA] 연관 관계 자식(하위) Entity 작성 - QuickStart 3

2021.12.12 - [Spring/Spring Data JPA] - [Spring Data JPA] JPA Entity, Repository, Service 클래스 작성 (조회 및 저장) - QuickStart 2

2021.12.12 - [Spring/Spring Data JPA] - [Spring Data JPA] 예제 프로젝트 생성 및 초기 환경 구성 - QuickStart 1

 

이전글에 이어서 작성합니다.

 

# 해당 시리즈 게시글은 Notion에서 작성된 내용을 그대로 옮겨오는 과정에서 서식의 깨짐 및 부자연스러움이 발생할 수 있습니다. 

 

Fetch Join (N + 1 Issue) - JPQL

  • io.starter.jpatutorial.domain.repository.PostMariaRepository
@Repository
public interface PostMariaRepository extends JpaRepository<PostJpo, Long> {
    @Query("SELECT P FROM PostJpo P LEFT OUTER JOIN FETCH P.comments")
    List<PostJpo> findAllFetchJoin();
}

여기서 @Query 애노테이션에 작성하는 유사 SQL은 JPA 고유의 JPQL이라는 문법을 사용할 수 있습니다.

게시글과 댓글의 연관 관계를 고려하여 Left Outer Join으로 수행하도록 합니다.

  • io.starter.jpatutorial.service.PostListService
@Service
@RequiredArgsConstructor
public class PostListService {
    private final PostMariaRepository postMariaRepository;

    @Transactional(readOnly = true)
    public List<Post> fetch() {
        return postMariaRepository.findAllFetchJoin()
                .stream()
                .map(Post::jpoOf)
                .collect(Collectors.toList());
    }
}

fetch 메소드의 조회 로직을 약간 수정해준 뒤 전체 게시글을 조회하는 테스트 로직을 수행해보면 아래와 같이 한방 쿼리로 이전과 동일한 결과 데이터가 조회되는것을 알 수 있습니다.


프로젝트 전체 소스 코드는 아래 Github에서 참고 가능합니다.

Github Source Code

 

GitHub - youspend8/spring-data-jpa-tutorial

Contribute to youspend8/spring-data-jpa-tutorial development by creating an account on GitHub.

github.com

댓글