[JPA] 영속성 컨텍스트

EB·2022년 5월 14일
0

🚀 영속성 컨텍스트란?

  • JPA를 이해하는데 가장 중요한 용어
  • “엔티티를 영구 저장하는 환경” 이라는 뜻이다.
  • EntityManager.persist(entity);
    • 엔티티를 영속성 컨텍스트라는 곳에 저장한다.

🚀 엔티티의 생명주기

비영속 (new / transient)

  • 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
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) : 영속성 컨텍스트에 저장되어있다가 분리된 상태

  • 영속성 켄텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다.

삭제 (removed) : 삭제된 상태

// 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);

// 객체를 삭제한 상태(삭제)
em.remove(member);

엔티티 조회

1차 캐시

  • 영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이것을 1차 캐시라고 한다.영속 상태의 엔티티는 모두 이곳에 저장된다.
  • em.find()를 호출하면 우선 1차 캐시에서 식별자 값으로 엔티티를 찾는다. 만약 찾는 엔티티가 있으면 데이터베이스에서 조회하지않고, 메모리에 있는 1차 캐시에서 엔티티를 조회한다!

엔티티 등록

  • 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 데이터베이스에 엔티티를 저장하지 않고 내부 쿼리 저장소에 INSERT SQL을 모아둔다.
  • 트랜잭션을 커밋할 때 모아둔 쿼리를 데이터베이스에 보내는데 이것을 트랜잭션을 지원하는 쓰기 지연 이라고 한다.

엔티티 수정

  • Member테이블에 150번의 이름을 TEST로 수정해보자.
Member member =em.find(Member.class,150L);
member.setName("TEST");
tx.commit();
  • member.setName("TEST"); 만 추가하면 수정이 된다.

  • em.update(member); 이런 코드가 있어야 수정이 되지않을까? 싶지만 사용하지 않는다.

🧐 어떻게 엔티티의 데이터만 변경했는데 데이터베이스에 자동으로 반영이 될까?

📌 변경감지 (Dirty Checking)

엔티티의 변경사항을 데이터베이스에 자동으로 반영하는 기능

📌 스냅샷

JPA는 엔티티를 영속성 컨텍스트에 보관할 때, 최초의 상태를 복사해서 저장해두는데 이것을 스냅샷 이라고 한다. 그리고 플러시 시점에 스냅샷과 엔티티를 비교해서 변경된 엔티티를 찾는다.

  1. 트랜잭션 커밋하면 엔티티 매니저 내부에서 먼저 플러시(flush)가 호출된다.
  2. 엔티티와 스냅샷을 비교해서 변경된 엔티티를 찾는다.
  3. 변경된 엔티티가 있으면 수정 쿼리 생성해서 쓰기 지연 SQL 저장소에 보낸다.
  4. 쓰기지연 저장소의 SQL을 데이터베이스에 보낸다.
  5. 데이터베이스 트랜잭션을 커밋한다.
profile
👩‍💻✨junior developer

0개의 댓글