스프링으로 프로젝트를 진행하면서 JPA의 영속성 컨텍스트를 개념만 알고 별도로 정리하지 않고 넘어갔다.
지금 이렇게 하나하나 개념을 정리하고 있으니 JPA 영속성 컨텍스트도 다시 한번 익히고 정리해보려고 한다.
JPA를 공부하며 가장 중요하다고 생각하는 부분은 설계와 관련된 객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping)과 지금 정리해보려고 하는 JPA 내부 동작인 영속성 컨텍스트 이다.
엔티티를 영구 저장하는 환경
이라는 의미EntityManager.persist(entity);
동작생성
만 한 상태(영속성 컨텍스트에 저장X)// 객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUserName("회원1");
// 객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUserName("회원1");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
// 객체를 저장한 상태 (영속)
entityManager.persist(member);
EntityManager.persist(entity);
=> 영속 상태가 된다고 바로 DB에 쿼리가 날아가지 않는다.(DB저장 X)
// 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
entityManager.detach(member);
// 영속성 콘텍스트를 비워도 관리되던 엔티티는 준영속 상태가 된다.
entityManager.claer();
// 영속성 콘텍스트를 종료해도 관리되던 엔티티는 준영속 상태가 된다.
entityManager.close();
준영속 상태의 특징
1. 1차캐시, 쓰기 지연, 변경 감지, 지연 로딩을 포함한 영속성 컨텍스트가 제공하는 어떠한 기능도 동작하지 않는다.
2. 식별자 값을 갖고 있다.
// 객체를 삭제한 상태
entityManager.remove(member);
flush
라고 한다.Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
/* 영속 상태 (Persistence Context 에 의해 Entity 가 관리되는 상태) */
// DB 저장 X, 1차 캐시에 저장됨
entityManager.persist(member);
// 1차 캐시에서 조회
Member findMember = entityManager.find(Member.class, "Member1");
Member a = em.find(Member.class, "Member1");
Member b = em.find(Member.class, "Member2");
Systen.out.println(a == b); // 동일성 비교 true
Entity를 수정할 때 단순히 Entity를 조회해서 데이터를 수정하고 commit하면 DB에 반영된다.
즉, 데이터를 set하면 해당 데이터의 변경을 감지하여 자동으로 UPDATE Query가 나가는 것이다.
변경 감지 매커니즘
transaction.commit() 을 하면
https://www.inflearn.com/course/ORM-JPA-Basic
https://willseungh0.tistory.com/65
https://sjh836.tistory.com/189