📌 영속성컨텍스트
: Entity를 영구 저장하는 환경
애플리케이션과 데이터베이스 사이 → 객체를 보관하는 가상의 데이터베이스 역할
Entity manager → Entity를 저장 및 조회
➡️ 영속성컨텍스트에 Entity를 보관 및 관리
Entity manager 생성 시 1개가 만들어짐
영속성컨텍스트 → Entity를 식별자(Id)로 구분함
Flush
: 영속성컨텍스트에 새로 저장된 Entity → 데이터베이스에 반영하는 것
JPA
영속성컨텍스트매니저 : 객체와 데이터베이스의 소통을 효율적으로 관리함
영속성컨텍스트와 전혀 관계 ❌
Entity 객체를 생성했으나, 영속성컨텍스트에 저장하지 않은 상태
Member member = new Member();
영속성컨텍스트에 저장된 상태
Entity manager → Entity를 영속성컨텍스트에 저장한상태
영속성컨텍스트에 의해 관리된다는 의미
em.persist(member);
영속성컨텍스트에 저장되었다가 분리된상태
영속상태의 Entity를 더이상 관리하지 않는 것
영속성컨텍스트 제공기능 (1차캐시, 쓰기지연, 변경감지, 지연로딩) → 동작 ❌
식별자 값을 가지고있음
// Entity -> 준영속상태
em.detach(member);
// 영속성컨텍스트를 비우면 관리되던 Entity -> 준영속상태
em.clear();
// 영속성컨텍스트 종료 -> 준영속상태
em.close();
em.remove(member);
📌 1차캐시
: 영속성컨텍스트 내부의 캐시
구분 | 해당 값 |
---|---|
1차캐시 key | 식별자 값 (Id) |
1차캐시 value | Entity 인스턴스(객체) |
// em.find(Entity클래스타입, 식별자값);
Member member = em.find(Member.class, "member1");
📌 동일성비교
: 실제 인스턴스(객체)가 같음 →==
사용해 비교
📌 동등성비교
: 실제 인스턴스(객체) 다르지만, 인스턴스(객체) 값이 같음 →equals()
사용해 비교
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member2");
System.out.println(a == b); // True
📌 쓰기지원
: 트랜잭션 커밋 → 모아둔 Query 한번에 DB에 전송
트랜잭션을 지원함
em.find(member)
사용해 member를 저장해도, 바로 INSERT SQL이 DB에 전송되는 것 ❌
Entity manager → 트랜잭션 커밋 전까지 내부 Query 저장소에 INSERT SQL을 모아둠
📌 변경감지
: 영속성컨텍스트가 관리하는 영속상태의 Entity에만 적용
잘 읽었습니다. 좋은 정보 감사드립니다.