RDB의 Table과 직접적으로 매핑되는 객체이다
EntityManagerFactory
EntityManager
JPA를 이용하는데 가장 중요한 요소이다
엔티티를 영구 저장하는 환경이라는 뜻이다.
엔티티 매니저는 엔티티를 영속성 컨텍스트에 보관하고 관리한다.
*엔티티는 엔티티 매니저에 의해 영속성 컨텍스트에서 관리된다.
1차 캐시의 조회 동작
(1) 조회 시에 1차 캐시에 데이터가 이미 있는지 확인하고, 데이터가 있으면 가져온다.
(2) 1차 캐시에 데이터가 없다면, 데이터 베이스에 데이터를 요청한다.
(3) 데이터 베이스에서 받은 데이터를 다음에 재사용 할 수 있도록 1차 캐시에 저장한다.
영속성 컨텍스트와 식별자 값
영속성 컨텍스트와 데이터 베이스 저장
New
Member member = new Member();
member.setId(1L);
member.setName("Yeji");
Managed
Member member = new Member();
member.setId(1L);
member.setName("Yeji");
EntityManager em = new EntityManager();
em.persist(customer); //영속화
Detached
// 영속상태의 객체 member를 영속성 컨텍스트에서 분리
em.detach(member);
// 영속상태의 모든 객체를 영속성 컨텍스트에서 분리.
em.clear();
// 영속성 컨텍스트를 종료한다.
em.close();`
Removed
// member 객체를 영속성 컨텍스트에서 분리하고, DB에서 삭제한다
em.remove(member);
// 엔티티 매니저 생성
EntityManagerFactory emf = new EntityManagerFactory();
EntityManager em = emf.createEntityManager();
// 트랜잭션 획득
EntityTransaction transaction = em.getTransaction();
// 트랜잭션 시작 (엔티티 매니저는 트랜잭션을 시작할때 커넥션을 획득)
transaction.begin();
// 비영속 상태
Member member = new Member():
member.setId(1L);
member.setName("Yeji");
// 영속화
em.persist(member)
// 트랜잭션 commit (트랜잭션이 커밋되는 순간 쿼리가 수행된다)
transaction.commit();
이 모든 과정을 추후에 @Repository
라는 어노테이션 하나로 EntityManager를 사용하지 않아도 된다. 왜냐하면 해당 어노테이션은 JpaRepositroy를 상속받은 인터페이스를 사용하기 떄문에 EntityManager가 자동으로 주입되기 때문이다.
@Test
void 조회(){
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
Member member = new Member();
member.setId(1L);
member.setName("Yeji");
em.persist(member);
transaction.commit();
//em.clear(); //영속성 컨텍스틀로 초기화(1차캐쉬 사라짐, DB조회 해야함)
Member getMember = em.find(Member.class, 1L);
log.info("{}", entity.getName());
}
프로그래머스 JPA강의를 듣고 혼자 끄적이는 글입니다..
다음편은 언젠가 돌아올게요..