정의

  • JPA 작업 결과를 DB에 반영 하기 위해 사용되는 일종의 캐시(cache)로 엔티티(Entity) 객체를 관리하며, DB와 동기화 되는 별도의 공간 
  • JPA를 이해하는데 가장 중요한 용어
    • JPA: DB의 SQL 작업을 객체로 취급하여 작업하는 것
  • 엔티티를 영구 저장하는 환경
    • 구성요소: 1차 캐쉬, 쓰기 지연 SQL 저장소
  • 논리적인 개념으로 눈에 보이지 않는다.
  • 엔티티 매니저를 통해서 영속성 컨텍스트에 접근
    • 엔티티 매니저(EntityManager) 생성시 1대1 영속성 컨텍스트(PersistenceContext)가 생성 (J2SE 환경)

엔티티의 생명주기

  • 비영속: 영속성 컨텍스트와 전혀 관계가 없는 생성만 한 상태
Item item = new Item();
item.setName("doll");
item.setPrice("10000");
item.setId("150L");
  • 영속: 영속성 컨텍스트에 관리되는 상태
    • 실제로 DB에 저장되는 것은 아직 아님 !
Item item = new Item();
item.setName("doll");
item.setPrice("10000");
item.setId("150L");

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("UnitName");
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
// 영속
em.persist(item);
  • 준영속: 영속성 컨텍스트에 저장되었다가 분리된 상태
    • 이후 commit을 하더라도 해당 속성의 엔티티의 관련된 쿼리문은 나가지 않는다.
em.detach(member); // 특정 엔티티만 준영속 상태로 전환
em.clear(); // 영속성 컨텍스트를 완전히 초기화
em.close(); // 영속성 컨텍스트를 종료
  • 삭제: 삭제된 상태
em.remove(member);

데이터 조회 과정

  • 영속성 컨텍스트 내부의 1차 캐쉬 탐색
  • 연결된 DB 탐색
  • 그 후 탐색된 값을 1차 캐쉬에 저장
  • 이때 조회된 데이터는 동일성을 보장한다. (1차 캐쉬 덕분)
Item item1 = em.find(Item.class, 150L);
Item item2 = em.find(Item.class, 150L);

System.out.println(item1==item2); // true 출력

데이터 삽입 과정

  • EntityManager.persist("Item")실행시 1차 캐시에 저장
  • JPA가 Unit를 분석하여 쿼리문을 자동 생성
  • 해당 쿼리문을 쓰기 지연 SQL 저장소에 저장
  • EntityTransaction.commit() 시 해당 쿼리문 DB에 전송(flush)
    • 해당 작업이 있는 이유: 추가적으로 최적화 할 수 있는 여지가 생기기 때문
  • 실제 데이터 베이스 트랜잭션 commit

데이터 변경 과정(삭제도 동일)

Item item = em.find(Item.class,150L);
            item.setName("Rock");
tx.commit();
  • 영속성 컨텍스트 내부에서 flush() 실행
    • flush는 쓰기 지연 SQL 저장소에 있는 쿼리를 DB에 반영하는 행위
  • 1차 캐쉬에서 엔티티와 스냅샷을 비교
  • 바뀐 내용이 있다면 업데이트 SQL문을 쓰기 지연 SQL 저장소에 저장
  • 쿼리문 DB에 전송
  • 실제 데이터 베이스 트랜잭션 commit

플러시(flush)

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것
    • 영속성 컨텍스트와 데이터 베이스의 데이터를 동기화
  • 트랜젝션이 commit될때 일어난다.
  • 과정 (1차 캐쉬의 내용을 건들지는 않는다)
    • 변경 감지
    • 수정된 엔티티 쓰기 지연 sql 저장소에 등록
    • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
  • 사용법
    • em.flush() 호출
    • 트랜션 커밋
    • JPQL 쿼리 실행
  • 플러시 모드 옵션
    • FlushModeType.AUTO: 커밋이나 쿼리를 실행할 때 플러시 (디폴트 설정)
    • FlushModeType.CUMMIT: 커밋을 할 때만 플러시

학습 자료 출처: https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

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

Spring Boot Gradle JAR 파일 생성 실행  (0) 2023.05.23
엔티티 매핑  (0) 2023.04.27
빈 스코프  (0) 2023.03.21
빈 생명주기 콜백  (0) 2023.03.20
다양한 의존관계 주입 방법  (0) 2023.03.19

+ Recent posts