티스토리 뷰

 

영속성 컨텍스트

엔티티를 영구 저장하는 환경이라는 뜻

EntityManager.persist(entity);

엔티티 매니저가 영속성 컨텍스트를 관리한다

 

엔티티 생명주기

  • 비영속 (new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  • 영속 (managed) : 영속성 컨텍스트에 관리되는 상태
  • 준영속 (detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제 (removed) : 삭제된 상태

 

영속성 컨텍스트의 이점

1. 1차 캐시

엔티티를 영속성 컨텍스트에 저장하는 순간(persist()) 1차 캐시에도 저장한다

조회(find())가 일어나면 1차 캐시에서 먼저 찾고 존재하면 DB조회를 하지않는다

하나의 트랜잭션 안에서 1차 캐시는 유효하다

 

2. 동일성 보장

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");

System.out.println(a == b); //동일성 비교 true

1차 캐시 덕분에 "member1"을 두번 조회해도 같은 객체이다(같은 참조)

 

3. 트랜잭션을 지원하는 쓰기 지연

트랜잭션 내부에 persist()가 일어날때, 엔티티들을 1차 캐시에 저장하고 논리적으로 쓰기지연 저장소에 쿼리들을 생성해서 쌓아 놓는다

flush()가 일어나는 시점에서 DB에 동시적으로 쿼리를 보낸다(commit()하면 flush()가 실행됨) 

 

4. 변경 감지(Dirty Checking)

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin(); // [트랜잭션] 시작

// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");

// 영속 엔티티 수정
memberA.setUsername("dong");
memberA.setAge(27);

//em.update(member)로 다시 저장해야 하지 않을까?

transaction.commit(); // [트랜잭션] 커밋

엔티티 데이터를 수정하고 트랜잭션 커밋만 실행하면 자동으로 업데이트 쿼리가 나간다

persist()를 실행하여 1차 캐시에 저장할 때, 동시에 스냅샷 필드에도 저장된다

그리고 commit()또는 flush()가 일어날 때 엔티티와 스냅샷을 비교해서, 변경사항이 있으면 업데이트 쿼리가 알아서 DB에 나간다

 

flush()

영속성 컨텍스트의 변경내용을 데이터베이스에 반영한다

트랜잭션 커밋이 일어날 때 동작하며, 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다(INSERT, DELETE, UPDATE)

 

 

 

참고

자바 ORM 표준 JPA 프로그래밍(김영한)

 

 

'개발 > Spring' 카테고리의 다른 글

[JPA] - JPA 엔티티 매핑 #2  (2) 2022.02.06
[JPA] - JPA 엔티티 매핑 #1  (0) 2022.02.06
[JPA] - JPA란  (0) 2022.01.25
[Spring] - 객체지향 설계 5원칙  (0) 2022.01.13
[Spring] - 의존관계 주입  (0) 2022.01.10
링크
최근에 올라온 글
글 보관함
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31