엔티티의 관계 필드를 조회할 때 언제 데이터를 가져올지 정하는 정책이다.
즉시 로딩은 관련 데이터를 바로 함께 가져오는 방식이다.
지연 로딩은 실제 필요할 때까지 관련 데이터를 나중에 가져오는 방식이다.

1. 즉시 로딩 (EAGER)
@ManyToOne(fetch = FetchType.EAGER) private Department dept;
엔티티를 조회하는 순간 관계된 데이터를 같이 가져온다.
데이터베이스 쿼리가 JOIN 을 수행하여 한 번에 모든 데이터를 가져온다.
관계 필드를 바로 쓸 때 편리하지만 불필요한 데이터가 포함될 수 있다.
대형 테이블이 많을 경우 성능 저하와 메모리 사용량 증가를 유발한다.
주로 관계 필드가 항상 필요하고 조회 빈도가 높은 경우에 사용한다.
2. 지연 로딩 (LAZY)
@ManyToOne(fetch = FetchType.LAZY) private Department dept;
엔티티를 조회할 때 관계 데이터는 자동으로 가져오지 않는다.
만약 해당 필드를 직접 접근하면 그때서야 관련 데이터를 조회한다.
불필요한 JOIN 을 방지하여 전체 쿼리 수행 시간을 단축할 수 있다.
코드에서 관계 필드를 사용할 때 NullPointerException 에 주의해야 한다.
관계 필드가 항상 필요하지 않은 대부분의 경우에 이 방식을 사용한다.
3. 초기화 문제
Department dept = em.find(Department.class, 1L); // 엔티티만 조회
System.out.println(dept.getName()); // 지연 로딩 시 여기서 쿼리 발생
지연 로딩으로 설정했더라도 필드를 직접 접근하는 시점에 데이터베이스에서 해당 데이터를 조회하게 된다.
엔티티를 조회한 후 바로 닫으면 관계 데이터가 아직 로드되지 않은 상태다.
필요한 경우에만 명시적으로 지연 로딩을 초기화시켜야 안전하다.
4. 추천 전략
// 기본값은 LAZY 가 권장됨
@ManyToOne(fetch = FetchType.LAZY) private Department dept;
JPA 의 기본 설정은 지연 로딩으로 되어 있어 성능에 유리하다.
즉시 로딩은 관계 필드가 항상 필요한 특수한 경우에만 사용한다.
지연 로딩을 사용할 때는 초기화 시점을 잘 설계해야 한다.
불필요한 데이터 로딩을 막아 서버 부하를 줄이는 것이 핵심이다.
'개념 창고 > JPA' 카테고리의 다른 글
| [JPA] ddl-auto 설정 (0) | 2023.02.27 |
|---|