JPA

JPA 영속성 컨텍스트란?

Rudtjs 2022. 6. 15. 18:12

JPA를 공부할 때 가장 중요한 게 ORM과 영속성 컨텍스트를 이해하는 것이다. 

영속성 컨텍스트를 제대로 이해하고 JPA를 써보도록 하자.

 

 

영속성 컨텍스트란?

  • 영속성 컨텍스트는 엔티티를 저장하고 관리하는 가상의 데이터베이스 같은 개념이다. 엔티티 매니저를 통해 영속성 텍스트에 엔티티를 보관하고 관리한다.

 

엔티티의 생명주기

 

영속 (managed)

영속성 텍스트에 저장된 상태이고 엔티티가 영속성 텍스트에 의해 관리된다.

@Authwired
private EntityManager entityManager;

// 비영속 상태
Member member = createMember("1", "회원1");

// 영속 상태
entityManager.persist(member);

 

비영속 (new/transient)

  • 영속성 텍스트와 관계가 없는 상태를 말하는 것이다. 

 

준영속 (detached)

  • 영속성 텍스트에 저장되었다가 분리된 상태이다.
  • 영속성 텍스트자 제공하는 기능을 사용하지 못한다.
  • 식별자 값은 계속 가지고 있기 때문에 병합을 사용하면 다시 영속 상태가 된다.
@Authwired
private EntityManager entityManager;

Member member = new Member();
entityManager.persist(member);

// 엔티티를 영속성 컨텍스트에서 분리하면 준영속 상태가 된다.
entityManager.detach(member);
// 영속성 컨텍스트를 비우면 관리되고 있던 엔티티들은 준영속 상태가 된다.
entityManager.clear();  
// 영속성 컨텍스트를 종료해도 관리되던 엔티티들은 준영속 상태가 된다.
entityManager.close();

// 준영속 상태를 merge하여 다시 영속상태로 만들어준다.
entityManager.merge(member);

 

삭제 (removed)

  • 영속성 텍스트와 DB에서 해당 엔티티를 삭제한 것이다.
entityManager.remove(member);

 

 

플러시 (flush)

  • 영속성 텍스트변경 내용을 DB에 반영해주는 것을 의미한다
  • 트랜잭션 커밋, JPQL(Java Persistence Query Language)을 실행시키면 영속성 텍스트에 쌓여 있던 INSERT, UPDATE, DELETE 쿼리가 DB에 날아간다. 
  • 1차 캐시를 지우지 않고 DB와 동기화를 한다.
@Authwired
private EntityManager entityManager;

Member member = createMember(1, "회원 1");
// 영속
entityManager.persist(member);
// flush를 호출하여 DB에 반영시킴
entityManager.flush();

 

플러시 동작 과정

 

1. 회원 A를 영속화시켜 쓰기 지연소 SQL 저장소에 등록한다.

2. 트랜잭션을 커밋을  한다. 

3. 커밋을 하면 엔티티 매니저는 영속성 텍스트를 플러시를 해서 영속성 텍스트의 변경 내용을 데이터베이스에 동기화시킨다.

4. 쓰기 지연 SQL 저장소의 Query를 DB에 전송한다. (실제 데이터베이스 트랜잭션을 커밋)

 

 

 

📚 Reference 김영한 JPA 강의