2021.12.12 - [Spring/Spring Data JPA] - [Spring Data JPA] 연관 관계 자식(하위) Entity 작성 - QuickStart 3
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에서 참고 가능합니다.
댓글