2. 영속성 컨텍스트
영속성 컨텍스트
- JPA의 가장 핵심적인 내용 중 한가지는 바로 엔티티를 영구 저장하는 환경인
영속성 컨텍스트
이다. - 물리적인 개념이 아닌 논리적인 개념이다. JPA를 사용하면
엔티티 매니저
를 통해영속성 컨텍스트
에 접근하게 된다.
생명 주기
비영속
(new/transient)
: 영속성 컨텍스트와 전혀 관계없는 새로운 상태영속
(managed)
: 영속성 컨텍스트에 의해 관리되는 상태준영속
(detached)
: 영속성 컨텍스트에 저장되었다가 분리된 상태
: 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.삭제
(deleted)
: 삭제된 상태
// 객체 생성 (비영속)
Member member1 = new Member();
member.setId("member1");
Member member2 = new Member();
member.setId("member2");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin(); // transaction 시작
// 객체 저장 (영속)
em.persist(member1);
em.persist(member2);
// 영속성 컨텍스트에서 분리 (준영속)
em.detach(member1);
// 객체를 삭제한 상태 (삭제)
em.remove(member2);
영속성 컨텍스트로 얻을 수 있는 이점
#1 에서 JPA 의 이점에 대해서 언급했었다. 영속성 컨텍스트
는 아래와 같은 이점을 제공해줄 수 있다.
1차 캐시
em.find(member.class, "member2")
find 메서드를 호출하면 JPA 는영속성 컨텍스트
에 있는 엔티티를 먼저 조회한다.- DB 에 접근하지 않아도 되기 때문에 성능상에 이점을 제공한다.
영속 엔티티의 동일성 보장
Member a = em.find(member.class, "member")
Member b = em.find(member.class, "member")
System.out.println(a==b) // true
- 트랜잭션의 격리 수준을 DB 가 아닌 APP 차원에서 제공하기 때문에 동일한 엔티티를 보장해준다.
트랜잭션을 지원하는 쓰기 지연
persist()
시 SQL 은 DB에 바로 보내지지 않고쓰기 지연 SQL 저장소
에 저장되었다가commit()
이 되는 시점에flush
되면서 DB 로 전송된다.- SQL을 모아뒀다가 한번에 보내기 때문에 DB에 접근하는 횟수를 줄일 수 있다.
변경 감지 (Dirty Checking)
영속성 컨텍스트
는 1차 캐시 내에서 스냅샷과 엔티티를 비교해 변경이 감지되면쓰기 지연 SQL 저장소
에 update 쿼리를 저장해뒀다가 commit 되는 시점에 DB에 반영한다- 삭제도 이와 같은 방식을 이용한다.
플러시 ?
영속성 컨텍스트의 변경 내용을 DB 에 반영하는 것을 말한다.
플러시의 결과
- 변경 감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
플러시를 사용하는 방법
- em.flush()
: 직접 호출하는 방식 - transaction.commit()
: 플러시 자동 호출 - JPQL 쿼리 실행
: 플러시 자동 호출
출처
- 해당 포스트는 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 참고해서 작성되었습니다.
Author And Source
이 문제에 관하여(2. 영속성 컨텍스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@chullll/2.-영속성-컨텍스트저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)