JPA가 엔티티를 영구 저장 하는 환경, 즉 JPA의 내부 동작 원리
app과 DB 사이에서 JPA가 객체(엔티티)를 관리하는 논리적 개념
비영속(new/transient)
: 영속성 컨텍스트와 전혀 관계가 없는 상태
영속(managed)
: 영속성 컨텍스트에서 관리하는 상태
준영속(detached)
: 영속성 컨텍스트에 관리되었다가 더 이상 관리 하지 않는 상태
삭제(removed)
: 영속성 컨텍스트와 DB에서 삭제된 상태
엔티티를 관리하기 위해서는 서로를 구분할 수 있는 식별자 값이 필요하다.
SQL에서는 식별자를 @id로 지정한 값으로 구분한다.
EntityManagerFactory가 요청이 올 때마다 한개씩 EntityManager를 생성해준다.
EntityManager는 1차 캐시와 쓰기 지연 SQL 저장소를 가지고 있으며, 생성 비용이 거의 없다.
EntityManager는 DB 커넥션 풀의 커넥션을 사용하여 DB를 사용한다. (필요시에만 커넥션을 획득)
find() 호출 시 먼저 캐시에 정보가 있는지 확인한 뒤에 DB조회
조회한 값들은 조회한 시점의 데이터(스냅샷)로 캐시에 저장
persist() 호출 시 1차 캐시에 변경될 데이터, 조회 시점의 스냅샷 둘을 저장, 쓰기지연SQL저장소에 SQL문 저장
commit() 호출 시 쓰기 지연 SQL 저장소에서 flush를 통해 SQL문을 DB에 한번에 보냄
flush란 영속 컨텍스트의 변경 내용을 데이터 베이스에 반영하는 것, flush() 호출 시뿐만 아니라 트랜잭션 커밋이나 JPQL 쿼리 실행 시에도 발생 할 수 있다
캐시의 존재
동일성 보장
: 식별자를 이용하여 같은 인스턴스를 반환
트랜잭션을 지원하는 쓰기 지연
변경 감지(Dirty Checking) 기능
: JPA에서 지원하는 변경 감지라는 기능으로 엔티티를 변경할 수 있는 기능 제공
연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이기능을 사용
JPA는 cascade 옵션으로 영속성 전이를 제공
cascade는 ALL, PERSIST, REMOVE, MERGE, REFERESH, DETACH 같은 CascadeType이 있음
추가로 볼만한 것: https://colevelup.tistory.com/21
소중한 정보 잘 봤습니다!