영속성 전이(Transitive Persistence)
영속성 전이(Transitive Persistence)는 JPA(Java Persistence API)에서 부모 엔티티가 어떤 작업을 수행할 때, 그 작업이 자식 엔티티에게도 전이되는 것을 의미합니다. 쉽게 말해, 부모 엔티티를 저장하거나 삭제할 때 자식 엔티티도 함께 처리되는 기능입니다.
주요 Cascade 옵션
• CascadeType.PERSIST: 부모 엔티티가 저장될 때 자식 엔티티도 자동으로 저장됩니다.
• CascadeType.REMOVE: 부모 엔티티가 삭제되면 자식 엔티티도 자동으로 삭제됩니다.
• CascadeType.MERGE: 부모 엔티티와 자식 엔티티가 병합됩니다.
• CascadeType.DETACH: 부모 엔티티가 영속성 컨텍스트에서 분리될 때 자식 엔티티도 함께 분리됩니다.
• CascadeType.REFRESH: 부모 엔티티가 새로고침되면 자식 엔티티도 함께 새로고침됩니다.
• CascadeType.ALL: 위의 모든 작업이 자식 엔티티에 전이됩니다.
사용 사례
영속성 전이는 주로 부모-자식 관계가 명확한 경우에 사용됩니다. 예를 들어, Order 엔티티와 OrderItem 엔티티가 있을 때, Order를 저장할 때 관련된 모든 OrderItem도 함께 저장되도록 할 수 있습니다.
@Entity
public class Order {
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
public void addOrderItem(OrderItem item) {
orderItems.add(item);
item.setOrder(this);
}
}
주의사항
영속성 전이를 무분별하게 사용하면 의도하지 않은 데이터베이스 작업이 발생할 수 있습니다. 따라서, 전이가 필요한 경우에만 신중하게 설정하는 것이 좋습니다. 특히 대용량 데이터를 다룰 때는 주의해야 합니다.
영속성 컨텍스트(Persistence Context)
영속성 컨텍스트(Persistence Context)는 JPA에서 엔티티를 관리하는 일종의 “1차 캐시” 역할을 하는 공간입니다. 영속성 컨텍스트는 엔티티의 상태를 관리하고, 데이터베이스와의 동기화를 책임집니다.
주요 개념
• 엔티티 매니저(Entity Manager): 영속성 컨텍스트를 통해 엔티티를 관리하는 역할을 합니다. 엔티티 매니저를 통해 엔티티를 저장, 조회, 삭제, 갱신 등의 작업을 수행할 수 있습니다.
• 1차 캐시: 영속성 컨텍스트에 관리되는 엔티티는 1차 캐시라고도 불리는 메모리 공간에 저장됩니다. 동일한 트랜잭션 내에서 동일한 엔티티를 조회할 경우, 데이터베이스를 다시 조회하지 않고 1차 캐시에서 반환됩니다.
• 동일성(identity) 보장: 영속성 컨텍스트에서 관리되는 엔티티는 동일성을 보장합니다. 같은 영속성 컨텍스트 내에서는 동일한 식별자를 가진 엔티티가 항상 동일한 객체로 관리됩니다.
동작 방식
1. 엔티티 저장: 엔티티를 persist() 메서드로 저장하면 영속성 컨텍스트에 저장되고, 트랜잭션이 커밋될 때 데이터베이스에 반영됩니다.
2. 엔티티 조회: find() 메서드로 엔티티를 조회할 때, 먼저 영속성 컨텍스트에서 찾고 없으면 데이터베이스에서 조회하여 영속성 컨텍스트에 저장합니다.
3. 엔티티 삭제: remove() 메서드로 엔티티를 삭제하면, 영속성 컨텍스트에서 해당 엔티티가 제거되고 트랜잭션이 커밋될 때 데이터베이스에서도 삭제됩니다.
사용 사례
영속성 컨텍스트는 데이터의 일관성을 유지하고, 데이터베이스와의 불필요한 통신을 줄이는 데 유용합니다. 예를 들어, 여러 엔티티를 조회하고 수정할 때 영속성 컨텍스트를 통해 동일한 엔티티가 여러 번 조회되는 것을 방지할 수 있습니다.
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
Member member = em.find(Member.class, 1L); // 1차 캐시 사용
member.setName("New Name");
em.getTransaction().commit(); // 변경된 내용이 데이터베이스에 반영됨
주의사항
영속성 컨텍스트는 트랜잭션 범위 내에서만 유지되며, 트랜잭션이 종료되면 컨텍스트도 사라집니다. 따라서 영속성 컨텍스트에 저장된 엔티티는 더 이상 관리되지 않으며, 별도의 조작이 필요할 수 있습니다.
이 글을 통해 영속성 전이와 영속성 컨텍스트의 개념과 그 활용법을 이해하는 데 도움이 되길 바랍니다. JPA를 사용하면서 이 두 개념을 잘 이해하고 적절히 활용하면 더욱 효율적인 애플리케이션을 개발할 수 있을 것입니다.
이렇게 작성된 글을 Velog에 올리시면 많은 사람들에게 도움이 될 것입니다. 필요에 따라 내용을 수정하거나 추가할 수 있습니다.