간단이론정리/JPA

[JPA] 영속성 컨텍스트 (Persistence Context)

눕고싶은사람 2024. 6. 17. 20:29

영속성 컨텍스트(Persistence Context)

Entity를 영구 저장하는 환경. 눈에 보이지 않기 때문에 어플리케이션과 DB 사이 객체를 보관하는 가상 DB로 생각해도 무방 하다. EntityManager를 통해 접근.


엔티티 생명 주기

 

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

 

비영속(new)

Member member = new Member(); // 엔티티(객체) 생성
  • 객체 생성
  • 엔티티가 영속성 컨텍스트에 없는 상태 (= 영속성 컨텍스트와 관계 x)

 

영속(managed)

em.persist(member);
  • 엔티티가 영속성 컨텍스트에 저장
  • 즉, 영속성 컨텍스트가 엔티티를 관리

 

준영속(detached)

em.detach(member);
  • 엔티티가 영속성 컨텍스트에 저장되었다가 분리된 상태
    • 엔티티 영속 상태에서 준영속 상태로 간 상태!
  • 영속성 컨텍스트가 엔티티 관리하지 않음
    • 영속성 컨텍스트가 제공하는 기능 사용하지 못함
  • 준영속 상태로 만드는 법
    • em.detach(entity);
      • 특정 엔티티만 준영속 상태로 변환
    • em.clear()
      • 영속성 컨텍스트 초기화(다 지움)
    • em.close()
      • 영속성 컨텍스트 종료

 

삭제(removed)

em.remove(member);
  • 영속성 컨텍스트에 있는 엔티티를 삭제
  • 이때 DB에서도 삭제
    • 주의: 트랜잭션이 끝나거나 EntityManger를 플러시 하여 삭제 쿼리가 나가야 DB에서 삭제됨

flush(), Drity Checking

  • flush() : 영속성 컨텍스트 내부의 변경된 내용들을 DB에 반영한다.
    • 영속성 컨텍스트는 비워지지 않는다.
  • Dirty Checking(변경감지)
    • 영속성 컨텍스트가 관리하는 객체들이 등록, 변경, 수정, 삭제 시 DB에 반영

영속성 상태의 장점

  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경 감지
  • 지연 로딩

1. 1차 캐시

- Map 객체로 저장 : 엔티티를 식별자 값(@Id 맵핑)으로 구분한다. Key-value로 관리하는데 이때 key 값이 @Id 값이 된다.

- 식별자 값 필요 : 영속상태의 엔티티는 반드시 식별자 값이 있어야 한다.

 

2. 동일성 보장

- 동일한 객체 반환 : Collection에서 객체를 빼오듯이 같은 객체를 반환하게 되면 새로운 객체가 나오는 것이 아니라 동일한 객체가 반환된다.

 

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

- 쓰기 지연 : 영속성 컨텍스트는 트랜잭션 범위 안에서 동작한다. 그래서 트랜잭션이 끝나야 Commit이 이루어지고 반영된다.

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
// 엔티티 매니저는 데이터 변경 시 트랜잭션을 시작해야 한다
transaction.begin(); // 트랜잭션 시작

em.persist(memberA);
em.persist(memberB);
// 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.

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

 

 

4. 변경 감지

- 자동 Update : 영속성 상태의 객체는 객체의 데이터가 변경이 되면, 자동 update 된다.

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin() // 트랜잭션 시작
  
// 영속 엔티티 조회
Member memberA = em.find(Member.class, "memberA");

// 영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);

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

 

엔티티를 영속성 컨텍스트에 넣을 때의 최초 상태를 복사(스냅샷)하며 엔티티와 스냅샷을 비교하게된다.

 

 

5. 지연 로딩

- N+1 쿼리라고 부른다. 엔티티와 관계가 맺어진 엔티티의 데이터를 가져올 수 있다.

** 성능저하의 원인이 될 수도 있다.

 


 

출처 및 참고

https://velog.io/@conatuseus/%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-2-ipk07xrnoe#%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%9D%98-%ED%8A%B9%EC%A7%95

 

[JPA] 영속성 컨텍스트 #2

이번 글에서는 영속성 컨텍스트의 특징(1차 캐시, 트랜잭션을 지원하는 쓰기 지연, 변경 감지)에 대해 알아보겠습니다. 이 시리즈 글은 김영한 님의 강의, 책을 보고 적은 것임을 알려드립니다. (

velog.io

https://velog.io/@neptunes032/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%9E%80

 

JPA 영속성 컨텍스트란?

영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.em.persist

velog.io

https://ittrue.tistory.com/254

 

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

본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다. '자바 ORM 표준 JPA 프로그래밍 - 기본편' 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 JPA를 처음 접

ittrue.tistory.com

https://velog.io/@suk13574/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%9D%98-%EC%A0%84%EB%B0%98%EC%A0%81%EC%9D%B8-%EC%9D%B4%ED%95%B4%EA%B0%9C%EB%85%90-%EC%9E%A5%EC%A0%90-%EB%8F%99%EC%9E%91-%EB%B0%A9#-%EB%AA%A9%EC%B0%A8

 

[JPA] 영속성 컨텍스트의 전반적인 이해(개념, 장점, 동작 방식)

영속성 컨텍스트란?엔티티의 생명주기엔티티를 영속성 컨텍스트에 보관하여 얻는 장점JPA에서 가장 중요한 개념1\. 객체와 관계형 데이터 베이스 매핑(ORM) - 설계과 완련2\. 영속성 컨텍스트 - 실

velog.io

 

'간단이론정리 > JPA' 카테고리의 다른 글

[JPA] N+1에 대하여  (0) 2024.07.26