영속성 컨텍스트(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()
- 영속성 컨텍스트 종료
- em.detach(entity);
삭제(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 쿼리라고 부른다. 엔티티와 관계가 맺어진 엔티티의 데이터를 가져올 수 있다.
** 성능저하의 원인이 될 수도 있다.
출처 및 참고
[JPA] 영속성 컨텍스트 #2
이번 글에서는 영속성 컨텍스트의 특징(1차 캐시, 트랜잭션을 지원하는 쓰기 지연, 변경 감지)에 대해 알아보겠습니다. 이 시리즈 글은 김영한 님의 강의, 책을 보고 적은 것임을 알려드립니다. (
velog.io
JPA 영속성 컨텍스트란?
영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.em.persist
velog.io
https://ittrue.tistory.com/254
[JPA] 영속성 컨텍스트(Persistence Context)란? - 개넘 정리 및 사용법
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다. '자바 ORM 표준 JPA 프로그래밍 - 기본편' 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 JPA를 처음 접
ittrue.tistory.com
[JPA] 영속성 컨텍스트의 전반적인 이해(개념, 장점, 동작 방식)
영속성 컨텍스트란?엔티티의 생명주기엔티티를 영속성 컨텍스트에 보관하여 얻는 장점JPA에서 가장 중요한 개념1\. 객체와 관계형 데이터 베이스 매핑(ORM) - 설계과 완련2\. 영속성 컨텍스트 - 실
velog.io
'간단이론정리 > JPA' 카테고리의 다른 글
[JPA] N+1에 대하여 (0) | 2024.07.26 |
---|