본문 바로가기
웹/Spring

[JPA] 영속성 컨텍스트

by J_Remind 2024. 9. 1.

영속성 컨텍스트란 엔티티를 영구 저장하는 환경으로 엔티티 객체들을 관리하는 일종의 메모리상의 공간을 의미한다. 영속성 컨텍스트는 데이터베이스와 자바 애플리케이션 사이에서 객체의 상태를 관리하고 동기화하는 역할을 한다.

엔티티 생명주기

  • 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계 없는 새로운 상태
  • 영속(managed) : 영속성 컨텍스트에 관리하는 상태
  • 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed) : 삭제된 상테
//영속성 컨텍스트 실습
//비영속성
Member member = new Member();
member.setId((100L));
member.setName("HelloJPA");

//영속
em.persist(member);

//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member); //특정 엔티티만 준영속 상태로 전환
em.clear() //영속성 컨텍스트를 완전히 초기화
em.clse() // 영속성 컨텍스트를 종료

//객체를 삭제한 상태(삭제)
em.remove(member);

영속성 컨텍스트 이점

  • 1차 캐시
    • 조회 시 1차 캐시(영속 컨텍스트(entityManager))에서 조회
    • 1차 캐시로 REPEATABLE READ(반복 가능한 읽기) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
  • 동일성(identity) 보장
    //영속 엔티티의 동일성 보장 Member a = em.find(Member.class, "member1"); 
    Member b = em.find(Member.class, "member1"); 
    System.out.println(a == b) //동일성 비교 true`
  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
      transaction.begin(); //트랜잭션 시작 
      em.persist(memberA); 
      em.persist(memberB); //아직 INSERT SQL을 데이터베이스 보내지 않음 
      //커밋하는 순간 데이터베이스에 INSERT SQL을 보냄 
      transaction.commit()
  • 변경 감지(Dirty Checking)
  • 지연 로딩(Lazy Loading)

플러시(Flush)

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
  • 데이터베이스 commit이 일어나면 자동적으로 플러시 발생
  • 변경 감지
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
  • 영속성 컨텍스트를 플러시하는 방법
    • 직접 호출(em.flush())
    • 플러시 자동 호출
      • 트랜잭션 커밋
      • JPQL 쿼리 실행
Member member = new Member(200L, "member200");
em.persist(member);
em.flush();  
tx.commit();

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

[JPA] Persist와 Merge  (0) 2024.09.03
(Spring) 2. MariaDB와 Mybatis 연동  (0) 2020.04.27
(Spring) 1. 스프링 설정  (0) 2020.04.26