티스토리 뷰
해당 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의를 수강하고 정리한 게시글입니다.
즉시 로딩과 지연 로딩
여기서 의문 : 단순히 member 정보만 사용하는 비즈니스 로직인데, Member를 조회할 때 Team도 함께 조회해야 할까?
예시) println(member.getName());
- 지연 로딩
: Member와 Team에서 Team을 거의 사용하지 않을 때
- [지연 로딩(LAZY)을 사용해서 프록시로 조회]
Member member = em.find(Member.class, 1L);
Team team = member.getTeam();
team.getName(); // 실제 team을 사용하는 시점에 초기화(DB 조회)
즉시 로딩
: Member와 Team을 자주 함께 사용할 때
- [즉시 로딩(EAGER), Member조회시 항상 Team도 조회]
JPA 구현체는 가능하면 조인을 사용해서 SQL 한번에 함께 조회
프록시와 즉시로딩 주의
- 가급적 지연 로딩만 사용(특히 실무에서)
- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
- 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
(N+1 문제 : 쿼리 하나를 날렸는데 추가로 N개의 쿼리가 나가는 것)
객체 하나를 가져오는데 EAGER가 붙은 모든 객체에 쿼리를 날림
select * from Member, select * from Team … - @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> LAZY로 설정
- @OneToMany, @ManyToMany는 기본이 지연 로딩
LAZY로 다만들고 같이 가져와야할 때는 join fetch를 JPQL로 사용하면 됨, 어노테이션으로 해결하는 방법 등도 있음
지연 로딩 활용(이론적)
- Member와 Team은 자주 함께 사용 -> 즉시 로딩
- Member와 Order는 가끔 사용 -> 지연 로딩
- Order와 Product는 자주 함께 사용 -> 즉시 로딩
(실무에서는 전부 지연로딩으로 발라야함)
지연로딩 활용 - 실무
- 모든 연관관계에 지연로딩을 사용해라!
- 실무에서 즉시 로딩을 사용하지 마라
- JPQL fetch 조인이나, 엔티티 그래프 기능을 사용해라!
- 즉시 로딩은 상상하지 못한 쿼리가 나간다.
'Backend > JPA' 카테고리의 다른 글
[JPA] 10. JPA에서 값 타입 (0) | 2022.01.26 |
---|---|
[JPA] 09. 영속성 전이 : CASCADE (0) | 2022.01.25 |
[JPA] 07. 프록시와 연관관계 정리 (0) | 2022.01.23 |
[JPA] 06. 고급 매핑 (상속관계 매핑) (0) | 2022.01.22 |
[JPA] 05. 다양한 연관관계 매핑 (0) | 2022.01.21 |
댓글