JPA를 이해하려면 영속성 컨텍스트를 이해해야한다.
JPA에서 가장 중요한 2가지
또한, 엔티티 매니저 팩토리와 엔티티 매니저에 대해서 이해해야 한다.
웹 애플리케이션 개발을 한다고 하면 사진 속 엔티티 매니저 팩토리를 통해서 고객의 요청이 올 때마다 엔티티 매니저를 생성한다. (절대로 엔티티 매니저를 공용으로 사용하면 안된다.)
이 엔티티 매니저는 내부적으로 데이터 베이스 커넥션을 사용해서 DB를 사용한다.
EntityManager.persist(entity);
엔티티 매니저? 영속성 컨텍스트?
영속성 컨텍스트는 논리적인 개념이다. 눈에 보이지 않고 엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다.
엔티티 매니저를 생성하면 그 안에 1:1로 영속성 컨텍스트가 생성된다. 쉽게 말하면 엔티티 매니저 안에 영속성 컨텍스트라는 눈에 보이지 않는 공간이 생기는 것이다.
• 비영속 (new/transient)
• 영속 (managed)
• 준영속 (detached)
• 삭제 (removed)
//객체를 생성한 상태(비영속)
Member member = new Member()
member.setId(1L)
member.serName("Hello")
JPA에 관계없이 객체만 생성했다. 이것은 JPA랑 전혀 관계가 없는 상태이다. 이런걸 비영속 상태라고 한다.
entityManager.persist()
-> 영속 상태//객체를 생성한 상태(비영속)
Member member = new Member()
member.setId(1L)
member.serName("Hello")
EntityManager em = emf.createEntityManager(); //emf는 Entity Manager Factory이다.
em.getTransaction().begin();
//객체를 저장한 상태(영속)
em.persist(member);
## 객체가 DB로 날라감
em.getTransaction().commit();
객체를 생성한 다음 엔티티 매니저에 persist 해서 객체를 넣음면 엔티티 매니저 안에 있는 영속성 컨텍스트에 객체가 들어가면서 영속 상태가 된다.
persist를 하면 DB에 저장이 되는 것이 아니다.
persist를 하면 영속성 컨텍스트에 넘어갔다가 트랜잭션을 커밋하는 시점에 영속성 컨텍스트에 있는 DB의 쿼리가 날아간다.
-영속성 컨텍스트에 저장되었다가 분리된 상태
//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);
-삭제된 상태
//객체를 삭제한 상태(삭제)
em.remove(member);
다음 글에서는 영속성 컨텍스트의 이점에 대해서 작성하겠다.
출처
자바 ORM 표준 JPA 프로그래밍 강의
게시글에서 사용한 모든 사진 자료는 위 강의 속 자료입니다.