[Spring Boot] JPA 즉시 로딩과 지연 로딩(FetchType.EAGER or LAZY)

[Spring Boot] JPA 즉시 로딩과 지연 로딩(FetchType.EAGER or LAZY)

블로그 프로젝트 진행 중 FetchType.LAZY와 EAGER이란 것이 나왔다.

하나의 게시물을 눌렀을 때, 화면에 필수적으로 나타나야 하는 것은

  • 작성자
  • 제목
  • 내용

위 3가지가 있었고 있었고, 댓글은 바로 보여지는 경우와 접혀있다가 눌렀을 때 보이는 경우로 나눌 수 있었다.


JPA의 기본 패치 전략

- @ManyToOne, @OneToOne: 즉시로딩(FetchType.EAGER)

- @OneToMany, @ManyToMany : 지연로딩(FetchType.LAZY)

JPA의 기본 패치 전략으로 인해 ManyToOne은 EAGER, OneToMany는 LAZY로 되어있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Board {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment
private int id;

@Column(nullable = false, length = 100)
private String title;

@Lob // 대용량 데이터
private String content; // 섬머노트 라이브러리 <html>태그가 섞여서 디자인이 됨.

@ColumnDefault("0")
private int count; // 조회수

@ManyToOne(fetch = FetchType.EAGER) // Many = Board, One = User ==> 한명의 유저는 여러개의 보드를 쓸 수 있다.
@JoinColumn(name = "userId")
private User user; // DB는 object를 저장할 수 없어서 Foreign key를 사용하지만, 자바는 오브젝트를 저장할 수 있다.

@OneToMany(mappedBy = "board", fetch = FetchType.LAZY) // 하나의 게시물은 여러개의 답변을 가질 수 있다.
// mappedBy 연관관계의 주인이 아니다. (FK가 아니다) DB에 컬럼 생성X
private List<Reply> reply;

@CreationTimestamp
private Timestamp createDate;
}


1. 댓글이 바로 보이는 경우

즉시로딩 fetch = FetchType.EAGER을 사용하면 된다.

2. 댓글을 접어놓았을 경우

지연로딩 fetch = FetchType.LAZY를 사용하면 된다.

나는 댓글을 바로 Load할 것이기 때문에 답변 부분의 OneToMany JPA의 기본패치 전략 LAZY즉시로딩 EAGER로 바꿔줄 것이다.

1
2
3
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER) // 하나의 게시물은 여러개의 답변을 가질 수 있다.
// mappedBy 연관관계의 주인이 아니다. (FK가 아니다) DB에 컬럼 생성X
private List<Reply> reply;

[Spring Boot] JPA 즉시 로딩과 지연 로딩(FetchType.EAGER or LAZY)

https://devch.co.kr/2021/07/16/SPRINGBOOT-JPA-21-07-16/

Author

Chaehyeon Lee

Posted on

2021-07-16

Updated on

2021-07-16

Licensed under

댓글