jowoohyeong / TIGENSOFT

0 stars 0 forks source link

PersistenceContext 영속성 컨텍스트 #8

Open jowoohyeong opened 1 year ago

jowoohyeong commented 1 year ago

영속성 컨텍스트 Persistence Context

JPA를 공부할 때 가장 중요한게 객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping)과 영속성 컨텍스트를 이해하는 것이다.

jowoohyeong commented 1 year ago

EntityManagerFactory, EntityManager

10_jpa_em

jowoohyeong commented 1 year ago

영속성 컨텍스트

11_jpa_em

jowoohyeong commented 1 year ago

12_entity_lifecycle

엔티티의 생명주기

jowoohyeong commented 1 year ago

영속성 컨텍스트의 이점

애플리케이션과 DB사이에 왜 중간에 영속성 컨텍스트가 있냐, 왜 필요하냐, 아래와 같은 개념들이 가능하려면, 영속성 컨텍스트가 존재해야한다.

1차캐시

03_persistence_context_cache

동일성(identity) 보장

<property name="hibernate.jdbc.batch_size" value=10/>

엔티티 삭제

Member memberA = em.find(Member.class, "memberA");

em.remove(memberA); // 엔티티 삭제
jowoohyeong commented 1 year ago

flush 플러시

플러시 발생

영속성 컨텍스트를 Flush 하는 방법

// 중간에 JPQL 실행 query = em.createQuery("select m from Member m", Member.class); List members = query.getResultList();

- 플러시가 일어나면 1차 캐시가 삭제될까?
    - 삭제되지 않는다. 쓰기 지연 SQL 저장소에 있는 쿼리들만 DB에 전송되고 1차 캐시는 남아있다.

### 플러시 모드 옵션
- em.setFlushMode(FlushModeType.COMMIT);
    - FlushModeType.AUTO
        - 커밋이나 쿼리를 실행할 때 플러시(기본값)
    - FlushModeType.COMMIT
        - 커밋할 때만 플러시

### 플러시 정리
- 플러시는 영속성 컨텍스트를 비우지 않는다.
- 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화 한다.
- 플러시가 동작할 수 있는 이유는 데이터베이스 트랜잭션이라는 작업 단위(개념)가 있기 때문이다
    - 어쨌든 트랜잭션이 시작되고 커밋되는 시점에만 동기화 해주면 되기 때문에, 그 사이에서 플러시 매커니즘의 동작이 가능한 것이다.
- JPA는 기본적으로 데이터를 맞추거나 동시성에 관련된 것들은 데이터베이스 트랜잭션에 위임한다.

준영속상태
------------
-영속 상태
    - 영속성 컨텍스트의 1차 캐시에 올라간 상태가 영속 상태이다. 엔티티 매니저가 관리하는 상태
    - em.persist()로 영속성 컨텍스트에 저장한 상태도 영속 상태이지만, em.find()로 조회할 때 영속성 컨텍스트 1차 캐시에 없어서 DB에 조회해와서 1차 캐시에 저장한 상태도 영속 상태이다.
    - 코드로 보면
        - em.find()가 일어날 때, 1차 캐시에 없으므로 DB에서 조회한 엔티티를 1차 캐시에 넣는다. 영속상태가 된다.
        - setName으로 이름을 바꾸고 커밋하니까, Dirty Checking이 일어나서 1차 캐시의 엔티티와 스냅샷이 다른 것을 감지하고 UPDATE 쿼리가 날라간다.
```java
Member member = em.find(Member.class, 150L);
member.setName("AAAAA");
transaction.commit();
jowoohyeong commented 1 year ago

https://ict-nroo.tistory.com/130 https://jwdeveloper.tistory.com/287