Spring 16. 영속성 컨텍스트

김창민·2024년 8월 16일

BE

목록 보기
36/50

영속성 컨텍스트

  • Persistence ← 영속성, 지속성
    • 객체에게 Persistence는 ‘객체가 생명(유지 시간)이나 공간(객체 위치)을 자유롭게 유지하고 이동할 수 있는 성질’
    • 쉽게 말해서 Entity 객체를 효율적으로 관리하기 위한 공간임

Entity Manager

  • 영속성 컨텍스트에 접근해서 Entity 객체를 조작하려면 Entity Manager가 필요함
    - 이를 이용해서 Entity를 저장, 조회, 수정, 삭제 하는 것
    • EntityManagerFactory를 통해서 Manager를 생성함

EntityManagerFactory

  • DB 하나에 하나만 생성(싱글톤)되어 애플리케이션이 동작하는 동안 사용됨
  • EntityManagerFactory 생성을 위해선 DB에 대한 정보를 전달해야함. ← Spring에선 하이버네이트가 자동으로 처리해줌

기능

  • 1차 캐시
  • 쓰기 지연 저장소
  • 변경 감지
  • 1차 캐시
    • 영속성 컨택스트 내부 캐시 저장소임.
    • Entity 객체들이 여기에 저장됨.
      • Map 자료구조 형태로 되어있음 .key:value
        • Key는 @Id로 매핑한 값이 저장됨
        • value에는 해당 Entity 클래스의 객체가 저장됨
    • Entity 저장
      • em.persist(memo); 를 통해 Entity 객체를 캐시 저장소에 저장
    • Entity 조회
      • em.find(Memo.class, 1); 를 통해 클래스 타입과 key를 입력하면 캐시 저장소에서 찾아옴
      • 만약 없으면 DB에서 SELECT 조회 후 캐시 저장소에 저장하고 반환함
    • Entity 삭제
      • em.remove(entity); 호출시 삭제할 Entity를 캐시 저장소 내부에서 DELETED 상태로 만들고 트랜잭션 commit시 DELETE SQL이 DB에 요청됨
  • 쓰기 지연 저장소
    • 트랜잭션을 위해서 SQL을 모아서 한번에 DB에 반영하는 공간
    • EntityTransaction et = em.getTransaction();
      • 이렇게 생성하고, 그냥 하던것 처럼 em.persist로 객체를 추가하고, et.commit으로 넘기는 그런 역할임
    • 사실 commit 전에 flush 메서드가 있음
      • 영속성 컨텍스트의 변경 내용들을 DB에 반영하는 역할
      • 즉, 쓰기지연저장소의 SQL들을 DB에 요청함
      • 커밋시 EntityManager가 자동으로 flush를 호출함
  • 변경 감지(Dirty Checking)
    • JPA는 Update 메소드가 없다.
    • persist로 Entity를 생성하거나 저장하고, Commit시 최초 상태와 현 상태를 비교해서 변경을 확인한다.
    • 변경 내용이 있으면 Update SQL을 생성해서 쓰기 지연 저장소에 저장하고 commit 하는 것.
    • 즉, 경하고 싶은 데이터가 있다면 먼저 데이터를 조회하고 해당 Entity 객체의 데이터를 변경하면 자동으로 Update SQL이 생성되고 DB에 반영됩니다.
profile
일일 회고 : https://rlackdals981010.github.io/

0개의 댓글