카테고리 없음
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 방지)
- 전체 로직의 응답속도 향상