지난 게시글에서 JPA의 N+1 발생에 대한 글을 작성하였다. 게시글 중에 Fetch Type이 즉시로딩인지 지연로딩인지에 따라서 연관된 객체를 가져오는 타이밍이 달랐는데, 그때 사용하는 즉시로딩, 지연로딩에 대해 알아보자
[항해 취업코스] 개발자 취준 기록 7일차 - N + 1 발생 이유와 해결방법
N + 1 연관 관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수(n)만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상 1:N 또는 N:1 관계를 가진 엔티티에서 발생한다. 현
skroy0513.tistory.com
Fetch Type
JPA가 하나의 Entity를 조회할 때, 연관관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정값이다.
JPA는 사용자가 직접 쿼리를 생성하지 않고, JPA에서 JPQL을 이용하여 쿼리문을 생성하기 때문에 객체와 필드를 보고 쿼리를 생성한다. 따라서, 다른 객체와 연관관계 매핑이 되어있으면 그 객체들까지 조회하게 되는데, 이때 이 객체를 어떻게 불러올 것인가를 설정할 수 있다.
Fetch Type의 디폴트 값을 @xxToOne에서는 즉시로딩(EAGER), @ xxToMany에서는 지연로딩(LAZY)이다.
즉시로딩 (EAGER)
데이터를 조회할 때, 연관된 모든 객체의 데이터까지 한 번에 불러오는 것이다.
@Entity
public class Post {
@Id @GeneratedValue
private Long id;
private String title;
private String content;
@ManyToOne(fetch = FetchType.EAGER) //User를 조회할 때 즉시로딩을 사용
@JoinColumn(name = "user_id")
User user;
}
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String username;
}
다음과 같이 즉시 로딩(EAGER) 방식을 사용하게 되면 Post를 조회하는 시점에 바로 User를 불러오는 쿼리를 날려 한꺼번에 데이터를 불러올 수 있다.
지연로딩(LAZY)
필요한 시점에 연관된 객체의 데이터를 불러오는 것이다.
@ManyToOne(fetch = FetchType.LAZY) // Post를 조회할 때 지연로딩을 사용
지연 로딩을 사용하면 Post를 조회하는 시점이 아닌 실제 User를 사용하는 시점에 쿼리가 나가도록 할 수 있는 장점이 있다.
그렇기 때문에 가급적이면 지연로딩을 사용하는 것이 좋다.
실전
Q. 즉시로딩과 지연로딩은 각각 언제 사용하면 좋을까요?
즉시로딩과 지연로딩은 데이터를 가져오는 방식에서 차이가 있습니다. 즉시로딩은 관련된 모든 데이터를 한 번에 로드하는 방식입니다. 주로 관련된 데이터가 항상 함께 사용되는 경우 유용합니다. 예를 들어 게시글과 유저가 연관관계를 가지고 있고 게시글을 불러올 때 유저 객체 안에 있는 닉네임, 프로필 이미지, 이메일 등 여러 정보가 함께 사용된다면 즉시로딩을 통해 한번에 모든 데이터를 불러오는 것이 유용합니다. 지연로딩은 데이터가 필요한 시점에만 로드하는 방식입니다. 많은 양의 데이터를 로드하지 않고 필요한 데이터만 로드하므로, 네트워크 트래픽을 줄이고 메모리 사용을 최적화할 수 있습니다.
보통은 지연로딩을 기본으로 사용합니다. 대부분의 상황에서 적합하며, 데이터를 효율적으로 관리할 수 있는 방법 중 하나이기 때문입니다. 하지만 연관된 데이터가 항상 함께 사용될 때나 데이터가 적을 때는 즉시로딩을 고려할 수 있습니다.
참고
항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
IT 커리어 성장 코스 항해99, 개발자 취업부터 현직자 코스까지
항해99는 실무에 집중합니다. 최단기간에 개발자로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.
hanghae99.spartacodingclub.kr
'멋진 개발자 > Java & Spring' 카테고리의 다른 글
[항해 취업코스] 개발자 취준 기록 19 - Filter, Interceptor, AOP (0) | 2024.03.13 |
---|---|
[항해 취업코스] 개발자 취준 기록 18 - Spring bean container의 생명주기 (0) | 2024.03.12 |
[항해 취업코스] 개발자 취준 기록 16 - N + 1 발생 이유와 해결방법 (0) | 2024.03.12 |
[항해 취업코스] 개발자 취준 기록 15 - Spring Security의 구조와 JWT 발급 과정 (0) | 2024.03.12 |
[항해 취업코스] 개발자 취준 기록 14 - Annotation (0) | 2024.03.10 |