카테고리 없음

Lazy Loading과 Eager Loading 정리

skgur07 2025. 2. 7. 20:52

어느 강의를 듣다가 LAZY를 사용해야 된다는 말을 듣고 자세한 내용은 보지 않아 계속 LAZY 만을 사용했는데요 그래서 이 부분에 자세히 알아보기 위해 조사했습니다.

JPA를 사용할 때 엔티티 간 연관 관계를 매핑할 때 fetch 전략을 설정하는 것이 매우 중요합니다 LAZY와 EAGER 두 가지 방식이 존재하는데 이 설정이 개발 성능과 직접적으로 연결됩니다

 

Lazy Loading과 Eager Loading 개념

Lazy Loading 

Lazy Loading 또는 지연 로딩이라고 불리는 로딩은 연관된 엔티티를 즉시 가져오지 않고 실제로 필요한 시점에서 쿼리를 실행하여 데이터를로딩하는 방식입니다. JPA를 사용면@OneToMany(fetch = FetchType.LAZY) 또는 @ManyToOne(fetch = FetchType.LAZY) 등과 같은 방법으로 사용합니다. 

이 방식의 장점은 초기 로딩 시 불필요한 데이터를 가져오지 않으므로 성능적으로 이점이 있고 필요할 때만 데이터를 조회하여 메모리 사용량을 절감할 수 있습니다.

단점으로는 연관된 데이터를 사용할 때마다 추가적인 쿼리가 발생할 수 있습니다 그 예를 N + 1 문제는 많이 들어보셨을 겁니다.

@Entity
public class Team {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team", fetch = FetchType.LAZY)
    private List<Member> members = new ArrayList<>();
}

이런 식으로 사용할 수 있겠죠?

 

Eager Loading

Eager Loading 또는 즉시 로딩이라 불리는 로딩은 연관된 엔티티를 즉시 함께 조회하는 방식을 사용합니다. 사용은 LAZY와 비슷하게 

@OneToMany(fetch = FetchType.EAGER 또는 @ManyToOne(fetch = FetchType.EAGER)로 사용합니다 처음부터 필요한 데이터를 모두 가져와서 추가적인 쿼리 실행이 줄어들지만 단점으로 불필요한 데이터까지 조회하게 되어 성능 저하 가능성이 있고 쿼리가 복잡해고 불필요한 조인으로 인해 성능 이슈가 발생할 수 있습니다.

@Entity
public class Team {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team", fetch = FetchType.EAGER)
    private List<Member> members = new ArrayList<>();
}

이런 식으로 사용 가능합니다. 

 

사실 지금 대부분이 LAZY를 사용합니다 따라서 N + 1은 개발자라고 하면 모두 들어봤을 건데요 이 문제를 해결하는 방법도 간단하게 알아보겠습니다. 

N + 1 문제 

Lazy Loading을 사용할때 자주 발생하는 문제로, 하나의 부모 엔티티를 조회한 후 연관된 엔터티를 가져올 때 추가적인 쿼리를 다수 실행되는 문제를 의미합니다. 

간단한 예제로 Team 엔티티를 조회하고, 그 안에서 members를 사용할려고 하면

SELECT * FROM team; 1개의 쿼리 실행

SELECT * FROM member WHERE team_id = ?; N개의 쿼리 실행

즉 N + 1 개의 쿼리가 실행되며, 팀 개수 N에 따라 쿼리 수도 증가합니다.

 

이 문제를 해결하기 위해서는 Fetch Join, EntityGraph 사용하기, BatchSize 설정하기 등이 있다고 합니다 따로 찾아보면 좋을거 같네요

 

마무리

한번에 다 불러오는 것 보단 필요한 부분에서 가져오는게 효율적이라 강의에서도 이걸 사용해야 한다고 말했구나를 알 수 있었고 N + 1 문제가 사실 엔티티를 만들면서 필할수 없는 부분인줄 알았는데 더 깊게 알고보니 LAZY를 사용하기 때문에 나타는 문제였다는걸 알아 신기했습니다