영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 뜻이다.
애플리케이션이 DB에서 꺼내온 객체를 보관하는 역할을 함.
영속성 컨텍스트는 EntityManager를 통해 엔티티를 조회하거나 저장할 때 엔티티를 보관하고 관리한다.
// 엔티티를 생성
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
// 엔티티 매니저를 통해 영속성 컨텍스트에 엔티티를 저장
em.persist(entity);
-> persist는 실제로 DB에 저장하는 것이 아니라, 영속성 컨텍스트를 통해서 엔티티를 영속화 한다는 뜻
persist() 시점에는 영속성 컨텍스트에 저장한다. DB저장은 이후이다.
영속성 컨텍스트에는 1차캐시가 존재
엔티티를 영속성 컨텍스트에 저장하는 순간 1차캐시에 객체가 key(id), value(entity)값으로 저장됨
엔티티 매니저가 조회를 할 때 먼저 영속성 컨텍스트에 있는 1차 캐시에서 해당 엔티티를 찾고
엔티티가 존재할 경우 DB에 접근하지 않고 반환
엔티티가 존재하지 않을 경우 엔티티 매니저가 em.flush()할 때에 데이터베이스에 접근해서 엔티티를 꺼내오고 해당 엔티티를 1차 캐시에 저장
영속성 컨텍스트에서 꺼내온 객체는 동일성이 보장됨
같은 엔티티를 두 번 조회할 경우 두 개의 엔티티는 동일한 엔티티이다.
1차 캐시로 반복 가능한 읽기등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
Member member1 = em.find(Member.class, "member1");
Member member2 = em.find(Member.class, "member1");
System.out.println(member1 == member2) => true