[Spring Data JPA] One에서 Many를 fetch하며 페이징할 때
[SpringBoot / JPA] JPA Batch Size에 대한 고찰
Board Entity
@Entity
@Getter
@NoArgsConstructor
public class Board extends BaseTimeEntity {
@Id @GeneratedValue
@Column(name = "BOARD_ID")
private Long id;
@Column(nullable = false)
private String title;
private String content;
@Column(name = "VIEW_COUNT")
private int viewCount;
private String category;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MEMBER_ID")
public Member member;
@OneToMany(mappedBy = "board", fetch = FetchType.LAZY)
public List<Comment> comments = new ArrayList<>();
@OneToMany(mappedBy = "board", fetch = FetchType.LAZY)
public List<FileEntity> files = new ArrayList<>();
Board Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
// 게시글 상세 조회
@Query(value = "SELECT b FROM Board b JOIN FETCH b.member JOIN FETCH b.comments JOIN FETCH b.files WHERE b.id = :boardID")
Optional<Board> findByIdWithMemberAndCommentsAndFiles(Long boardID);
// 첫 페이징 화면("/")
@Query(value = "SELECT b FROM Board b JOIN FETCH b.member JOIN FETCH b.comments")
Page<Board> findAllWithMemberAndComments(Pageable pageable);
// 제목 검색
@Query(value = "SELECT b FROM Board b JOIN FETCH b.member JOIN FETCH b.comments WHERE b.title LIKE %:title%")
Page<Board> findAllTitleContaining(String title, Pageable pageable);
// 내용 검색
@Query(value = "SELECT b FROM Board b JOIN FETCH b.member JOIN FETCH b.comments WHERE b.content LIKE %:content%")
Page<Board> findAllContentContaining(String content, Pageable pageable);
// 작성자 검색
@Query(value = "SELECT b FROM Board b JOIN FETCH b.member JOIN FETCH b.comments WHERE b.member.username LIKE %:username%")
Page<Board> findAllUsernameContaining(String username, Pageable pageable);
}
JPA 로 개발을 할때, 컬렉션을 Fetch Join 하면 페이징 조회 시 메모리에서 페이징 처리하는 문제 + 페이징을 사용할 수 없는 문제가 있다. 아래와 같은 경고가 발생하거나, 원하는 데이터가 출력되지 않는다.
HHH000104: firstResult/maxResults specified with collection fetch; applying in memory!
👉JPA를 사용할 때 유의해야할 점인데 잊고 있었다. 페이징처리를 해야 하는데 어떻게 해야할까?