Programming/JPA

JPA - 즉시 로딩, 지연 로딩

잇(IT) 2023. 7. 17. 11:22

- 지연 로딩

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn
private Team team;

- fetch = FetchType.LAZY로 설정하게 되면 지연 로딩으로 변경된다.

- 지연 로딩이란 해당 객체를 프록시 객체를 생성하여 객체를 참조하는 것이다.

Member member = new Member();
member.setUsername("member1");
member.setTeam(teamA);
em.persist(member);

em.flush();
em.clear();

Member m = em.find(Member.class, member.getId());

- 지연 로딩으로 설정했을 경우 Member를 조회 했을 때 Member 객체에 대해서만 쿼리를 날리고 Team에 대한 정보는 찾아오지 않는 것을 확인 할 수 있다.

Member member = new Member();
member.setUsername("member1");
member.setTeam(teamA);
em.persist(member);

em.flush();
em.clear();

Member m = em.find(Member.class, member.getId());

m.getTeam().getName();

- 이 때 team 객체에 대한 정보를 찾아오는 메서드를 실행하게 되면 그때서야 team에 대한 쿼리를 통해 DB에서 team에 대한 정보를 가져오는 것을 확인할 수 있다.


- 즉시 로딩

 

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn
private Team team;

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

- 즉시 로딩을 사용하게 되면 Team 객체가 속한 Member 객체 조회 시 Team 객체의 데이터까지 조회하게 된다.

Member member = new Member();
member.setUsername("member1");
member.setTeam(teamA);
em.persist(member);

em.flush();
em.clear();

Member m = em.find(Member.class, member.getId());

- Member 객체에 대해서만 조회를 하여도 Team 객체까지 쿼리를 날려 조회하는 것을 확인할 수 있다.

 

- 프록시와 즉시로딩 주의

1. 실무에선 거의 지연 로딩만 사용한다.

2. 즉시 로딩은 예상하지 못한 SQL이 발생하고, JPQL에서 N+1 문제를 일으킨다.

3. @ManyToOne @OneToOne은 기본이 즉시 로딩이기 때문에 LAZY로 설정을 변경해주어야 한다.

4. @OneToMany, @ManyToMany는 기본이 지연 로딩이다.

 

1. 모든 연관관계에 지연 로딩을 사용하는 것이 좋다.

2. 실무에서 즉시 로딩을 사용하지 않는다.

3. JPQL fetch 조인이나, 엔티티 그래프 기능을 사용해면 된다.

4. 즉시 로딩은 상상하지 못한 쿼리가 나간다.

 

 

 

 

 

 

 

 

 

 

 

출처 : 인프런 - 우아한 형제들 기술이사 김영한의 스프링 완전 정복 (자바 ORM 표준 JPA 프로그래밍 - 기본편)

728x90

'Programming > JPA' 카테고리의 다른 글

JPA - 임베디드 타입  (0) 2023.07.17
JPA - 영속성 전이(CASCADE)와 고아 객체  (0) 2023.07.17
JPA - 프록시  (0) 2023.07.17
JPA - 고급 매핑  (0) 2023.07.14
JPA - 다양한 연관관계 매핑  (0) 2023.07.14