공부방/JPA

영속성 컨텍스트

soycrab 2023. 2. 12. 18:52

- JPA 를 이해하는데 가장 중요한 용어 

- "엔티티를 영구 저장하는 환경" 이라는 뜻 

- EntityManger.persist(entity)

 

엔티티의 생명주기 

- 비영속

  1. 객체를 생성한 상태
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();

Member member = new Member();
member.setId("memberA");
member.setName("soycrab");

//객체를 저장한 상태(영속성 Context에 저장)
em.persist(member);

//해당 명령어를 실행해야 DB에 저장 그전까지는 영속성 Context에 저장되어 있음 
tx.commit();

 

- 영속 

 

영속성 컨텍스트의 이점

- 1차 캐시 동일성(identity) 보장

- 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)

- 변경 감지(Dirty Checking)

- 지연 로딩(Lazy Loading)

 

03. 영속성 관리

엔티티 조회, 1차 캐시

1차 캐시에서 조회 

 

데이터 베이스에서 조회 

 

 

1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의 트랜잭 션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공

Member a = em.find(Member.class, "member1");

Member b = em.find(Member.class, "member1");

System.out.println(a == b); //동일성 비교 true

 

 

 

트랜잭션을 지원하는 쓰기 지연

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋

 

 

 

 

 

엔티티 삭제

//삭제 대상 엔티티 조회
Member memberA = em.find(Member.class, “memberA");
em.remove(memberA); //엔티티 삭제

 

 플러시

- 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영 

 

플러시 발생

- 변경 감시

- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 

- 쓰기 지연 SQL 저장소의 쿼리를 데이터 베이스에 전송 (등록, 수정, 삭제 쿼리)

 

영속성 컨테스트를 플러시 하는 방법 

- em.flush()   직접호출

- 트랜잭션 커밋  플러시 자동호출 

- JPQL 쿼리 실행 플러시 자동 호출 

 

플러시는?

-영속성 컨텍스트를 비우지 않음

- 영속성 컨텐스트의 변경내용을 데이터베이스에 동기화

-트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화하면됨

 

 

 

 

 

김영한 선생님 강의 내용 복습을 위해 정리한 메모에요.

반응형