지연 로딩(LAZY)과 즉시 로딩(EAGER)의 이해
지연 로딩(LAZY)의 원리
지연 로딩은 객체가 실제로 사용될 때까지 데이터베이스로부터 로드를 지연시키는 방식입니다.
예를 들어, 한 Member 객체가 Team 객체와 연관되어 있다고 할 때, 지연 로딩을 사용하면 Member 객체를 로드할 때 Team 객체는 로드되지 않습니다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
// ... 기타 필드와 메소드
}
위 코드에서 @ManyToOne(fetch = FetchType.LAZY)
는 Member 객체를 조회할 때 Team 객체는 데이터베이스에서 즉시 로드되지 않음을 의미합니다.
Team 객체가 실제로 필요할 때만 데이터베이스에서 조회됩니다.
즉시 로딩(EAGER)의 원리
즉시 로딩은 연관된 객체를 함께 즉시 로드하는 방식입니다. Member 객체를 로드할 때 연관된 Team 객체도 함께 로드됩니다.
이 방식은 연관된 객체가 항상 함께 사용될 때 유용합니다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;
// ... 기타 필드와 메소드
}
위 코드에서 @ManyToOne(fetch = FetchType.EAGER)
는 Member 객체를 조회할 때 Team 객체도 함께 즉시 로드됨을 의미합니다.
지연 로딩과 즉시 로딩의 선택
성능 최적화: 지연 로딩은 객체가 필요할 때만 데이터를 로드하므로 성능 최적화에 유리합니다.
예상치 못한 문제 방지: 즉시 로딩은 예상치 못한 많은 SQL 쿼리가 발생할 수 있습니다. 특히 JPQL에서 N+1 문제를 일으킬 수 있습니다.
영속성 전이(CASCADE)와 고아 객체
- 영속성 전이(CASCADE) 영속성 전이는 부모 엔티티의 상태 변화를 연관된 자식 엔티티에 전파하는 것입니다. 예를 들어, 부모 엔티티를 저장할 때 연관된 자식 엔티티도 함께 저장합니다.
@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)
private List<Child> children;
위 코드에서 cascade=CascadeType.PERSIST
는 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장됨을 의미합니다.
고아 객체
고아 객체 기능은 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제합니다.
@OneToMany(mappedBy="parent", orphanRemoval=true)
private List<Child> children;
위 코드에서 orphanRemoval=true
는 부모 엔티티와 연관관계가 끊어진 자식 엔티티가 자동으로 삭제됨을 의미합니다.
영속성 전이와 고아 객체의 결합
영속성 전이와 고아 객체 기능을 함께 사용하면, 부모 엔티티를 통해 자식 엔티티의 생명주기를 효과적으로 관리할 수 있습니다.
@OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval=true)
private List<Child> children;
위 코드에서 CascadeType.ALL
과 orphanRemoval=true
는 부모 엔티티의 모든 상태 변화를 자식 엔티티에 전파하고, 부모와 연관관계가 끊어진 자식은 자동으로 삭제됩니다.
결론
JPA에서의 지연 로딩과 즉시 로딩, 영속성 전이와 고아 객체는 데이터 관리와 성능 최적화에 중요한 역할을 합니다.
이러한 개념들을 올바르게 이해하고 사용함으로써, 더 효율적인 데이터 접근 전략을 구축하고 애플리케이션의 성능을 향상시킬 수 있습니다.
이러한 이해는 특히 대규모 시스템을 개발하는 데 있어서 중요한 요소입니다.