1. 최적화 전

스크린샷 2025-11-05 오전 9.38.59.png

//게시글 응답 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;
}
//내가 작성한 댓글
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());
}
//게시글 상세 댓글 목록조회
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
};
  1. 엔티티에서 연관관계를 설정할 때 @ManyToOne(fetch = FetchType.LAZY)로 설정되어 있어서 목록조회시 응답형태를 생성할 때 N+1이 발생하고 있다.