본문 바로가기
인프런 강의/실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[JPA] 프록시와 지연로딩

by 해삼2 2024. 2. 2.
728x90
반응형
프록시와 지연로딩

 

프록시

프록시는 실제 엔티티의 대리자로 동작하며, 필요한 경우에만 초기화되어 데이터베이스 쿼리를 최소화합니다. 프록시를 사용함으로써 성능을 향상시키고 불필요한 데이터베이스 조회를 방지할 수 있습니다.


지연로딩

@ManyToOne(fetch = FetchType.LAZY)
@OneToOne(fetch = FetchType.LAZY)
JPA에서는 ManyToOne과 OneToOne은 기본 설정 값이 즉시 로딩으로 되어 있어 변경해주어야 한다
실무에서는 전부 LAZY 사용!!

 

프록시는 객체의 초기화를 지연시킴으로써 필요한 경우에만 데이터를 로딩합니다. 

특히 연관된 객체가 많거나 대량의 데이터를 다루는 경우, 미리 모든 데이터를 가져오지 않고 필요한 순간에만 데이터를 가져오는 것은 성능상 이점이 있습니다. 

사용자가 특정 데이터에 접근하는 시점에만 데이터베이스 조회가 발생하므로 불필요한 데이터베이스 부하를 줄일 수 있습니다.


즉시로딩

@ManyToOne(fetch = FetchType.EAGER) // 즉시 로딩

 

엔티티와 그와 연관된 객체들이 한 번에 데이터베이스에서 조회되는 방식을 의미합니다. 이는 연관된 객체들이 모두 즉시 로딩되어 현재 객체가 로딩될 때 데이터베이스에서 해당 객체 및 연관 객체들의 데이터가 모두 가져와지는 것을 의미합니다.

 

정리*

JPA에서 프록시는 엔티티의 대리자 역할을 하며, 초기화를 통해 해당 엔티티의 데이터를 로딩할 수 있게 합니다. 지연 로딩은 프록시를 통해 필요한 데이터만을 실제로 로딩하여 성능을 최적화하는 기법입니다. 즉시 로딩이 사용되면 연관된 모든 데이터가 한 번에 조회되므로, 지연 로딩을 통해 필요한 시점에만 데이터를 가져오는 방식으로 성능 저하를 최소화할 수 있습니다.

 

 

영속성 전이(Cascade)

 

영속성 전이 (Cascade):
영속성 전이는 부모 엔티티의 상태 변화가 자식 엔티티에 영향을 미치도록 하는 기능입니다. 

즉, 부모 엔티티의 상태가 변경되거나 삭제될 때, 이에 따라 연관된 자식 엔티티들에게도 해당 변경사항을 전파할 수 있습니다.

영속성 전이는 @Cascade 어노테이션을 통해 지정하거나, JPA에서 제공하는 cascade 속성을 사용하여 설정할 수 있습니다. 대표적인 전이 종류로는 CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE 등이 있습니다.

@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Child> children;

    // 다른 필드 및 메서드들...
}

@Entity
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    private Parent parent;

    // 다른 필드 및 메서드들...
}

 

정리*

영속성 전이(Cascade)를 사용하면 부모 엔티티를 저장할 때(Persist), 연관된 자식 엔티티도 함께 저장됩니다. 이로 인해 부모와 자식 간의 연관 관계를 유지하면서 부모 엔티티를 저장하는 과정에서 자식 엔티티를 별도로 저장하는 번거로움이 줄어듭니다. 코드의 가독성이 향상되며, 부모-자식 간의 관계를 일관되게 유지할 수 있습니다.

고아 객체(Orphan Removal)

 

고아 객체 (Orphan Removal):

고아 객체는 부모 엔티티와의 연관이 끊어진 자식 엔티티를 자동으로 삭제하는 기능입니다. 

이를 사용하려면 자식 엔티티 필드에 orphanRemoval 속성을 true로 설정해야 합니다.

@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "parent", orphanRemoval = true)
    private List<Child> children;

    // 다른 필드 및 메서드들...
}

@Entity
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    private Parent parent;

    // 다른 필드 및 메서드들...
}

 

정리*

고아 객체라는 것은 부모 객체가 데이터를 지우거나 테이블을 지울때 같이 삭제 되는 현사을 의미 하며 만약 게시판으로 예를 들면 게시판을 부모라 하고 그 안에 객체인 파일 저장 테이블 글 내용 저장 테이블 등등이 자식이며 해당 게시판 글이 삭제가 되거나 게시판 테이블이 삭제되면 자동으로 자식 까지 삭제 되는 것을 고아 객체라고 합니다.

 

 

Cascade:
연관된 엔티티들의 상태를 일괄적으로 관리하고자 할 때 사용합니다.
부모 엔티티의 상태 변화를 자식 엔티티에게 전파하고 싶은 경우에 유용합니다.

Orphan Removal:
부모 엔티티에서 자식 엔티티를 제거할 때 자동으로 삭제하고자 할 때 사용합니다.
부모-자식 간의 연관이 일대다 또는 일대일 등의 단방향이거나 단순한 구조일 때 효과적입니다.

주로 복잡한 구조에서는 Cascade를 사용하여 상태를 전파하고, 간단한 구조에서는 Orphan Removal을 사용하여 부모 엔티티의 삭제와 동시에 자식 엔티티도 삭제하는 효과를 얻을 수 있습니다. 상황에 따라 선택하여 사용하면 됩니다.


 

 

 

728x90
반응형