Spring JPA에서 즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading)란?
Spring JPA에서 데이터베이스를 조회할 때, 연관된 엔티티를 가져오는 방식에는 즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading)이라는 두 가지 전략이 있다. 이러한 로딩 전략은 데이터베이스 쿼리 효율성과 애플리케이션 성능에 큰 영향을 미치기 때문에 매우 중요하다.
1. 즉시 로딩 (Eager Loading)
즉시 로딩은 연관된 모든 엔티티를 한 번에 조회하는 방식이다. 부모 엔티티를 조회할 때, 연관된 자식 엔티티도 함께 로드되어 메모리에 적재된다.
예를 들어, A
엔티티가 B
엔티티와 연관되어 있다면, A
를 조회할 때 B
엔티티도 즉시 로드된다. 이렇게 하면 데이터베이스로부터 필요한 모든 데이터를 한꺼번에 가져오기 때문에 코드가 단순해지고 데이터 접근 속도가 빨라질 수 있다. 그러나 사용하지 않는 데이터까지 메모리에 적재되므로 메모리 낭비가 발생할 수 있다.
즉, 정리하자면 아래와 같이 정리할 수 있다
즉시 로딩의 장점
- 연관된 데이터를 한 번에 가져오기 때문에 코드가 간결해진다.
- 초기 데이터베이스 접근이 적고, 연관 데이터를 자주 사용할 경우 성능이 좋아질 수 있다.
즉시 로딩의 단점
- 불필요한 데이터까지 로드되므로 메모리 낭비가 발생할 수 있다.
- 복잡한 연관 관계가 있을 경우 예상보다 많은 데이터베이스 쿼리가 실행될 수 있다.
즉시 로딩 설정 방법
@Entity
public class A {
@OneToMany(fetch = FetchType.EAGER)
private List bList;
}
즉시 로딩은 @ManyToOne
과 @OneToOne
의 기본 설정이다. 따라서 명시적으로 설정하지 않아도 기본적으로 즉시 로딩이 적용된다.
2. 지연 로딩 (Lazy Loading)
지연 로딩은 연관된 데이터를 실제로 필요할 때까지 로드하지 않는 방식이다. 부모 엔티티를 먼저 로드한 후, 자식 엔티티가 필요해지는 시점에 추가 쿼리를 실행해 데이터를 가져온다.
예를 들어, A
엔티티를 먼저 조회하고, B
엔티티가 필요해지는 순간 B
와 관련된 추가 쿼리가 실행된다. 초기 로딩 시점에는 필요한 데이터만 가져오기 때문에 메모리 사용량을 절약할 수 있다. 그러나 자식 엔티티를 자주 사용할 경우 데이터베이스 쿼리가 여러 번 발생하여 성능이 저하될 수 있다.
즉, 정리하자면 아래와 같이 정리할 수 있다
지연 로딩의 장점
- 필요한 데이터만 로드하므로 초기 로딩이 가볍다.
- 메모리 사용량이 최적화되어 불필요한 리소스 낭비를 줄일 수 있다.
지연 로딩의 단점
- 데이터가 필요할 때마다 추가 쿼리가 실행되므로 성능 저하가 발생할 수 있다.
- 트랜잭션 범위 밖에서 엔티티를 사용하면
LazyInitializationException
이 발생할 수 있다.
지연 로딩 설정 방법
@Entity
public class A {
@OneToMany(fetch = FetchType.LAZY)
private List bList;
}
지연 로딩은 @OneToMany
와 @ManyToMany
의 기본 설정이다. 하지만 실무에서는 모든 연관 관계를 명시적으로 지연 로딩으로 설정하는 것이 일반적이다.
위 내용들을 보기 쉽게 표로 정리하면 아래와 같다:
즉시 로딩 vs 지연 로딩 비교
특징 | 즉시 로딩 (Eager Loading) | 지연 로딩 (Lazy Loading) |
---|---|---|
쿼리 실행 시점 | 부모 엔티티 조회 시 | 연관 엔티티가 실제로 필요할 때 |
장점 | 한 번에 모든 데이터를 가져와 접근 속도가 빠름 | 필요한 데이터만 로드하여 메모리 절약 |
단점 | 불필요한 데이터까지 로드하여 메모리 낭비 가능 | 추가 쿼리가 실행되어 성능 저하 가능 |
적합한 경우 | 자식 엔티티를 반드시 함께 사용할 때 | 자식 엔티티를 사용할 가능성이 낮을 때 |
나의 생각
프로젝트의 규모가 작거나 실제로 접근이 빈번한 엔티티의 경우 즉시 로딩이 장점을 가질 수 있다. 하지만 프로젝트의 규모가 점점 커지며 엔티티 사이의 연관관계가 점점 더 복잡해질 수 있다는 경우를 배제할 수 없다.
즉, 최초에는 전체 엔티티를 지연 로딩으로 설정을 한 뒤, 실제로 즉시 로딩이 필요한 엔티티를 대상으로 변경을 해주는 방법이 미래에 발생할 수 있는 위험요소(트래픽 발생, 성능 저하 등)를 예방할 수 있다는 점에서 바람직해 보인다.
'IT > JPA' 카테고리의 다른 글
[JPA] - 영속성 컨텍스트 (Persistence Context) (0) | 2024.12.13 |
---|---|
[JPA] - 더티 체킹 (Dirty Checking) (0) | 2024.12.12 |