✅JPA에서 지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading)는 엔티티 간의 관계를 마련할 때 데이터를 가져오는 전략을 결정하는 방법입니다. 이 두 가지 로딩 전략의 차이점에 대해 자세히 살펴보겠습니다.
지연 로딩
은 관련된 엔티티를 실제로 사용할 때까지 로드를 연기하는 방법입니다. 엔티티를 처음 로드할 때 관련 연관 엔티티를 한 번에 가져오지 않고, 필요한 시점에 데이터베이스에서 추가적인 조회를 통해 가져옵니다. 이 방법은 성능상 이점이 있는 경우가 많습니다. 예를 들어, 게시물(Post)과 댓글(Comment)이 있는 상황에서 특정 게시물을 가져오고자 할 때, 지연 로딩 전략을 사용한다면 처음에는 게시물(Post)만 가져옵니다. 이후 댓글(Comment) 정보가 필요한 경우 데이터베이스에서 해당 정보를 로드합니다.
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...
@OneToMany(mappedBy = "post", fetch = FetchType.LAZY)
private List<Comment> comments = new ArrayList<>();
}
@Entity
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id")
private Post post;
}
위 코드에서 Post 엔티티는 Comment 엔티티와 일대다 관계를 갖습니다.
이 관계에서 fetch = FetchType.LAZY
는 지연 로딩을 의미합니다. 따라서 Post 엔티티를 조회할 때, 관련된 Comment 엔티티들은 처음에 로드되지 않습니다. 네트워크 대역폭과 메모리 사용량을 줄이고자할 때에 효과적입니다.
즉시 로딩
은 엔티티를 로드하는 동시에 관련된 엔티티도 함께 조회하는 방식입니다. 즉시 로딩 전략을 사용하면 초기 SELECT 쿼리에서만 모든 관련 정보를 한 번에 가져오며, 이후 별도의 쿼리가 발생하지 않습니다. 예를 들어, Post 엔티티가 즉시 로딩 전략을 사용하여 Comment 엔티티를 로드할 때, 게시물(Post)을 가져올 대 이미 모든 댓글(Comment) 엔티티가 로드됩니다.
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...
@OneToMany(mappedBy = "post", fetch = FetchType.EAGER)
private List<Comment> comments = new ArrayList<>();
}
@Entity
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id")
private Post post;
}
위 코드에서 Post 엔티티는 Comment 엔티티와 일대다 관계를 갖습니다.
이 관계에서 fetch = FetchType.EAGER
는 즉시 로딩을 의미합니다. 따라서 Post 엔티티를 조회할 때, 관련된 Comment 엔티티들이 동시에 로드됩니다. 관련된 여러 엔티티를 한 번의 쿼리로 로드하고자 할 때 적합한 전략입니다.
지연 로딩과 즉시 로딩 간의 주요 차이점은 성능에 있습니다.
지연 로딩은 필요한 경우에만 관련 엔티티를 로드하며, 성능 개선에 도움이 됩니다. 반면, 즉시 로딩은 관련된 모든 엔티티를 최초 조회 시점에 한 번에 가져오기 때문에 필요한 데이터가 적을 때는 유용해도, 데이터가 많아질 경우 데이터베이스에 부담을 줄 수 있습니다.
따라서 개발 환경과 요구 사항에 따라 그리고 특별한 성능 이슈가 없다면, 기본적으로 지연 로딩 전략을 사용하는 것이 좋습니다. 만약 빈번한 조회로 인해 지연 로딩에 성능 문제가 발생한다면, 일부 데이터를 즉시 로딩해서 사용하는 것을 고려할 수 있습니다. 항상 성능을 신중하게 평가하여 적절한 로딩 전략을 선택해야 합니다.