영속성 컨텍스트강의를 다 듣고나서 이해가 잘 되지않아
TIL을 작성하며 다시 복습해보려고한다.
Persistence를 번역하면 영속성, 지속성이라는 뜻이 되는데 이를 객체의 관점으로 해석하면, '객체가 유지되는 시간이나 위치를 자유롭게 유지하고 이동할 수 있는 성질'을 의미한다. 즉, Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간을 말한다.
영속성 컨텍스트를 사용하면 직접 SQL을 작성하지 않아도 JPA를 사용하여 DB에 데이터를 저장하거나 조회할 수 있으며 수정, 삭제 또한 가능하다.

영속성 컨텍스트는 내부적으로 캐시 저장소를 가지고 있고, 우리가 저장하는 Entity객체들은 1차 캐시(캐시 저장소, Map형태)에 저장된다.
(Key, @id, 식별자 값), (value, Entity, 객체)
Entity 저장: em.persist(memo);
Entity 조회
캐시저장소에 조회하는 ID가 존재하지 않는 경우
em.find(Memo.class, 1)을 호출하여 캐시저장소를 확인한 후 해당 값이 없다면
DB에 SELECT 조회 후 해당 값을 캐시 저장소에 저장하고 반환한다.
캐시저장소에 조회하는 ID가 존재하는 경우
em.find(Memo.class, 1)을 호출 하여 캐시 저장소에 식별자 값이 1이면서 Memo Entity타입인 값이 있는지 조회한 후 Entity객체를 반환한다.
Entity 삭제

장점
Memo memo1 = em.find(Memo.class, 1);
Memo memo2 = em.find(Memo.class, 1);
Memo memo = em.find(Memo.class, 2);
System.out.println(memo1 == memo2);
System.out.println(memo1 == memo);
java에서 memo1과 memo2를 비교하면 주소가 다르기때문에 memo1 == memo2의 값이 false로 나오지만 1차 캐시에서는 저장소에서 동일한 값을 받아왔기때문에 true를 반환한다.
memo1 == memo는 당연하게도 다른 값을 조회하기때문에 false를 반환한다.
JPA가 트랜잭션처럼 SQL을 모아서 한번에 DB에 반영하는데, 이때 지연 저장소를 이용한다.

commit 전 actionQueue의 insertions안에 Memo#2, Memo#3 객체 확인

commit 후 안에 있던 데이터가 사라진 것을 확인할 수 있다.

JPA에는 update메서드가 따로 없지만 대신 Entity를 저장할 때 LoadedState에 최초상태를 저장해서 비교하는 식으로 update를 처리한다.
변경하고 싶은 데이터가 있다면 먼저 데이터를 조회하고 해당 Entity객체의 데이터를 변경하면 자동으로 Update SQL이 생성되고 DB에 반영된다.

entityInstance가 Entity 객체의 현재 상태이고 loadedState가 Entity의 최초상태이다.
commit후에 em.flush()메서드가 호출되면 현재 상태와 최초 상태를 비교하고 변경이 있다면 UpdateSQL을 생성하여 쓰기 지연 저장소에 저장한 후에 DB에 요청한다.