![[JPA] 03. 영속성 관리](https://inblog.ai/_next/image?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255BJPA%255D%252003.%2520%25EC%2598%2581%25EC%2586%258D%25EC%2584%25B1%2520%25EA%25B4%2580%25EB%25A6%25AC%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3D%25EB%25B0%25B1%25EC%2597%2594%25EB%2593%259C%25EB%25B8%2594%25EB%25A1%259C%25EA%25B7%25B8-dohyeong&w=1920&q=75)
JPA 가장 중요한 2가지
- 객체와 관계형 데이터베이스 매핑하기
- 영속성 컨텍스트
엔티티 매니저 팩토리와 엔티티 매니저
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252Fc576369d-efee-46f0-b454-6f4cd04b6573%252FUntitled.png%3Ftable%3Dblock%26id%3D4928495e-3747-441d-8f1c-f1410dbde49d%26cache%3Dv2&w=3840&q=75)
영속성 컨텍스트
“엔티티를 영구 저장하는 환경” 이라는 뜻임
논리적인 개념
눈에 보이지 않는다
엔티티 매니저를 통해서 영속성 컨텍스트에 접근
📌 엔티티의 생명주기
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252F7ef6c8b7-dc11-4419-a2c1-1224a1f96d7a%252FUntitled.png%3Ftable%3Dblock%26id%3Da003d58b-fa7f-4461-9187-9262db4e0312%26cache%3Dv2&w=3840&q=75)
비영속
jpa와 관련없는 상태
객체를 생성한 상태
영속
엔티티 매니저로부터 객체를 persist한 상태
준영속, 삭제
엔티티를 영속성 컨텍스트에서 분리한다.
영속 → 준영속
- 영속 상태의 엔티티가 영속성 컨텍스트에서 분리
- 영속성 컨텍스트가 제공하는 기능을 사용 못함
em.detach(entity) em.clear() em.close()
영속성 컨텍스트의 이점
1차캐시
엔티티 조회, 1차 캐시
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252F250fe38b-a6ab-4dae-bdd7-ad5b0e5cd10d%252FUntitled.png%3Ftable%3Dblock%26id%3Df61c65b2-8b2a-4c05-9023-b84601704d4c%26cache%3Dv2&w=3840&q=75)
DB 를 안보고 캐시값을 먼저 보고 찾음 → 없다면 DB 조회 → 1차 캐시에 없는 member2 를 1차 캐시에 저장 → 반환
1차 캐시는 트랜잭션 안에서만 동작하기 때문에 크게 이점은 없음
영속 엔티티의 동일서 보장
→ 1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
트랜잭션을 지원하는 쓰기 지연
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252F0328efcc-e79d-4180-96bd-76c2425d2797%252FUntitled.png%3Ftable%3Dblock%26id%3D1f42793f-3a0a-4bb5-b291-2feabafa0c46%26cache%3Dv2&w=3840&q=75)
쓰기 지연하는 상태
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252F571415c3-3850-4612-9404-9d235f25842f%252FUntitled.png%3Ftable%3Dblock%26id%3D642be83f-e89b-459b-b1c2-ec2c63975c8c%26cache%3Dv2&w=3840&q=75)
transaction.commit() 시 DB에 flush 해줌
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252F640dd7b3-bb90-43d9-ada7-af1263735c64%252FUntitled.png%3Ftable%3Dblock%26id%3Dc4fd96c6-91ed-4e39-8b3f-79b98fd66294%26cache%3Dv2&w=3840&q=75)
변경 감지 ( Dirty Checking )
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252F4c849c48-cc89-411f-a35e-bb8596067900%252FUntitled.png%3Ftable%3Dblock%26id%3D12fe5019-c04a-49f1-9520-8d842b7a14d2%26cache%3Dv2&w=3840&q=75)
- 최초로 영속할 때 1차 캐시에 스냅샷을 저장함
- 엔티티와 스냅샷과 비교
엔티티 삭제
Member memberA = em.find(Member.class, "memberA"); em.remove(memberA);
플러시
영속성 컨텍스트의 변경내용을 데이터베이스에 반영
플러시 발생
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
영속성 컨텍스트에 플러시 하는 방법
- em.flush() - 직접 호출
- 트랜잭션 커밋 - 자동 호출
- JPQL 쿼리 실행 - 자동 호출
플러시는
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 → 커밋 직전에만 동기화하면 된다.
준영속 상태로 만드는 방법
- em.detach(entity) → 특정 엔티티만 준영속 상태로 전환
- em.clear() → 영속성 컨텍스트를 완전히 초기화
- em.close() → 영속성 컨텍스트를 종료
Share article