반응형
이 포스팅에서 작성하는 내용은 자바 ORM 표준 JPA 프로그래밍 (김영한 지음) 에서 발췌하였습니다.
영속성 컨텍스트
- "엔티티를 영구 저장하는 환경" 이라는 뜻
- JPA를 이해하는데 가장 중요한 개념
- JPA를 이용하면 영속성 컨텍스트라는 개념이 자주 등장하니 초기에 잡아주는 것이 중요
- JPA와 Java 객체 사이의 임시 보관소? 라고 생각하면 쉽다.
→ 이 임시 보관소에 들어가야 JPA 관련 작업이 가능하다.
1. 엔티티 매니저 & 영속성 컨텍스트
- 영속성 컨텍스트는 논리적인 개념(눈에 보이지 않음)
- 엔티티 매니저를 통해서 영속성 컨텍스트에 접근
2. 엔티티의 생명주기
- 비영속 (new/transient)
- 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
// JPA와 관련없이 단순히 객체를 생성하고 정의한 상태
MemberInfo memberInfo = new MemberInfo();
memberInfo.setMemberId(5L);
memberInfo.setMemberName("홍길동");
- 영속 (managed)
- 영속성 컨텍스트에 관리되는 상태
// JPA와 관련없이 단순히 객체를 생성하고 정의한 상태
MemberInfo memberInfo = new MemberInfo();
memberInfo.setMemberId(5L);
memberInfo.setMemberName("홍길동");
// 엔티티 매니저를 이용하여 영속성 컨텍스트에 접근
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// 객체를 저장한 상태 (영속)
em.persist(memberInfo);
- 준영속 (detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태
// JPA와 관련없이 단순히 객체를 생성하고 정의한 상태
MemberInfo memberInfo = new MemberInfo();
memberInfo.setMemberId(5L);
memberInfo.setMemberName("홍길동");
// 엔티티 매니저를 이용하여 영속성 컨텍스트에 접근
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// 객체를 저장한 상태 (영속 상태)
em.persist(memberInfo);
// memberInfo 엔티티를 영속성 컨텍스트에서 분리 (준영속 상태)
em.detach(memberInfo);
- 삭제 (removed)
- 삭제된 상태
// JPA와 관련없이 단순히 객체를 생성하고 정의한 상태
MMemberInfo memberInfo = new MemberInfo();
memberInfo.setMemberId(5L);
memberInfo.setMemberName("홍길동");
// 엔티티 매니저를 이용하여 영속성 컨텍스트에 접근
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// 객체를 저장한 상태 (영속 상태)
em.persist(memberInfo);
// 영속성 컨텍스트에서 해당 엔티티를 삭제 (삭제 상태)
em.remove(memberInfo);
3. 영속성 컨텍스트의 이점
- 1차 캐시
- DB에서 가져오거나 persist를 이용해서 엔티티를 넣은 경우, 1차 캐시에 저장하고 그 이후에 조회할 때 DB에서 조회하지 않고 캐시에서 가져옴
- 트랜잭션 내부에서만 동작.
- 다른 JPA와 공유하는 건 2차 캐시라고 함
- 트랜잭션 내부에서만 동작하기 때문에 찰나의 순간에서 사용
- 동일성 보장
- 동일 트랜잭션 내에서 같은 데이터를 서로 다른 엔티티에 두었을 때, 이 서로 다른 엔티티는 동일성을 만족한다.
- 트랜잭션을 지원하는 쓰기 지연
- 트랜잭션에서 쿼리들을 모아서 커밋할 때 한 번에 입력한다.
- 쿼리 하나씩 입력해서 자주 왔다갔다 하는 것 보다 한 번에 가는 것이 효율적
- 변경 감지
- 트랜잭션 내에서 영속성 컨텍스트 내의 데이터를 수정 시, 커밋할 때 변경된 내용을 알아서 UPDATE 쿼리로 입력
- 스냅샷을 찍어두고 커밋할 때 비교해서 변경된 내용을 알아냄
- 지연 로딩
- 특정 엔티티를 조회할 때 연관된 엔티티를 한 번에 조회하지 않고, 그 연관된 엔티티가 실제로 사용될 때 조회하는 옵션
- 즉시 로딩 : 특정 엔티티를 조회할 때 연관된 엔티티를 한 번에 조회
반응형
'BE > JPA' 카테고리의 다른 글
[JPA] 8. 엔티티 매핑 (0) | 2022.04.13 |
---|---|
[JPA] 7. 플러시 & 준영속상태 (0) | 2022.04.13 |
[JPA] 5. JPA에서 리스트를 조회해보자 (0) | 2022.04.05 |
[JPA] 4. JPA 맛보기 (0) | 2022.03.31 |
[JPA] 3. JPA 프로젝트 세팅 (0) | 2022.03.26 |