SPRING/JPA

[JPA] FetchType.LAZY와 FetchType.EAGER

Kishi 2024. 7. 10. 10:44

JPA에서 엔티티를 조회할 때 연관된 데이터를 어떻게 로드할지를 결정하는 FetchType

FetchType.LAZY와 FetchType.EAGER 두가지가 있다.

 

1. FetchType.LAZY (Default값)

@ElementCollection(fetch = FetchType.LAZY)

 

지연로딩을 의미. 엔티티가 처음 조회될 때 연관된 데이터(여기서는 권한 permissions)를 즉시 로드하지 않고, 실제로 연관된 데이터가 사용될 때까지 로딩을 지연시키는 방식입니다.  

 

동작:

  1. Role 엔티티를 조회할 때 permissions 컬렉션은 로드되지 않습니다.
  2. permissions 필드에 접근하려고 할 때 데이터베이스에서 해당 데이터를 조회하여 로드합니다.
  • 장점:
    • 성능 향상: 필요하지 않은 데이터를 미리 로드하지 않으므로 처음 조회 시 성능이 향상됩니다.
    • 메모리 절약: 필요한 시점까지 데이터를 로드하지 않으므로 메모리 사용을 줄일 수 있습니다.
  • 단점:
    • 추가 쿼리: 연관 데이터를 사용할 때마다 추가 쿼리가 발생하므로 전체적으로는 더 많은 쿼리가 실행될 수 있습니다.
    • 지연된 로딩으로 인해 예기치 않은 시점에 데이터베이스에 접근할 수 있습니다.

 

2. FetchType.EAGER

@ElementCollection(fetch = FetchType.EAGER)

즉시 로딩 의미. 엔티티가 조회될 때 연관된 데이터도 함께 조회됩니다.

  • 동작:
    1. Role 엔티티를 조회할 때 permissions 컬렉션도 함께 조회됩니다.
    2. permissions 필드에 접근할 때 추가적인 데이터베이스 조회가 필요 없습니다.
  • 장점:
    • 즉시 사용 가능: 연관된 데이터가 미리 로드되므로, 엔티티 사용 시 지연 없이 연관 데이터를 사용할 수 있습니다.
    • 쿼리 수 감소: 연관 데이터를 사용할 때 추가 쿼리가 필요 없으므로 전체 쿼리 수가 줄어듭니다.
  • 단점:
    • 성능 저하: 모든 연관 데이터를 미리 로드하므로, 처음 조회 시 성능이 저하될 수 있습니다.
    • 메모리 사용 증가: 필요하지 않은 데이터를 미리 로드하므로 메모리 사용량이 증가할 수 있습니다.

 

차이점 요약

  • 데이터 로딩 시점:
    • FetchType.LAZY: 연관 데이터가 실제로 필요할 때 로드
    • FetchType.EAGER: 엔티티가 조회될 때 연관 데이터를 함께 로드
  • 성능 및 메모리 사용:
    • FetchType.LAZY: 초기 조회 시 성능이 향상되고 메모리 사용량이 적음
    • FetchType.EAGER: 초기 조회 시 성능이 저하되고 메모리 사용량이 많음
  • 쿼리 수:
    • FetchType.LAZY: 연관 데이터 접근 시 추가 쿼리가 발생
    • FetchType.EAGER: 초기 조회 시 모든 연관 데이터를 로드하므로 추가 쿼리가 발생하지 않음
    •  

차이점을 이해하고 상황에 맞게 FetchType을 설정하는 것이 중요하다.

성능을 최적화 시키고 성능 저하를 방지하기 위해

데이터가 자주 사용되지 않음 → FetchType.LAZY 사용

연관된 데이터가 항상 필요함 → FetchType.EAGER 사용