지연로딩
- 필요한 시점에 연관된 객체의 데이터를 불러오는 것
- @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문제가 발생하였으며, 복잡한 연관관계의 경우 여러번 실행되어 성능 저하를 일으킬 수 있다고 생각하였다. 그래서 지연로딩을 적용하였다.
지연로딩 적용 전
지연로딩 적용 후
'개발진행목록 > 게시판 서비스' 카테고리의 다른 글
[JPA로 게시판 만들기] Spring Interceptor를 사용한 인증 체크 (0) | 2025.03.04 |
---|---|
[JPA로 게시판 만들기] Session을 사용한 로그인, 로그아웃 (1) | 2025.02.19 |
[JPA로 게시판 만들기] API 개발 (0) | 2025.02.05 |
[JPA로 게시판 만들기] 테스트 코드 작성 (0) | 2025.01.23 |
[JPA로 게시판 만들기] TDD, BDD 란 (1) | 2025.01.23 |