정의
- 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 |