💤 Lazy Loading (지연 로딩)이란?
- 데이터를 실제 사용할 때만 DB에서 조회하는 방식
🚀 설정 방법:
@ManyToOne(fetch = FetchType.LAZY)
private Company company;
🎭 특징:
getCompany().getName()) → 그 순간 SQL 실행JOIN 방지 → 성능 최적화 ⚡ 언제 쓰나?
🔎 Lazy Loading 실행 흐름
Tutor 조회 시 Company는 Proxy로 반환getCompany() 호출 시 Proxy 객체 확인 가능getCompany().getName() 접근 순간 SQL 실행 → Company 초기화👉 결과: 필요한 순간에만 DB 조회
⚡ Eager Loading (즉시 로딩)이란?
- 엔티티를 조회할 때 연관된 데이터까지 모두 한 번에 로드하는 방식
🚀 설정 방법:
@ManyToOne(fetch = FetchType.EAGER)
private Company company;
🎭 특징:
Tutor 조회 시 Company도 즉시 JOIN 해서 함께 조회⚡ 언제 쓰나?
JOIN이 더 효율적인 경우🚨 즉시 로딩 주의점
1. 예상치 못한 SQL 실행 → 불필요한 JOIN 발생 ❌
2. N+1 문제 발생 ⚠️
3. 기본 fetch 전략 차이:
@OneToMany, @ManyToMany → 기본값: LAZY@ManyToOne, @OneToOne → 기본값: EAGERLAZY로 바꿔 쓰는 게 안전 👍🛠️ N+1 문제 해결 방법
Fetch Join (JPQL) → 가장 많이 사용 select t from Tutor t join fetch t.company@EntityGraph@BatchSizeNative Query🧠 요약 정리
| 구분 | Lazy Loading 💤 | Eager Loading ⚡ |
|---|---|---|
| DB 조회 시점 | 실제 값에 접근할 때 | 엔티티 조회 시 즉시 |
| 조회 객체 | Proxy 객체(가짜) 🎭 | 실제 엔티티 |
| SQL 실행 방식 | 필요한 시점마다 실행 | JOIN으로 한 번에 실행 |
| 장점 | 불필요한 쿼리 방지, 성능 최적화 | 항상 함께 조회 시 편리 |
| 단점 | 준영속 상태 접근 시 예외 ⚠️ | 예상 못한 JOIN, N+1 문제 발생 |
| 적합한 경우 | 연관 객체를 가끔 사용할 때 | 연관 객체를 항상 사용할 때 |