본문 바로가기
JPA

[JPA] 영속성 컨텍스트

by steadyMan 2022. 8. 9.

영속성 컨텍스트는 Entity를 저장하고 관리하는 논리적인 환경으로 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다.

영속성 컨텍스트의 특징과 이점을 알아보자! 

엔티티의 생명주기


비영속(new/transient)

  - 객체를 생성은 했으나 영속성컨텍스트에서 관리되지 않는 새로운 상태

User user = new User();
user.setName("jang");
user.setAge(29);

영속(managed)

  - 영속성 컨텍스트에 관리되고 있는 상태로 객체가 생성되어 영속성컨텍스트에 포함되어 있다. 

User user = new User();
user.setName("jang");
user.setAge(29);

EntityManager em = createEntity....();
em.getTransaction().begin();

// 객체를 영속상태로 저장
em.persist(user)

준영속(detached)

  - 영속성 컨텍스트에 저장되었다가 분리된 상태로 더 이상 영속성 컨텍스트에서 관리되지 않는다. 

// user 엔티티를 영속성 컨텍스트에서 분리
em.detach(user);

삭제(removed)

  -  영속성컨텍스트에서 분리되고 DB에 delete쿼리가 요청된 상태

// user 객체를 삭제한 상태
em.remove(user);

 

생명주기그래프

영속성 컨텍스트 생명주기

1차캐시

영속성 컨텍스트에 @id값과 Entity를 key ~ value로 하는 1차 캐시가 존재한다. 영속성 컨텍스트에 종속될 경우 

1차캐시에 등록되는데 객체를 조회할때 1차캐시에 이미 해당 데이터가 존재하면 1차캐시에서 꺼내오고 

없을경우 DB에서 조회해 1차캐시에 입력 후 리턴한다. 

Member member = new Member();
member.setId("member1");
member.setAge(29);

// 객체를 영속상태로 저장
em.persist(member)

1차캐쉬에 입력된 member객체

member 객체를 조회를 한다면?

Member member = new Member();
member.setId("member1");
member.setAge(29);

// 객체를 영속상태로 저장
em.persist(member)

Member findMember = em.find(Member.class, "member1"); // 1차캐쉬에서 조회된다.
// 1차 캐쉬에 없을 경우 DB에 조회 후 리턴한다.
Member findMember2 = em.find(Member.class, "member2");

DB조회 시 조회 쿼리가 수행된다.

영속 엔티티의 동일성 보장 

영속성 컨텍스트는 엔티티에서 관리되는 객체중 같은 객체에 대한 동일성 비교를 보장한다. 

User user = em.find(User.class, "user1");
User user2 = em.find(User.class, "user1");

(a == b) = true; // 동일성 비교를 보장한다.

쓰기지연 

영속성 컨텍스트는 트랙잭션단위로 생성되는데 영속성컨텍스트의 변경사항에 대한 SQL을

영속성 컨텍스트 내부의 쓰기 지연 SQL 저장소 라는 공간에 보관하다 트랜잭션의  commit 시점에 한번에 반영한다.

transaction.begin(); // 트랜잭션 시작 

em.persist(memberA);
em.persist(memberB);
// 해당 시점에서 DB에 INSERT SQL을 보내지 않는다. 

// 트랜잭션 커밋 시점에 INSERT SQL 보낸다.
transaction.commit();

 

쓰기 지연 SQL 저장소에 쿼리가 저장된다.

 

commit 시점에 flush로 쿼리를 보낸 후 commit된다.

변경 감지(Dirty Checking)

영속 엔티티의 데이터의 수정이 발생하면 변경된 엔티티를 다시 넣어줘야할까? 

그렇지 않다. 영속성컨텍스트는 엔티티가 영속될때 최초의 상태를 스냅샷이란 공간에 저장해 놓고 

트랜잭션 commit시점에 Entity를 스냅샷과 비교하여 변경점이있으면 update 쿼리를 쓰기지연 SQL 저장소에 저장하고

commit을 수행한다. 

최초의 스냅샷과 비교하여 commit한다.

중요!

영속성 컨텍스트는 트랜잭션 단위로 생성되기 때문에 트랜잭션이 종료되면 초기화된다.

그렇기에 여러 비지니스 로직수행중에 중복될수 없다.

'JPA' 카테고리의 다른 글

[JPA] batchsize  (0) 2024.05.01
[JPA] 일반필드와 컬럼 매핑  (0) 2022.08.20

댓글