## 엔티티 매니저 팩토리와 엔티티 매니저 * 엔티티 매니저 팩토리는 Thread-Safe * 엔티티 매니저는 Non-Thread-Safe * https://iyoungman.github.io/jpa/EntityManagerFactory-EntityManager-PersistenceContext/ * https://medium.com/@SlackBeck/jpa-entitymanager%EC%99%80-%EB%8F%99%EC%8B%9C%EC%84%B1-e30f841fcdf8 * 엔티티 매니저는 DB 연결이 필요한 시점에 DB 커넥션을 얻는다. * **컨테이너 기반에서 JPA를 사용할 경우 EntityManagerFactory 생성 시점에 DB 커넥션풀도 만든다.** ## 엔티티 생명주기 * 컨테이너 기반에서 준영속 상태 언제될까? * 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않는것 * https://conservative-vector.tistory.com/entry/%EC%97%90%EB%9F%ACdetached-entity-passed-to-persist-orgrefrigeratorspringbootdomainrecipeFood-nested-exception-is-orghibernatePersistentObjectException * https://xebia.com/blog/jpa-implementation-patterns-saving-detached-entities/ ## 영속성 컨텍스트 특징 * 식별자 * 엔티티 식별자 값으로 구분한다. * 따라서 영속 상태는 식별자 값이 반드시 있어야 한다. * 영속성 컨텍스트 -> DB 저장 시점 * 트랜잭션 커밋 시점 * 이를 flush(DB에 반영) 라고 한다. * 영속 엔티티가 동일성 보장하는 이유 * find하면 1차 캐시 조회 -> DB 조회를 한다. * 만약 1차 캐시에 없으면 DB 조회한 결과를 1차 캐시에 저장한다. * 1차 캐시는 Map 자료구조이다. * Map의 Key는 객체 식별자, Value는 객체 인스턴스 * 아래의 경우 1차 캐시 Map에서 조회하므로 true ```java Member m1 = em.find(Member.class, "member1"); Member m2 = em.find(Member.class, "member1"); m1 == m2//true, 동일성 ``` * 변경 감지 과정 ## 플러시 * 영속성 컨텍스트 변경 내용을 DB에 반영
엔티티 매니저 팩토리와 엔티티 매니저
엔티티 매니저 팩토리는 Thread-Safe
엔티티 매니저는 Non-Thread-Safe
https://iyoungman.github.io/jpa/EntityManagerFactory-EntityManager-PersistenceContext/
https://medium.com/@SlackBeck/jpa-entitymanager%EC%99%80-%EB%8F%99%EC%8B%9C%EC%84%B1-e30f841fcdf8
엔티티 매니저는 DB 연결이 필요한 시점에 DB 커넥션을 얻는다.
컨테이너 기반에서 JPA를 사용할 경우 EntityManagerFactory 생성 시점에 DB 커넥션풀도 만든다.
엔티티 생명주기
영속성 컨텍스트 특징
식별자
영속성 컨텍스트 -> DB 저장 시점
영속 엔티티가 동일성 보장하는 이유
변경 감지 과정
플러시