JPA에서 엔티티 간 연관관계를 설정할 때, 연관 객체를 언제 조회할지를 결정하는 것이 FetchType입니다.
즉시 로딩(EAGER)과 지연 로딩(LAZY)의 차이와 장단점을 알아봅니다.
1. 즉시 로딩(EAGER)
- 원리: 엔티티를 조회할 때, 연관된 엔티티도 바로 함께 조회
- 장점:
- 한 번의 쿼리로 필요한 정보를 전부 가져오기 때문에, 코드에서 편리
- 단점:
- 필요 없는 데이터까지 가져와서 성능을 해칠 수 있음
- 대규모 연관관계에서는 N+1 문제 등이 발생하기 쉬움
2. 지연 로딩(LAZY)
- 원리: 엔티티를 먼저 가져오고, 실제로 사용할 때(필요할 때) DB에서 추가 조회를 수행
- 장점:
- 처음에는 최소한의 데이터만 조회 -> 성능 최적화에 유리
- 단점:
- LazyInitializationException, N+1 문제 대비가 필요
- 연관 객체를 접근하는 시점에 쿼리가 여러 번 나갈 수 있음
3. 예시 코드
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private UserEntity user;
- LAZY로 설정하면, user 필드를 처음부터 가져오지 않고, 실제 접근할 때 추가 쿼리를 실행합니다.
일반적으로 지연 로딩(LAZY)이 권장되지만, 도메인 로직과 쿼리 사용 패턴에 따라 전략을 달리해야 할 때도 있습니다.
성능 분석 도구와 쿼리 로그를 통해 적절히 조정하는 것이 핵심입니다.
2025.02.21 - [개념정복💫/스프링 Spring 정복] - 즉시 로딩(EAGER)과 지연 로딩(LAZY), 언제 어떤 전략을 써야 할까?
'개념정복💫 > 스프링 Spring 정복' 카테고리의 다른 글
JPA 일대일(OneToOne) 관계 매핑 (0) | 2025.02.23 |
---|---|
즉시 로딩(EAGER)과 지연 로딩(LAZY), 언제 어떤 전략을 써야 할까? (1) | 2025.02.23 |
@EntityListeners(AuditingEntityListener.class)란? (4) | 2025.02.22 |
JPA 엔티티 날짜/시간 자동 설정 (0) | 2025.02.22 |
Lombok 주요 어노테이션 정리 (0) | 2025.02.21 |