본문 바로가기
Java/ORM

JAVA ORM - JPA(영속성 컨텍스트)

by 티코딩 2024. 7. 31.

영속성 컨텍스트(Persistence Context)란

엔티티를 관리하는 저장소라고보면 된다. 엔티티 매니저가 엔티티를 영속성 컨텍스트에 보관하고, 이 컨텍스트 내에서 엔티티의 상태를 관리한다.

1. 엔티티 객체의 생명 주기를 관리하고

2. 1차 캐시로서 DB에서 조회한 엔티티를 메모리에 캐시해서 반복 조회 시 비용절감의 효과가 있고

3. 영속 엔티티의 동일성을 보장하고

4. 엔티티의 변경 사항 감지하고 트랜잭션이 끝날 때 DB에 반영함.

 

1. 엔티티의 생명주기

  • 비영속(Transient) : 새로운 엔티티 객체를 생성하면 비영속 상태
  • 영속(Persistent) : 영속성 컨텍스트에 의해 관리되는 상태 (entityManager.persist() 메서드 호출)
  • 준영속(Detached) : 한 번 영속상태였다가 영속성 컨텍스트에서 분리된 상태(entityManager.detachted() 메서드 호출)
  • 삭제(Removed) : 영속성 컨텍스트에서 삭제된 상태 (entityManager.remove() 메서드 호출)
//비영속상태
Member member = new Member();
            member.setId(1L);
            member.setName("name");
            
//엔티티 영속            
em.persist(member);

 

 

2. 1차 캐시

만약 memberB가 DB엔 있고, 1차캐시에 없다고 쳐보자.

Member findMemberB = em.find(Member.class, "memberB");

이걸로 1차캐시를 찾아보고 없으면 DB에서 조회를 한다. 조회한 멤버B를 1차캐시에 저정한다.

이후에 멤버B를 조회하면DB를 조회하지않고도 1차캐시에서 찾아서 반환이된다.

하지만 한 트랜잭션내에서만 1차캐시가 지속되어 그렇게 큰 이점을 얻진 못한다.

 

3. 동일성 보장

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

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

System.out.println(a==b);

하면 true가 나온다. 영속 엔티티의 동일성을 보장한다는 뜻.

 

4. 변경사항 감지 후 트랜잭션이 끝날때 DB에 반영(쓰기 지연)

em.persist(memberA);

em.persist(memberB);
// 여기까진 Insert 쿼리를 DB에 보내지 않고

transaction.commit();

//커밋하는 순간 쿼리를 보내 DB에 저장함.

 

 

플러시(flush)

영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 작업

DB트랜잭션이 커밋되면 플러시가 자동으로 발생하는데, 변경감지가 일어나고, 수정된 엔티티를 쓰기지연 SQL 저장소에 등록한다.

플러시는 영속성 컨텍스트를 비우는게 아니라, 영속성 컨텍스트의 변경내용을 DB에 반영하는것.

'Java > ORM' 카테고리의 다른 글

JAVA ORM - JPA(상속을 매핑?)  (0) 2024.08.05
JAVA ORM - JPA(연관관계 매핑2)  (0) 2024.08.03
JAVA ORM - JPA(연관관계 매핑)  (0) 2024.08.01
JAVA ORM - JPA(엔티티 매핑)  (0) 2024.07.31
JAVA ORM - JPA(기본 세팅, 간단한 JPA예제)  (0) 2024.07.30