Framework & Library/SpringDataAccess

JPA) 영속성 컨텍스트 공부

ruu++ 2024. 4. 16. 01:48

엔티티 매니저와 엔티티 매니저 팩토리

엔티티매니저와 엔티티 매니저 팩토리

  • 엔티티 매니저 팩토리가 요청마다 Entity Manager를 생성합니다.
    • Spring에서는 spring이 EntityManager를 관리합니다.
  • EntityManager는 DB Connection을 사용해서 CRUD를 처리합니다.
    EntityManagerFactory entityManagerFactory = new EntityManagerFactory(); 
    EntityManager em = entityManagerFactory.createManager(); 
    EntityTransaction tx = em.getTransation(); 
    tx.begin(); // 트랜잭션 관련 처리 ... 
    tx.commit() or tx.rollback(); 
    em.close();

영속성 컨텍스트

1. 엔티티를 영구 저장하는 환경

EntityManager.persist(entity); 영속성 컨텍스트에 저장하는 것

  • 엔티티 매니저가 생성되면 영속성 컨텍스트가 생성됩니다.
  1. 엔티티의 생명 주기
  • 비영속(new/transient)
        //new로 생성하여 아직 영속되지 않은 상태를 말함.
        //persist() 이전
        EntityObject entityObj = new EntityObj();
        entityObj.set("field");
  • 영속(managed)
        ///persist()를 사용 했을 경우
        entityManager.persist(entityObj); // 컨텍스트에 영속된 상태.
        //merge() 준영속 상태를 다시 영속으로 바꿨을 때 다시 영속으로 바뀐다.
  • 준영속(detached)
        entityManager.detach(entityObj); // 영속성 컨텍스트에서 특정 엔티티를 지운다.
        entityManager.clear(entityObj); // 영속성 컨텍스트의 모든 캐싱된 엔티티를 초기화 한다.
        entityManager.close(); //영속성 컨텍스트를 종료한다.
  • 삭제(removed)
        entityManager.removed(entityObj) // 객체를 삭제한다. 딜리트 쿼리 요청.

2. 영속성 컨텍스트의 이점

![영속성 컨텍스트의 이점](https://velog.velcdn.com/images/choiminwoo2/post/ec835c96-4c5c-4dfc-a8e7-4843f2b15109/image.png)
  • 같은 트랜잭션 내에 1차 캐시 기능을 가지고 있습니다.
        //트랜잭션 단위는 일반적으로 entityManager가 닫힐 때 까지다.
        // 한번 가져오면 캐싱이 되어 다시 불러 오더라도 쿼리문이 아닌 캐시에서 가져온다.
        EntityObj obj1 = entityManager.find(EntityObj.class, condition);
        EntityObj obj2 = entityManager.find(EntityObj.class, condition);
        obj1.equals(obj2) == true
  • INSERT 및 UPDATE의 쓰기 지연 기능을 제공한다.
        EntityObj obj1 = new EintityObj();
        EntityObj obj2 = new EintityObj();
        obj1.setId(1L);
        obj2.setId(1L);
        entityManager.persist(obj1); // 영속성 컨텍스트 쓰기 지연 저장소에 저장
        entityManager.persist(obj2); // 쓰기 지연 저장소에 저장
        entityTransaction.commit(); // fulsh가 동작하고 commit
  • 엔티티 수정 변경 감지
        EntityObj obj = entityManager.find(EntityObj.class, condition);
        obj.setfield("updated"); // 영속성 컨텍스트 캐시에 바꾼 값으로 엔티티가 저장.
        entityTransation.commit(); // flush가 작동하면서 스냅샷을 비교하여 바뀐 엔티티에 대해 update 쿼리 생성

3. Flush

-   언제 사용할까?
    1.  entityTransation을 커밋하면 동작한다.
    2.  JQPL문을 실행하면 동작한다.
    3.  entityManager.flush()로 강제 호출한다.
-   특징 및 사용
    1.  변경감지
    2.  수정된 엔티티를 쓰기 지연 SQL 저장소에 등록한다.
    3.  쓰기 지연 쿼리를 데이터 베이스에 전송한다
    4.  실제 커밋 되진 않고 DB에 쿼리문이 적용된다.
    5.  **테스트에서 이점**이 있다. DB에 데이터를 Insert, update ,delete 이후 rollback으로 데이터 복구가 가능하다.
    6.  데이터를 보내더라도 캐싱된 엔티티는 남아있다. 만약 컨텍스트의 초기화가 필요하다면 클리어 작업을 해야한다.
  • 이미지 저작권: 인프런 김영한님 강의에 있습니다!!.