본문 바로가기

개발일지/TIL

[230704] 즉시 로딩과 지연 로딩?

즉시로딩 vs 지연로딩

❓JPA에서 즉시 로딩이란?
💬 즉시 로딩이란 DB에서 데이터를 조회할 때 연관관계가 있는 데이터들도 가져오는 것입니다.  
❓JPA에서 지연 로딩이란? 
💬 지연 로딩은 DB에서 데이터를 조회할 때 연관관계가 있는 데이터들을 Proxy로 대체를 해둡니다. 그리고 실제로 사용할 때 데이터를 가져옵니다.
❓둘 중 어느 것이 Default로 설정이 되어있나요?
✅ ManyToOne, OneToOne 경우 Default는 즉시 로딩입니다. ManyToMany, ManyToOne 경우 Default는 지연 로딩입니다.

 

public @interface ManyToOne {
    FetchType fetch() default FetchType.EAGER;
}
 
public @interface OneToOne {
    FetchType fetch() default FetchType.EAGER;
}

public @interface ManyToMany {
    FetchType fetch() default FetchType.LAZY;
}

public @interface OneToMany {
    FetchType fetch() default FetchType.LAZY;
}
❓그렇다면 Default를 그대로 쓰면 되는 건가? 아니면 무엇을 써야 하는가?
💬 즉시 로딩을 사용하는 경우 한 번에 가져올 수 있다는 장점이 있지만, 연관관계가 많다면 N+1문제가 발생할 수 있다. N+1문제의 경우 1개의 요청에 N개의 요청이 따라붙는 건데, 성능 문제를 야기할 수 있다. 그래서 지연 로딩을 기본으로 사용하는 것을 권장하는 것 같다.

생각

JPA에서 즉시로딩과 지연로딩의 차이를 알 수 있었다. 그리고 거기에서 생기는 N+1 문제가 무엇이고 그로 인해 발생할 수 있는 성능 이슈를 알 수 있었다. 이후에는 나도 프로젝트를 할 때 지연로딩을 설정해서 N+1로 생길 수 있는 성능 이슈를 예방해 봐야겠다.