본문 바로가기
개발진행목록/게시판 서비스

[JPA로 게시판 만들기] 지연로딩 적용

by o3oppp 2025. 2. 5.
지연로딩
  • 필요한 시점에 연관된 객체의 데이터를 불러오는 것
  • @xxToxx(fetch = FetchType.LAZY)
  • 먼저 프록시를 가져온 후, 실제 사용 시 초기화(DB쿼리가 나감)
  • xToOne 관계의 경우 디폴트는 EAGER(즉시로딩)이므로 변경 필요

지연로딩 적용
package project.post.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Entity
@Getter
@Setter
public class Post {

    @Id
    @GeneratedValue
    @Column(name = "post_id")
    private Long id;

    private String title;
    private String content;

    @ManyToOne(fetch = FetchType.LAZY) // 지연로딩 적용
    @JoinColumn(name = "member_id")
    private Member member;

    @Enumerated(EnumType.STRING)
    private PostStatus status;
    private LocalDateTime postDate;

    public void update(String title, String content, PostStatus status, LocalDateTime postDate){
        this.title = title;
        this.content = content;
        this.status = status;
        this.postDate = postDate;
    }
}

게시글 목록을 조회할 때, 데이터는 정상적으로 출력되었으나 로그 상 쿼리를 보면 2번 실행되고 있는것을 확인할 수 있다. 게시글 목록을 조회하고(1번), SELECT 결과의 Member가 존재하기에 연관된 Member를 또 조회한다(2번). N+1문제가 발생하였으며, 복잡한 연관관계의 경우 여러번 실행되어 성능 저하를 일으킬 수 있다고 생각하였다. 그래서 지연로딩을 적용하였다.

지연로딩 적용 전

지연로딩 적용 후