[Spring, Java] 영속성 컨텍스트(Persistence Context)

김현수·2024년 4월 8일
0

Spring 스터디

목록 보기
1/1
post-thumbnail

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

  • JPA를 이해하는데 가장 중요한 용어 중 하나로 엔티티를 영구 저장하는 환경이라는 뜻이다.
  • 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할이다.
  • 엔티티 매니저(em)를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

엔티티의 생명주기

  • New → 비영속 상태: 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태이다. 객체를 생성한 상태라고 보면 된다.
Member member = new Member();
member.setId("Id");
member.setUsername("name");
  • Managed → 영속 상태: 영속성 컨텍스트에 저장된 상태이다. 엔티티매니저를 통해 persist()로 저장을 한 상태라고 보면 된다.
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

//객체를 영속성 컨텍스트에 저장
em.persist(member);
  • Detached → 준영속 상태: 영속성 컨텍스트에 저장되어 있는 객체를 분리한 상태이다. 엔티티매니저를 통해 detach()한 상태.
// 객체를 영속성 컨텍스트에서 분리
em.detach(member);
  • Removed → 삭제 상태: 영속성 컨텍스트에서 객체를 삭제한 상태이다. 엔티티매니저를 통해 remove()한 상태이다.
//객체를 영속성 컨텍스트에서 삭제
em.remove(member);

영속성 컨텍스트의 특징

  • 영속성 컨텍스트는 엔티티를 식별자 값으로 구별한다. 영속 상태일때는 반드시 식별자 값이 있어야 한다.
  • JPA는 트랜잭션을 커밋하는 순간이나 em.flush()를 하거나 JPQL 쿼리를 실행하면 영속성 컨텍스트에서 새로 저장된 엔티티를 파악하여 데이터베이스에 반영한다. → 플러시
    • 플러시는 새로 저장된 엔티티를 파악할 뿐만 아니라 변경 내용을 데이터베이스의 동기화 시켜준다.
      1. 변경감지를 하여 스냅샷과 비교하여 수정된 엔티티를 찾는다.
      2. 수정된 엔티티에 대한 쿼리문을 만들고 데이터베이스에 SQL 저장소에 등록한다.
      3. 쓰기지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.

장점:

  • 1차캐시
    • 영속성 컨텍스트에는 1차 캐시가 존재한다. 영속상태로 존재하는 엔티티를 1차 캐시에 저장하기에 엔티티를 조회할 때 1차 캐시에 그 엔티티가 존재한다면 데이터베이스를 찾아보지 않아도 된다.
  • 영속 엔티티의 동일성 보장
    • 동일성 vs 동등성

      동일성: 주소값까지 완전히 같은 객체. ==으로 판별한다.
      
      동등성: 주소값이 다르지만 같은 정보를 가지고 있는 객체. equals()로 판별한다.
      Member a = em.find(Member.class, "member1");
      Member b = em.find(Member.class, "member1");
      
      System.out.println(a==b) // true
    • 영속 엔티티에서 꺼낸 같은 데이터를 ==연산자를 통해 비교하면 true가 나온다.

    • 이는 영속 엔티티가 동일성을 보장한다는 점을 알 수 있다.

  • 쓰기지연
    • em.persist를 해서 객체를 저장해도 DB에 바로 Insert를 하지 않는다.
    • 쿼리들을 모았다가 플러시를 할 때 쿼리를 한번에 모두 날린다.
    • 이를 쓰기지연이라 한다.
    • 쓰기지연이 없으면 쿼리 하나마다 매번 DB에 연결하고 해제를 해야하고 테이블에 계속 접근해야 하는데 이때 시간이 너무 걸린다. 쓰기지연은 이 시간을 단축시켜준다.
  • 변경감지(더티체킹)
    • 영속성 컨텍스트에 있는 엔티티를 수정하면 알아서 변경을 감지하여 수정 쿼리를 생성해준다.
    • 물론 이 수정쿼리도 쓰기지연이 될 수 있다.

[JPA] 영속성 컨텍스트란?

[JPA] 영속성 컨텍스트(Persistence Context)란? - 개넘 정리 및 사용법

JPA 영속성 컨텍스트란?

1개의 댓글

comment-user-thumbnail
2024년 5월 8일

아직 저와 심리적 거리가 먼 🤨 영속성 컨텍스트와 가까워질 수 있는 시간이었습니다.

답글 달기