본문 바로가기
개발공부 개발새발/DB

JPA) 즉시로딩과 지연로딩???

by 휴일이 2022. 11. 25.



지연 로딩

@ManyToOne(fetch = FetchType.LAZY) //team을 지연로딩 하겠어!
@JoinColumn(name = "TEAM_ID")
private Team team

지연 로딩???
얘는 일단 프록시 객체로 두겠어~(안불러올거임)
실제로 얘를 사용하는 시점에 초기화 할거야~
그 전엔 프록시객체임(껍데기만 가져옴)


즉시 로딩

@ManyToOne(fetch = FetchType.EAGER) //team을 즉시로딩 하겠어!
@JoinColumn(name = "TEAM_ID")
private Team team

즉시 로딩???
얘는 둘 다 함께 자주 쓰이니까 엔티티 초기화 둘이 같이 해줘~(쿼리 함께 바로ㄱㄱ)
JPA 구현체는 가능하면 조인을 사용해서 SQL 한번에 함께 조회




그런데... 즉시로딩 쓰지 마세염~

- 가급적 지연 로딩만 사용해요
ㄴ 성능 떨어짐, 복잡한 테이블이 얽혀있다면 더 문제, 걍 지연로딩 ㄱㄱ
- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생한다
- 즉시 로딩은 JPQL에서 N+1 문제를 일으킴
ㄴ 쿼리 하나 날렸는데 N개의 문제가?!
- @ManyToOne, @OneToOne은 기본이 즉시로딩, LAZY 지연로딩으로 설정하세연
- @OneToMany, @ManyToMany는 기본이 지연로딩

1) 걍 먼저 지연로딩으로 깔음 ㄱㄱ
2) 필요할 때만 fetch join 해서 같이 가져오기



결론
- 모든 연관관계에 지연 로딩 쓰세연
- 즉시로딩 XXXXX 제발스지마연
- 같이 가져오고 싶으면 JPQL fetch 조인이나, 엔티티 그래프 기능 쓰세연
- 즉시 로딩은 쓰지마...상상못한 쿼리가 널 기다려~

728x90