Lazy Loading(지연 로딩)

Kkd·2025년 1월 1일
0

매일메일 개념정리

목록 보기
57/93

Lazy Loading (지연 로딩)

Lazy Loading은 객체나 데이터를 필요할 때까지 로드하지 않고 지연시키는 전략입니다. 이는 애플리케이션 성능 최적화를 위한 중요한 기법으로, 특히 데이터베이스와의 연관이 깊습니다.


Lazy Loading의 주요 특징

  1. 지연된 데이터 로딩

    • 데이터나 객체를 처음에 즉시 로드하지 않고, 실제로 접근하는 시점에 로드됩니다.
    • 데이터베이스에서 모든 데이터를 한 번에 가져오는 즉시 로딩(Eager Loading)과 대비됩니다.
  2. 성능 최적화

    • 불필요한 데이터 로드를 방지하여 메모리와 네트워크 리소스를 절약합니다.
    • 대규모 데이터베이스 처리 시 특히 유용합니다.
  3. 필요한 데이터만 로드

    • 예를 들어, 사용자가 특정 객체의 일부 속성만 필요로 한다면 다른 속성을 로드하지 않습니다.

Lazy Loading 동작 방식

Lazy Loading은 프록시 객체를 사용하여 동작합니다.

  1. 처음에는 실제 데이터를 대신하는 프록시 객체를 생성합니다.
  2. 데이터에 접근하는 시점에 해당 객체를 초기화하여 데이터를 로드합니다.
  3. 이 과정은 데이터베이스 쿼리 실행이나 네트워크 요청을 통해 이루어집니다.

Lazy Loading의 활용 사례

Hibernate/JPA에서 Lazy Loading

JPA에서는 관계 매핑(OneToMany, ManyToOne 등)에서 @OneToMany, @ManyToOne 어노테이션의 fetch 속성을 통해 Lazy Loading을 설정할 수 있습니다.

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Order> orders;
}

@Entity
public class Order {
    @Id
    @GeneratedValue
    private Long id;

    private String product;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}
  • FetchType.LAZY: orders 필드는 처음에는 로드되지 않고, 필요할 때 데이터베이스에서 가져옴.
  • FetchType.EAGER: User 엔터티를 로드할 때 orders도 함께 즉시 로드.

Lazy Loading의 장점

  1. 성능 최적화

    • 초기 데이터 로딩 속도가 빨라짐.
    • 필요한 데이터만 로드하므로 메모리와 I/O 리소스를 절약.
  2. 유연성 증가

    • 데이터 사용 시점에 로드 가능하므로 유연한 설계가 가능.

Lazy Loading의 단점

  1. N+1 문제

    • 연관된 데이터를 반복적으로 로드하면 N번의 추가 쿼리가 발생할 수 있음.
    • 예를 들어, users 리스트를 조회하면서 각각의 orders를 개별적으로 로드하면 성능이 저하될 수 있음.
  2. 초기화 문제

    • 프록시 객체를 사용하는 동안 Session이 종료된 경우(LazyInitializationException) 데이터 로드에 실패할 수 있음.

Lazy Loading vs Eager Loading

특징Lazy LoadingEager Loading
데이터 로드 시점필요할 때 로드객체 생성 시점에 즉시 로드
성능초기 성능 우수, 단점: N+1 문제초기 로딩 느림, 필요한 데이터 모두 로드
메모리 사용필요 데이터만 로드, 메모리 효율적모든 데이터 로드, 메모리 사용 많음
구현 복잡도프록시, 초기화 문제로 복잡상대적으로 단순

Lazy Loading의 해결책

  1. N+1 문제 해결

    • Fetch Join: JPQL에서 연관 데이터를 한 번에 가져오는 방식.
      SELECT u FROM User u JOIN FETCH u.orders;
    • Batch Fetching: JPA 설정으로 관련 데이터를 묶어서 로드.
  2. LazyInitializationException 방지

    • 트랜잭션 범위 확장: 데이터 접근 전에 Session이 종료되지 않도록 관리.
    • DTO 활용: 필요한 데이터만 미리 로드하여 DTO(Data Transfer Object)에 담아 사용.

결론

Lazy Loading은 메모리 효율과 성능 최적화를 위해 유용한 기법이지만, 잘못된 사용은 성능 문제를 초래할 수 있습니다. 따라서 설계 시 데이터 사용 패턴을 잘 분석하여 Lazy Loading과 Eager Loading을 적절히 조합하여 사용하는 것이 중요합니다.

추가 학습 자료

profile
🌱

0개의 댓글