지연로딩과 즉시로딩
2021. 1. 20. 15:59ㆍJPA/JPA
지연로딩(fetch = FetchType.LAZY)
- A엔티티가 B엔티티를 참조하고 있다고 하자
- 지연로딩은 A엔티티를 조회할때 A엔티티 정보만 SELECT하고 B엔티티 정보는 SELECT하지 않다가 B엔티티 정보를 참조할때 B엔티티 정보를 SELECT하는 것.
- A엔티티를 조회할 시점에 B타입의 프록시를 생성하여 대체.
- 프록시는 B타입을 상속받아 구현.
- B엔티티 정보를 조회해야할때 프록시는 영속성 컨텍스트에 초기화 요청을 하면 영속성 컨텍스트가 B엔티티 정보를 DB에 요청하여 받아서 B엔티티를 생성해주고 프록시는 생성된 B엔티티 객체를 참조하여 데이터를 읽어온다.
즉시로딩(fetch = FetchType.EAGER)
- 즉시로딩은 A엔티티를 조회할때 B엔티티 정보도 같이 조인하여 전부 가져오는 것.
즉시로딩의 주의점
- 실무에서는 지연로딩으로만 사용해라
- 즉시로딩을 사용하면 예상치 못한 SQL이 생성된다.
- 즉시로딩은 JPQL에서 N+1문제를 일으킨다. N+1문제란 A엔티티의 리스트를 조회(1)하게되면 A엔티티 리스트의 수(N)만큼 B엔티티의 SELECT 쿼리가 생성되는 것.
- @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> LAZY로 설정
- @OneToMany, @ManyToMany는 기본이 지연 로딩
- 즉시로딩을 사용하지 말고 JPQL fetch 조인이나, 엔티티 그래프 기능을 사용해라
'JPA > JPA' 카테고리의 다른 글
임베디드 타입, @Embeddable, @Embedded (0) | 2021.01.21 |
---|---|
cascade, orphanRemoval (0) | 2021.01.20 |
상속관계 매핑 (0) | 2021.01.19 |
연관관계 매핑 (0) | 2021.01.19 |
기본키 매핑 어노테이션 정리 @Id, @GeneratedValue, @SequenceGenerator, @TableGenerator (0) | 2021.01.18 |