지연로딩
fetch = FetchType.LAZY
- 지연 로딩 LAZY을 사용해서 프록시로 조회
- member1.getTeam().getName() ==> 실제 team을 사용하는 시점에 초기화(DB 조회)
즉시로딩
fetch = FetchType.EAGER
- Member조회시 항상 Team도 조회(프록시가 아니라 진짜 엔티티를 가져옴)
프록시와 즉시 로딩시 주의
- 가급적 지연 로딩만 사용(특히 실무에서)
- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
- 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
- @ManyToOne, @OneToOne은 기본이 즉시 로딩-> LAZY로 설정
- @OneToMany, @ManyToMany는 기본이 지연 로딩
결론 : 모든 연관관계에 지연 로딩을 사용해라! 실무에서 즉시 로딩은 상상하지 못한 쿼리가 나갈 수 있기에 사용하지 마라!
N+1문제
- 즉시 로딩 사용시 JPQL로 쿼리를 작성했을 때 멤버 객체(1)를 조회할 목적으로 사용했는데 멤버들과 관계되어 있는 팀(N)도 같이 조회하게 된다.