영속성 컨텍스트
- ORM - Object Relation Mapper
- 테이블과 자바의 오브젝트를 매핑해주는 프레임워크
Entity
- RDB의 테이블에 해당하는 자바 오브젝트
@Entity@Table(name = "customers") public class CustomerEntity { @Id private Long id; private String firstName; private String lastName; // getter / setter ~~ }
EntitiyManagerFactory,
- Entity를 관리하는 EntityManager 생성하는 공장
- 스레드에 안전하다.
- 비용이 비싸 하나만 만들어 두고 엔티티를 관리해 줄 수 있는 EntityManager를 생성하는 팩토리성 클래스이다.
EntityManager
- EntityManager는 엔티티를 저장하고, 수정, 삭제 CRUD 등 엔티티와 관련된 모든 일을 처리한다.
- 스레드에 안전하지 않다. 여러 스레드에서 동시에 접근할 경우 동시성 이슈가 발생할 수 있다.
- 엔티티 매니저는 스레드가 시작할 때 커넥션을 획득한다. > 각각 다른 스레드의 요청 스레드 세이프 하지 않기 때문에 팩토리가 각각 요청에 맞는 매니저를 생성한다. > 엔티티 메니저는 디비 커넥션 풀을 관리하는 녀에서 커넥션을 각각 가져와 디비와 연결작업을 한다. > 커넥션들은 디비 커밋이 일어날 때 그때 커넥션을 가져와 사용하는 구조로 되어있다.

영속성 컨텍스트
- JPA를 이용하는데 가장 중요한 요소이다.
- 엔티티를 영구 저장하는 환경이라는 뜻이다.
- 엔티티매니저는 엔티티 영속성 컨텍스트에 보관하고 관리한다.
- 엔티티는 엔티티매니저에 의해 영속성 컨텍스트에서 관리된다.

영속성 컨텍스트의 특징
- 영속성 컨텍스트와 식별자 값
- 영속성 컨텍스트 안에서 관리되는 엔티티는 식별자 값을 반드시 가져야한다.
- key-value로 엔티티를 관리하기 때문이다.
- 영속성 컨텍스트와 데이터베이스 저장
- JPA는 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 반영한다. (FLUSH)
- 플러쉬는 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 작업인데, 이때 등록, 수정, 삭제한 엔티티를 DB에 반영한다.
- 영속성 컨텍스트가 엔티티를 관리함으로 얻는 이점
- 1차 캐시
- 동일성 보장
- 트랜잭션을 지원하는 쓰기지연
- 변경 감지
- 지연 로딩
엔티티의 생명주기

* 비영속(new / transient) * 영속성 컨텍스트와 전혀 관계가 없는 상태
// 데이터베이스와 무관한 상태 Customer customer = new Customer(); customer.setId(1L); customer.setFirstName("uk"); customer.setLastName("kim");
- 영속(managed)
- 영속성 컨텍스트에 저장된 상태
Customer customer = new Customer(); customer.setId(1L); customer.setFirstName(“uk”); customer.setLastName(“kim”); // 영속성 컨텍스트에서 관리되도록 함 em.persist(customer)
- 준영속(detached)
* 영속성 컨텍스트에 저장되었다가 분리된 상태
java Customer customer = new Customer(); customer.setId(1L); customer.setFirstName(“uk”); customer.setLastName(“kim”); // 관리되는 상태 em.persist(customer); // 준영속으로 만들고 싶을때 // 영속상태의 customer 객체를 영속성 컨텍스트에서 분리 em.detach(customer); // 영속 상태의 모든 객체를 영속성 컨텍스트에서 분리 em.clear(); // 영속성 컨텍스트 종료 em.close();
- 삭제(remove)
- 삭제된 상태
// customer 엔티티를 영속성 컨텍스트에서 분리하고 디비에서도 삭제 em.remove(customer)
Cusotomer 엔티티를 통한 영속성 컨텍스트 이해
- 저장
EntityManagerFactory emf = Persistence.createEntityManagerFactory("customers"); EntityManager em = emf.createEntityManager(); EntityTransaction transaction = em.getTransaction(); transaction.begin(); Customer customer = new Customer(); // 비영속상태 customer.setId(1L); customer.setFirstName("hyounguk"); customer.setLastName("kim"); em.persist(customer); // 영속상태 transaction.commit(); // 트랜잭션 커밋 // 커밋이 되는 순간 쿼리가 수행됨 flush ! db와 동기화됨
