본문 바로가기
Dev/JPA

JPA 영속성 컨텍스트

by zemba 2022. 8. 18.
반응형
SMALL

영속성 컨택스트 개념

JPA의 영속성 컨텍스트란 엔티티를 영구적으로 저장하는 환경을 말한다. 어플리케이션과 데이터 베이스간에 객체를 보관하는 공간의 역활을 하고 있다. 엔티티를 저장하고 조회하면 영속성 컨텍스트에서 이를 보관하고 관리한다. 이 공간은 데이터베이스와 동일한 역활을 한다.

영속성은 그림과 같이 4가지 상태로 구분되어 관리가 된다.

  • New(비영속) - 영속성과 관계가 없는상태. 엔티티 객체를 생성하고 아직 영속화 하지 않은 상태
  • Managed(영속) - 영속성 컨텍스트에 저장된 상태
  • Detached(준영속) - 영속성 컨텍스트에 저장되었다가 빠져나온 상태
  • Removed(삭제) - 관리 대상에서 제거된 상태

그림과 같이 New(비영속)상태의 엔티티를 persist()를 통해 영속화를 시킬수 있다. 이때부터 엔티티는 영속성 컨텍스트에서 관리된다.
이후 detach(), remove()를 통해 삭제 또는 준영속 상태로 변경할수 있다. 아직 detach와 remove를 사용해본 경험은 별로 없는듯하다.


영속성 컨텍스트의 동작방식

영속화 된 엔티티는 식별자(ID 또는 PK)값으로 구분한다. 영속화된 엔티티를 DB에 반영하는 시점은 트랜잭션이 Commit되는 순간에 Flush를 통해 반영된다. flush를 통해 실제 DB에 쿼리를 수행시키고 이를 commit하여 최종 반영한다.

영속성 컨텍스트에서 DB에 저장하는 과정

위 그림과 같은 과정을 저장이되며 이때 영속 컨텍스트에서는 1차캐시에 영속화된 정보를 가지고 있는다. 1차 캐시에서 영속상태의 정보를 가지고 있기 때문에 엔티티를 조회하게 되면 1차 캐시의 정보를 먼저 찾는다. 이로써 불필요하게 DB를 조회하는 일을 줄일수 있다. 1차 캐시에 없는 경우 그때 DB에서 조회가 이루어지며 결과를 1차캐시에 저장한다. 이후 같은 엔티티를 조회할 경우에는 1차캐시에서 영속화된 엔티티를 찾게 된다.

EntityManager를 통해 Flush와 Clear를 통해 영속성 컨텍스트에 저장된 데이터를 DB로 저장하거나 삭제할수 있다. 하지만 이 동작은 물리적인 DB를 호출하는 과정이 연결되기 때문에 성능의 부분에 있어 가급적이면 피하는것이 좋을것 같다. 영속성에서 관리되는 엔티티로만 제어가 가능하다면 강제적으로 건들지 않는편이 성능에 좋아 보인다. (I/O비용을 줄이자는 생각..다른 처리상의 이슈가 있다면 생각하면서 사용하자)

Flush의 동작 시점

flush는 3가지 방법에 의해 진행된다.

  • entityManager.flush()
  • 트랜잭션 Commit 발생시 자동호출
  • JPQL 수행시 자동호출

JPQL 수행시 자동호출은 영속화된 상태의 데이터가 아직 DB에 동기화되지 않은 상태의 영속화된 엔티티가 존재할수 있기 때문에 변경사항에 대하 내용을 최종적으로 DB에 반영하고 이후 DB에 쿼리를 수행하도록 되어있다. 그렇기 때문에 여기서 다시 생각해봐야할 부분은 JPQL은 1차캐시를 먼저 찾지 않고 DB를 먼저 조회하는것을 알수 있다. 하지만 JPQL로 먼저 DB를 조회하지만 영속성 컨텍스트에 이미 영속화된 결과가 존재할 경우 DB의 결과를 반영하지 않는다.

반응형
LIST

댓글