JPA에서 엔티티를 조회할 때 연관된 데이터를 어떻게 로드할지를 결정하는 FetchType
FetchType.LAZY와 FetchType.EAGER 두가지가 있다.
1. FetchType.LAZY (Default값)
@ElementCollection(fetch = FetchType.LAZY)
지연로딩을 의미. 엔티티가 처음 조회될 때 연관된 데이터(여기서는 권한 permissions)를 즉시 로드하지 않고, 실제로 연관된 데이터가 사용될 때까지 로딩을 지연시키는 방식입니다.
동작:
- Role 엔티티를 조회할 때 permissions 컬렉션은 로드되지 않습니다.
- permissions 필드에 접근하려고 할 때 데이터베이스에서 해당 데이터를 조회하여 로드합니다.
- 장점:
- 성능 향상: 필요하지 않은 데이터를 미리 로드하지 않으므로 처음 조회 시 성능이 향상됩니다.
- 메모리 절약: 필요한 시점까지 데이터를 로드하지 않으므로 메모리 사용을 줄일 수 있습니다.
- 단점:
- 추가 쿼리: 연관 데이터를 사용할 때마다 추가 쿼리가 발생하므로 전체적으로는 더 많은 쿼리가 실행될 수 있습니다.
- 지연된 로딩으로 인해 예기치 않은 시점에 데이터베이스에 접근할 수 있습니다.
2. FetchType.EAGER
@ElementCollection(fetch = FetchType.EAGER)
즉시 로딩 의미. 엔티티가 조회될 때 연관된 데이터도 함께 조회됩니다.
- 동작:
- Role 엔티티를 조회할 때 permissions 컬렉션도 함께 조회됩니다.
- permissions 필드에 접근할 때 추가적인 데이터베이스 조회가 필요 없습니다.
- 장점:
- 즉시 사용 가능: 연관된 데이터가 미리 로드되므로, 엔티티 사용 시 지연 없이 연관 데이터를 사용할 수 있습니다.
- 쿼리 수 감소: 연관 데이터를 사용할 때 추가 쿼리가 필요 없으므로 전체 쿼리 수가 줄어듭니다.
- 단점:
- 성능 저하: 모든 연관 데이터를 미리 로드하므로, 처음 조회 시 성능이 저하될 수 있습니다.
- 메모리 사용 증가: 필요하지 않은 데이터를 미리 로드하므로 메모리 사용량이 증가할 수 있습니다.
차이점 요약
- 데이터 로딩 시점:
- FetchType.LAZY: 연관 데이터가 실제로 필요할 때 로드
- FetchType.EAGER: 엔티티가 조회될 때 연관 데이터를 함께 로드
- 성능 및 메모리 사용:
- FetchType.LAZY: 초기 조회 시 성능이 향상되고 메모리 사용량이 적음
- FetchType.EAGER: 초기 조회 시 성능이 저하되고 메모리 사용량이 많음
- 쿼리 수:
- FetchType.LAZY: 연관 데이터 접근 시 추가 쿼리가 발생
- FetchType.EAGER: 초기 조회 시 모든 연관 데이터를 로드하므로 추가 쿼리가 발생하지 않음
차이점을 이해하고 상황에 맞게 FetchType을 설정하는 것이 중요하다.
성능을 최적화 시키고 성능 저하를 방지하기 위해
데이터가 자주 사용되지 않음 → FetchType.LAZY 사용
연관된 데이터가 항상 필요함 → FetchType.EAGER 사용
'SPRING > JPA' 카테고리의 다른 글
[JPA] JPQL에서 '방언' 정의 (0) | 2024.07.12 |
---|---|
[JPA] 상속 Table Per Class전략과 자동생성 키 @GeneratedValue의 Identity전략을 함께 사용할 수 없는 이유 (0) | 2024.07.11 |