카테고리 없음

TIL 성능향상

creator7087 2025. 4. 10. 12:20

📌 일대다(1:N) 연관관계 최적화

 

📌 What I Learned

JPA에서 fetch join을 사용하면 연관된 엔티티들을 한 번의 쿼리로 조회할 수 있어서 N+1 문제를 방지하고 성능을 크게 개선할 수 있다.

⚙️ 상황 설명

게시물에 달린 댓글(Comment)에 대해 권한 검사를 하는 로직이 있었음.
댓글 작성자와 게시물 작성자가 아닌 경우를 확인하는 조건문:


if (!userId.equals(comment.getUser().getId())&&!userId.equals(comment.getPost().getUser().getId())) {
    throw new CustomException(ErrorCode.UNAUTHORIZED_USER_ID);
}

이때 comment.getUser()나 comment.getPost().getUser()가 Lazy Loading 상태라면 각각 호출될 때 마다 추가 쿼리가 실행됨.

즉, 하나의 댓글을 불러왔더라도:

  • comment.getUser() → 추가 쿼리 1회
  • comment.getPost().getUser() → 추가 쿼리 1회
    총 3개의 쿼리 발생 (Comment, User, PostUser)

🚀 What I Did

fetch join을 통해 관련 엔티티들을 한 번에 조회하도록 Repository 수정:

@Query("SELECT c FROM Comment c JOIN FETCH c.user JOIN FETCH c.post p JOIN FETCH p.user WHERE c.id = :commentId")
Optional<Comment> findWithUserAndPostUserById(@Param("commentId") Long commentId);

📈 결과

  • DB에 불필요한 쿼리 요청이 줄어들어 성능 향상
  • N+1 문제 예방
  • 엔티티 접근 시 LazyLoading으로 인한 예외 가능성 제거 (LazyInitializationException 방지)
  • 전체 로직의 응답속도 향상