영속성 컨텍스트
에 보관/관리.persist(entity)
시점에는 entity
가 영속성 컨텍스트
에 저장된다는 의미📎 Entity
📎 EntityManager
Entity
를 관리하는 역할을 수행하는 클래스
EntityManager
내부에 영속성컨텍스트
를 이용하여 관리한다.Transaction
단위를 수행할 때마다 생성된다.Thread
간 공유되어서는 안된다.(사용 후 즉시 폐기)Transaction
후에는 close()
되어야 한다.📎 EntityManagerFactory
EntityManagerFactory
를 만들어야 한다.EntityManagerFactory가 close()
되어야 한다.🎈 EntityManagerFactory는 thread-safe
하지만, EntityManager는 thread-safe
하지 않아 thread
간 공유하면 안된다.
✍ 객체와 관련된 DB 매핑(Object Relational Mapping
)
↳ 설계와 관련된 내용
↳ 정적인 내용(static contents)
✍ 영속성 컨텍스트
↳ JPA 내부 동작과 관련된 부분
영속성 컨텍스트란 엔티티를 영구적으로 저장하는 환경
을 의미한다. 어플리케이션과 DB사이에서 객체(Object)를 보관하는 가상의 데이터 베이스 역할을 한다. 엔티티 매니저
를 통해 엔티티
가 영속성 컨텍스트
에 보관/관리된다.
📖 영속성 컨텍스트의 변경내용을 DB
에 반영하는 것
(영속성 컨텍스트
에 저장된 DB Query를
DB
에 날려주는 것)
flush()
: 직접 호출트랜잭션 커밋
: 플러시 자동 호출JPQL 쿼리 실행
: 플러시 자동 호출논리적인 개념으로, 눈에 보이지 않는다.
"Entity를 영구히 저장하는 환경"을 뜻한다.
👉 식별자 값
: 영속성 컨텍스트는 엔티티를 식별자 값
으로 구분한다.(반드시 있어야 함)
👉 영속성 컨텍스트에서 DB로의 저장(flush
)
: JPA는 commit하는 순간 영속성 컨텍스트에 저장된 엔티티를 DB에 반영한다.
: 영속성 컨텍스트 내부에 존재하는 캐시를 "1차 캐시"라고 한다.
: 1차 캐시의 Key는 식별자 값
이고 값은 Entity Instace
이다.
Member member = em.find(Member.class, 1);
✍ 조회 흐름
Step1. 1차 캐시에서 Entity 조회
Step2. 1차 캐시에 있으면 메모리에 있는 Entity를 조회 없으면 DB에서 조회
Step3. 조회한 데이터로 Entity를 생성해 1차 캐시에 저장(영속화)
Step4 .Entity 반환
: 영속성 컨텍스트는 엔티티의 동일성을
보장한다.
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.print(a==b) // true return
: persist()
를 사용해 객체를 저장해도 바로 DDL
이 DB
에 실행되는 것이 아니다. commit
을 하기 직전까지 내부 쿼리 저장소에 모아두며, 트랜잭션을 commit
할 때 DB
에서 실행이 되는데 이를 쓰기 지연
이라 한다.
: Entity
데이터 수정 시 update()
를 별도로 하지 않더라도, 영속성 컨텍스트는 데이터의 변경을 감지하여 자동으로 insert
, update
가 실행된다.
✍ 흐름
1차 캐시에 Id, Entity, Snapshot이 저장
Step1. commit()
이 실행되어 flush()
되는 순간 Entity - Snapshot
을 비교한다.
Step2. 변경사항이 있으면 Update Query
가 쓰기 지연 SQL저장소에 저장된다.
Step3. DB
에 쿼리가 반영되고 commit
된다.
생성만
한 상태Member member = new Member();
member.setUserName("GreyTomato");
Entity
가 영속성 컨텍스트에 의해 관리되고 있는 상태Member member = new Member();
member.setUserName("GreyTomato");
EntityManager entityManager = EntityManager.createEntityMnager();
entityManager.getTransaction().begin();
// 영속(DB에 저장된 상태 X, commit되어야 저장)
entityManager.persist(member);
entityManager.detach(member);
// 영속성 컨텍스트를 비워도 준영속 상태가 된다.
entityManager.clear();
// 영속성 컨텍스트를 종료해도 준영속 상태가 된다.
entityManager.close();
📖 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩 등
영속성 컨텍스트가 제공하는 어떠한 기능도 동작하지 않게 된다.
📖 식별자 값
을 가지고 있다.
entityManager.remove(member);
개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍