1. 최적화 전
- 게시글과 태그의 중간테이블 게시글-태그 테이블 존재

- 게시글의 응답형태 작성시 태그목록을 조회하는 쿼리를 호출중 ⇒ N+1발생
//게시글 응답 dto 생성
private ArticleResponse createArticleResponse(Atricle article){
List<String> tags = articleTagReadService.getTags(article);
return new ArticleResponse(article, tags);
}
//태그 목록 가져오기
public List<String> getTags(Article article){
return articleTagRepository.findByArticle(article)
.stream().map(data -> data.getTag().getTagName())
.toList();
}
public class Article {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id")
private Category category;
}
- 내가 작성한 댓글 조회시 연관된 객체의 id 이외의 데이터를 활용 ⇒ N+1 발생
//내가 작성한 댓글
public Page<CommentResponse> getMyComments(CustomUser customUser, Pageable pageable){
Member member = memberReader.getById(customUser.getMemberId());
return commentRespository.findAllByMember(member, pageable)
.map(CommentRespose::new);
}
//id 이외의 값을 참조하고 있음
public CommentReseponse(Comment comment){
this(commet.getId(), comment.getContent(),
comment.getMember().getNickname(),
comment.getMember().getId(),
comment.getCreatedAt(), comment.getUpdatedAt());
}
- 게시글 상세 댓글 목록조회에서 댓글응답형태 생성중 객체의 id 이외의 데이터 활용 ⇒ N + 1 발생
//게시글 상세 댓글 목록조회
public Page<CommentArticleResepone> getComments(Long articleId, Pageable pageable){
if(!articleRepository.existsById(articleId){
throw new CMissingDataException("존재하지 않는 게시글입니다.");
}
return commentRepository.findByArticle_IdAndParentId(articleId, 0L, pageable)
.map(comment -> new CommentArticleResponse(comment, getReplies(comment)));
}
//id 이외의 값을 참조하고 있음
public CommentArticleResponse(Comment comment, List<Reply> replies){
this(
comment.getId(),
comment.getContent(),
comment.getMember().getNickname(),
comment.getMember().getId(),
comment.getCreatedAt(),
comment.getUpdatedAt(),
replies
};
- 엔티티에서 연관관계를 설정할 때
@ManyToOne(fetch = FetchType.LAZY)로 설정되어 있어서 목록조회시 응답형태를 생성할 때 N+1이 발생하고 있다.