[java] JPA 영속 컨텍스트 & 라이프사이클 By starseat 2022-11-09 19:09:43 java/spring Post Tags # 영속 객체와 영속 컨텍스트 ![image.png](/uploads/_temp/20221109/ba9996dc3e03bf78a54762a2566d9e44.png) ## 영속(Persistent) 엔티티/객체 - DB 데이터에 매핑되는 메모리상의 객체 ## 영속 컨텍스트 - 일종의 메모리 저장소 - EntityManager 가 관리할 엔티티 객체 보관 - (엔티티 타입, 식별자) -> 엔티티 객체 ## 추가 정보 - EntityManager.clase() => 영속 컨텍스트 제거 - 배치 처리 X ## 영속 컨텍스트와 캐시 - 동일한 식별자 -> 동일 객체 - 영속 컨텍스트에 보관된 객체 조회 - `Repeatable Read` 효과 - java code ```java log.info("first find"); User first = em.find(User.class, email); log.info("second find"); User second = em.find(User.class, email); log.info("same object: {}", (first == second); ``` - 실행 로그 ```text first find select u1_0.email, ... from user u1_0 where u1_0.email = ? second find (select 쿼리 실행하지 않음 => 첫번째에서 조회한 데이터를 영속 객체로 보관) same object: true ``` ## 영속 객체 라이프사이클 ![image.png](/uploads/_temp/20221109/0c09882f6d0870308c5e45cbd0587c5d.png) - 커밋 시점에 변경 반영 (`EntityTransaction.commit();`) - 조회(find 등)나 등록(persist)을 통해 영속 컨텍스트에 저장된 객체는 관리 대상이 됨. ### 분리됨 상태는 변경 추적 대상 아님 - EntityManager em = EMF.createEntityManager(); 이 후 - `em.close()`, `em.detach()` 는 변경 추적 대상 아님 - `em.merge()` 는 `분리됨` 상태 객체를 `관리됨` 상태로 변경 # 출처 - [최범균 님의 영속 컨텍스트 & 라이플사이클](https://www.youtube.com/watch?v=tUwg78VkWJ0) Previous Post [java] JPA 값 콜렉션 매핑 Next Post [java] LocalDateTime SerializationException 이슈