FireDrago
[JPA] 영속성 관리 본문
JPA의 가장 큰 특징 중 하나는 영속성 컨텍스트를 사용한다는 점이다.
영속성 컨텍스트에 대해 알아보자
영속성 컨텍스트


우선 PersistenceContext (영속성 컨텍스트)는 EntityManager 와 1:1 관계를 가진다.
즉 EntityManager가 사라지면, 영속성 컨텍스트도 사라진다.
영속성 컨텍스트는 엔티티를 관리하는 환경이라는 뜻이다.
논리적인 개념으로 눈에 보이지 않는다.
<영속성 컨텍스트의 이점>
1. 1차 캐시

영속 컨텍스트에는 1차캐시가 존재한다.
엔티티를 생성하고 em.persist() 를 사용하면 1차캐시에 pk키, Entity 로 저장한다.
조회 할때는 1차캐시에 있다면, DB 연결 없이 1차캐시에서 조회하고
1차캐시에 없다면, DB에 연결하여 조회한다.
2. 동일성 보장

동일한 트랜잭션 안에서, 조회한 엔티티는 동일성이 보장된다.
3. 트랜잭션 쓰기지연


영속성 컨텍스트에는 쓰기지연 SQL 저장소가 있다.
em.persist() , 변경감지, 삭제 등의 명령이 호출된 경우,
1차 캐시에 엔티티가 등록됨가 동시에, 쓰기 지연 SQL 저장소에 SQL 문들이 쌓인다.
flush 명령이 호출되고 DB에 sql문이 전달되고, 동기화된다.
4. 변경감지

1차캐시에는 스냅샷이 저장된다. 엔티티를 조회하여 setter 함수를 통해 변경하면
별도의 명령어 없이 UPDATE 문이 쓰기지연 SQL 저장소에 저장된다.
플러시 flush()
영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 명령어이다.
즉 등록, 수정, 삭제가 발생한 경우 데이터베이스와 동기화 하는 명령어이다.
플리서를 실행하는 방법
1. em.flush() 호출
2. 트랜잭션 커밋
3. JPQL 쿼리 실행
준영속 상태
엔티티가 영속성컨텍스트에서 관리되지 않는 상태
1.em.detatch(entity) : 특정 엔티티만 준영속 상태로 전환
2. em.clear() : 영속성 컨텍스를 완전히 초기화
3. em.close() : 영속성 컨텍스트를 종료
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// 트랜잭션 시작
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// 영속
Member member = em.find(Member.class, 200L);
member.setName("AAAAA");
// 준영속 상태로 만들기
em.detach(member);
System.out.println("==============");
// 트랜잭션 커밋
tx.commit();
} catch (Exception e) {
// 문제 있으면 롤백
tx.rollback();
} finally {
// EntityManager 닫기 , 작업마다 생성
em.close();
}
// EntityManagerFactory 하나만 유지
emf.close();
}
위 코드의 경우 영속상태에서 조회한 member 엔티티가
em.detach(member); 에 의해 준영속 상태가 되면서,
변경 SQL이 전달되지 않는다.
'프로그래밍 > JPA' 카테고리의 다른 글
| [JPA] @PersistenceContext 사용해야 하는 이유 (0) | 2024.04.08 |
|---|---|
| [JPA] JPQL 기본문법 2 (0) | 2024.04.06 |
| [JPA] JPQL 기본문법 1 (0) | 2024.04.04 |
| [JPA] 연관관계 관리 (0) | 2024.04.01 |
| [JPA] 엔티티 매핑 (0) | 2024.03.27 |
