본문 바로가기
공부/Spring

[JPA] 영속성 관리 - 내부 동작 방식

by JERO__ 2022. 7. 2.

영속성 컨텍스트

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

  • JPA를 이용하는데 가장 중요한 용어
  • EntityManager.persist(entity)
  • 영속성 컨텍스트는 논리적인 개념(눈에 보이지 않는다)
    • 엔티티 매니저를 통해 영속성 컨텍스트에 접근

엔티티의 생명주기

  • 비영속 : 영속성 컨텍스트와 전혀 관계없는 새로운 상태
  • Member member = new Member("member1", "회원1");
  • 영속 : 영속성 컨텍스트에 관리되는 상태
  • em.persist(member);
  • 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태
  • // 회원 엔티티를 영속성 컨텍스트에서 분리 em.detach(member);
  • 삭제 : 삭제된 상태
  • em.remove(member)

영속성 컨텍스트의 이점

  • 1차 캐시(영속성 컨텍스트라고 이해해도 된다)
    • 엔티티 조회

  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기지연 (쿼리를 한번에 보낼 수 있다)
    1. INSERT쿼리가 쓰기지연 SQL 저장소에 저장된다.
    2. flush시 저장된 쿼리 실행 (DB 저장)
  • 변경 감지
    • UPDATE 쿼리가 생성된 후 쓰기지연 SQL 저장소에 저장됨
  • Member findMember = em.find(Member.class, "member1"); // 1차 캐시에서 가져옴 findMember.setName("미키");
  • 지연 로딩

플러시

영속성 컨텍스트의 변경내용을 DB에 반영

  1. 변경 감지
  2. 쓰기지연 SQL 저장소에 변경쿼리 등록
  3. 저장된 쿼리를 DB에 전송(등록, 수정, 삭제)

플러시 하는방법

  • 직접 호출 : em.flush()
  • 자동호출
    • 트랜잭션 커밋 : tx.commit()
    • JPQL 쿼리 실행
    em.persist(memberA);
    em.persist(memberB);
    em.persist(memberC);
    
    // JPQL
    query = em.createQuery("select m from Member m", Member.class);
    List<Member> members = query.getResultList();
    

준영속 상태

준영속? 영속 → 준영속

준영속 상태로 만드는법

  • em.detach(entity)
  • em.clear() : 영속성 컨텍스트(전체)를 완전히 초기화
  • em.close() : 영속성 컨텍스트 종료

 

'공부 > Spring' 카테고리의 다른 글

[JPA] 연관관계 매핑 기초  (0) 2022.07.02
[JPA] 엔티티 매핑  (0) 2022.07.02
JPA 시작하기  (0) 2022.06.20
JPA 소개  (0) 2022.06.20
[chap17] 프로필과 프로퍼티  (0) 2022.06.09

댓글