본문 바로가기
JPA

JPA - 영속성 컨텍스트

by 지민재 2023. 4. 26.
반응형
SMALL

 

엔티티 매니저 팩토리와 엔티티 매니저

 


영속성 컨텍스트 

  • 엔티티를 영구 저장하는 환경
  • EntityManager.persist(entity) (DB 저장 x 영속성 컨텍스트에 저장 O)

 

엔티티 매니저를 통해 영속성 컨텍스트에 접근 

 

엔티티의 생명주기 

  • 비영속 (new/transient)
    • 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  • 영속(managed)
    • 영속성 컨텍스트에 관리 되는 상태
  • 준영속(detached)
    • 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed),
    • 삭제된 상태

 

 

비영속

Member member = new Member();
member.setId("member1");
member.setUsername("유저1");
  • 객체만 생성한 상태 JPA 랑 전혀 관계 없는 상태 이것을 비영속 상태라고 한다.

 

영속

Member member = new Member();
member.setId("member1");
member.setName("유저1");

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

em.persist(member);
  • member 객체를 집어 넣으면 여기서 부터 영속 상태 엔티티매니저 안에 있는 영속성컨텍스트 통해 member 가 관리 된다.

 

준영속, 삭제 상태

em.detach(member);
em.remove(member);

 

  • 준영속 : 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
  • 삭제 : 객체를 삭제한 상태

 

 

영속성 컨텍스트 이점 

 EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

 Member member = new Member();
 member.setId(10L);
 member.setName("유저1");

 EntityManager em = emf.createEntityManager();
 em.getTransaction().begin();

 // 1차 캐시에 저장
em.persist(member);

// 1차 캐시에서 조회
 Member findMember = em.find(Member.class, "member1");

 

 

 

Member findMember2 = em.find(Member.class, "member2");

1차 캐시에서 조회 후 없는 거 확인하고 DB 확인 member2 가 있으면 1차 캐시에 저장 

이렇게 1차 캐시가 있기 때문에 영속 엔티티의 동일성도 보장한다. 

 

영속 엔티티의 동일성 보장

Member findMember1 = memberRepository.findOne(1L);
Member findMember2 = memberRepository.findOne(1L);
System.out.println(findMember1 == findMember2);

 

동일성 비교 true (1차 캐시가 있기 때문에 가능)

 

엔티티 등록 트랜잭션을 지원하는 쓰기지연 

 

memberA 를 넣으면1차 캐시 저장과 동시에 JPAentity를 분석해서 insert 쿼리를 생성 해서 쓰기지연 sql 저장소에 쌓아둠 그리고 마찬가지로 memberB 를 넣으면 1차 캐시에 저장과 동시에  insert 쿼리를 생성 해서 쓰기지연 sql 저장소에 쌓아둠 그럼 언제 데이터 베이스에 저장될까??

 

트랜잭션을 커밋하는 시점에 쓰기 지연 sql 저장소에 있던 얘들이 flush가 되면서 날라간다. 그리고 디비에 커밋된다.

 

엔티티 수정 변경 감지

memberA 를 값을 변경 하면 Jpa 트랜잭션을 커밋하는 시점에 JPA  가 엔티티를 스냅샷을 비교한다. memberA 가 바뀐것을 확인하면 업데이트 쿼리를 쓰기 지연 SQL 저장소에 저장하여 데이터 베이스에 반영한다. 

em.remove(memberA) - 엔티티 삭제도 동일한 매커니즘으로 이해하면 된다.

 

출처 : [자바 ORM 표준 JPA 프로그래밍 - 기본편] -김영한 https://www.inflearn.com/course/ORM-JPA-Basic/dashboard 

'JPA' 카테고리의 다른 글

@GeneratedValue  (2) 2023.11.21
@NoArgsConstructor  (1) 2023.11.21
JPA - 엔티티 패밍  (0) 2023.04.28
JPA - 기초  (0) 2023.04.26
JPA 란 ?  (0) 2023.04.26

댓글