✔️ 영속성 컨텍스트(Persistence Context)란?
영속성 컨텍스트란 '엔티티를 영구히 저장하는 환경' 이라는 뜻이다. 일종의 작업 영역이라고 생각할 수 있다. JPA에서 제공하는 논리적인 구조로 영속 상태의 엔티티들을 관리하기 위한 목적으로 사용된다. 1차 캐시, 동일성 보장, 변경감지(Dirty Checking)등 의 기능이 제공된다.
✔️ 엔티티의 생명 주기
- 비영속(New) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
- 영속(Managed) : 영속성 컨텍스트에 의해 관리되는 상태
//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//객체를 저장한 상태(영속)
em.persist(member);
- 준영속(Detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);
- 삭제(Removed) : 삭제된 상태
//객체를 삭제한 상태(삭제)
em.remove(member);
💡 준영속(Detached) 상태와 삭제(Removed) 상태의 차이
준영속 상태에서는 객체의 변경이 영속성 컨텍스트에 영향을 주지 않는다. 즉, 객체가 데이터베이스에 저장되거나 삭제되지 않는다. 단순히 영속성 컨텍스트에서 관리되지 않게 하는 상태이다.
삭제 상태에서는 해당 객체가 데이터베이스에서 삭제 될 것으로 표시된다. 즉, 해당 객체와 관련된 레코드가 실제 데이터베이스에서 제거된다.
간단히 정리하면, 준영속 상태(Detached)는 데이터베이스에서는 삭제하지 않고, 삭제 상태(Removed)는 데이터베이스에서 실제로 삭제한다.
✔️ 변경감지(Dirty Checking)
스냅샷은 영속성 컨텍스트에 들어온 엔티티의 최초의 정보를 담아두는 곳이다. JPA는 엔티티와 스냅샷을 비교하여 변경사항이 있을 때, UPDATE 쿼리를 쓰기 지연 저장소에 담아둔다. 그리고 트랜잭션이 커밋되는 시점에 UPDATE 쿼리를 데이터베이스에 반영하게 된다.
참고 - 자바 ORM 표준 JPA 프로그래밍 - 기본편
자바 ORM 표준 JPA 프로그래밍 - 기본편 | 김영한 - 인프런
김영한 | JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 실무에서도
www.inflearn.com