Persistence Framework/ORM -JPA

영속성 컨텍스트

prden 2021. 7. 2. 10:12

1.  영속성 컨텍스트 란?

엔티티를 영구저장하는 환경이라는 의미이다. 

영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어진다. 예를 들어 em.persist(member); 에서 persist() 메서드는 엔티티 매니저를 사용해서 회원 엔티티를 영속성 컨택스트에 저장한다. 

 

2.  엔티티의 생명주기

1) 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 상태이다. 

Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

2) 영속 : 영속성 컨텍스트에 저장된 상태이다. 

엔티티 메니저를 통해 엔티티를 영속성 컨텍스트에 저장하고 관리하는 상태를 영속 상태라고 한다. 

em.persist(member);

 

3) 준영속 : 영속성 컨텍스트에 저장되었다가 분리된 상태이다. 

영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다. 영속성 컨텍스트를 분리하는 경우가 그 예이다. 

em.detach(member);

 

4) 삭제 : 삭제된 상태이다. 

em.remove(member);

 

3. 영속성 컨텍스트의 특징

영속 상태는 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)이 반드시 있어야 한다. 또한 영속성 컨텍스트는 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영하게 된다. 이것을 플러시라고 한다. 

 

1) 영속성 컨텍스트가 엔티티를 관리할 때의 장점

 a. 1차 캐시 : 

Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

em.persist(member);

위의 코드를 실행하면 1차 캐시에 회원 엔티티를 저장한다.(이 경우 엔티티는 아직 데이터베이스에 저장되지 않은 것임)

em.find()를 호출할 경우 1차 캐시에서 식별자 값으로 엔티티를 찾고 엔티티가 있으면 데이터베이스를 조회하지 않고 메모리에 있는 1차캐시에서 엔티티를 조회한다. 

만약, 엔티티가 1차 캐시에 없으면 엔티티 매니저는 데이터베이스를 조회해서 엔티티를 생성한다 그리고 1차캐시에 저장한 후 영속 상태의 엔티티를 반환한다. 

 

b. 영속 엔티티의 동일성 보장

Member a = em.find(Member.class, "member1");

Member b em.find(Member.coass, "member1");

a==b는 true(실제 인스턴스가 같다는 말- 동일성 비교)

**동등성 비교 = 자바에서 equals() 메서드를 구현, 실제 인스턴스는 다를 수 있지만 인스턴스가 가지고 있는 값이 같다. 

 

c. 엔티티 등록

트랜잭션을 커밋하기 전에 데이터베이스에 엔티티를 저장하지 않고 내부 쿼리 저장소에 모아두는데 이것을 트랜잭션을 지원하는 쓰기 지연이라고 한다. 

 

d. 엔티티 수정

member.setUsername("hi"); 만으로 충분하다. em.update(member)이런 건 필요없다. 가능한 이유는??

'변경감지'라는 기능 때문이다. 

JPA는 엔티티를 영속성 컨텍스트에 보관할 때 최초 상태를 복사해서 저장해 둔다. 이것을 스냅샷이라고 한다. 그리고 플러시 시점에 스냅샷과 엔티티를 비교해서 엔티티를 찾는 것이다. 

 

 

'Persistence Framework > ORM -JPA' 카테고리의 다른 글

Spring Data JPA Pagination, Querydsl의 pagenation연결  (0) 2022.10.11
QueryDsl, 사용자 정의 Repository  (0) 2022.10.11
QueryDsl 설정  (0) 2022.10.05
N+1문제  (0) 2021.08.30
영속성 전이 : CASCADE 와 고아객체  (0) 2021.08.29