본문 바로가기
개념정복💫/스프링 Spring 정복

JPA 페치 타입: 즉시 로딩(EAGER)과 지연 로딩(LAZY)

by 옹쑥이 2025. 2. 23.

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), 언제 어떤 전략을 써야 할까?