<aside> ❗
<aside> ❗
EntityManager
가 생성된다.
EntityManager
는 내부적으로 DB 커넥션을 사용
해서 DB 사용
<aside> ❗
엔티티를 영구 저장하는 환경
이라는 뜻엔티티를 관리하는 컨텍스트(환경/공간)으로 이해하면 됨
논리적인 개념
엔티티 매니저를 통해서 영속성 컨텍스트에 접근
EntityManager
를 생성하면 EntityManager
안에 영속성 컨텍스트가 생성됨 (공간 생성)</aside>
<aside> ❗
비영속(new/transient)
영속성 컨텍스트와 전혀 관계 없는 새로운 상태
영속(managed)
영속성 컨텍스트에 관리되는 상태
Ex) Memeber 객체에 persist() 함수 실행준영속(detached)
영속성 컨텍스트에 저장되었다가 분리된 상태삭제(removed)
삭제된 상태</aside>
<aside> ❗
객체를 생성하고 EntityManager에 아무 것도 안 넣은 상태
// 객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
</aside>
<aside> ❗
객체를 생성하고, EntityManager를 얻어와서 persist()한 상태
entityManager의 영속성 컨텍스트를 통해서 객체가 관리됨
이때 DB에 저장되지 않는다.
// 객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
EntityManger em = emf.createEntityManager();
em.getTransaction().begin();
// 객체를 저장한 상태(영속)
em.persist(member);
commit() 하는 시점에
영속성 컨텍스트에 있는 객체가 DB 쿼리로 날라간다.
</aside><aside> ❗
영속성 컨텍스트에서 지운다.
// 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);
실제 DB 삭제를 요청
// 객체를 삭제한 상태(삭제)
em.remove(member);
</aside>
<aside> ❗
<aside> ❗
영속성 컨텍스트는 내부에 1차 캐시를 가지고 있다.
@Id를 붙인 필드(PK)가 캐시의 키
가 되고
엔티티 객체 자체가 값
이 된다.
영속성 컨텍스트와 entitymanager는 서로 다른 것
여기서는 같다고 생각하고 이해하길 바람
// 엔티티를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
// 엔티티를 영속
em.persist(member);
// 엔티티를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
// 1차 캐시에 저장됨
em.persist(member);
// 1차 캐시에서 조회
Member findMember = em.find(Member.class, "member1");
persist() 함수 실행
시, DB가 아니라 영속성 컨텍스트의 1차 캐시에 저장
된다.1차 캐시를 우선 탐색
한다.
해당하는 값이 있으면 캐시에 저장된 값을 반환DB에 데이터가 있는 경우 DB에서 데이터를 읽어와 1차 캐시에 저장 후 값을 반환
** 큰 이점은 안 된다.
→ 고객의 요청이 들어와서 요청이 끝나면 영속성 컨텍스트도 지워지기 떄문 → 트랜잭션 단위로 보통 만들고, 데이터베이스 트랜잭션이 끝날 때 같이 종료시키기 때문
</aside>
<aside> ❗
</aside>