영속성 컨텍스트 (persistence context)

  • 엔티티를 영구 저장하는 환경

1. 엔티티 생명 주기

  1. 비영속(new/transient)
  • 객체를 생성만 할뿐 저장하지 않은 상태

    Member member = new Member();
    member.setId(id);
    member.setUserName("test");
  1. 영속 (managed)
  • 엔티티 메니저를 통해 영속성 컨텍스트에 저장한 상태 (영속성 컨텍스트에의해 관리되는 상태)

  • 조회된 엔티티도 영속 상태

      // 영속성 컨텍스트에 저장
      entityManager.persist(member);
      // 조회
      // 영속성 컨텍스트에서 조회는 기본키를 통해서 조회
      entityManager.find(Member.class, id);
      // 조회 - 여려개를 조회 할때는 jpql을 사용
      List<Member> members = entityManager.createQuery("select m from Member m", Member.class).getResultList();
    
      // merge()사용하여 영속상태로 변경
      Member member = new Member();
      member.setId(id);
      // 영속상태로 변경 후 삭제 
      Member tMember = entityManager.merge(member);
      entityManager.remove(tMember);
  1. 준영속 (Detached)
  • 영속성 컨텍스트에 의해 더 이상 관리되지 않는 상태

    // 저장 
    entityManager.persist(member);
    // 준영속 상태로 변경 -> 1차캐시 및 지연sql저장소에서 삭제
    entityManager.detach(member);
    // 준영속 상태는 변경 감지를 할수 없음/db 반영 안됨
    member.setUserName("test");
    
    // member에 대한 inster sql은 db에 반영되지 않음
    entityTransaction.commit();
    
    // entityManager가 관리하던 모든 entity
    // 영속성 컨텍스트 모든 엔티티를 준영속상태로 변경 
    entityManager.clear();
    entityManager.close();
  1. 삭제
  • 엔티티를 영속성 컨텍스트 및 db 에서 삭제

  • 삭제 대상 엔티티를 먼저 검색 후 삭제해야함

    Member member = entityManager.find(Member.class, id);
    entityManager.remove(member);

5 entity 추가/수정/삭제/조회

2. 특징

  1. 영속상태는 반드시 식별자가 필요 (@Id)

  2. 트랜젝션을 커밋할때 영속성 컨텍스트에 저장된 엔티티가 db에 저장됨

  3. 1차 캐시

    // 1차 캐시에 저장을 하며 DB에는 저장하지 않는다.
    entityManager.persist(member);
    
    // 1차 캐시에서 우선적으로 검색 실행하며 없을 경우 db에서 조회
    // 1차 캐시에 저장 후 영속 상태의 엔티티 반환
    Member member1 = entityManager.find(Member.class, id);
  4. 동일성 보장

    // 1차 캐시에 있는 동일한 엔티티를 반환하므로 동일성을 보장
    // member1 == member2 / true
    Member member1 = entityManager.find(Member.class, id);
    Member member2 = entityManager.find(Member.class, id);
  5. 트랜잭션을 통한 쓰기 지연

  • 트랜잭션을 커밋하기 전까지 등록/수정/삭제 sql을 보관후 커밋 실행시 db에 전달하여 sql을 실행하여 db에 반영

'java' 카테고리의 다른 글

[Mockito] doReturn / thenReturn  (0) 2021.08.04
[Java] Jackson - JSON 파일 읽기 - 저장  (0) 2021.04.15
[Lombok] @Builder  (0) 2020.10.15
[JPA] EntityManagerFactory/EntityManager  (0) 2020.08.30
[JPA] jpa 설정 - persistence.xml  (0) 2020.08.29

+ Recent posts