TIL Day53 JPA 영속성 컨테스트

Colleen·2023년 5월 10일
0
post-thumbnail
post-custom-banner

영속성 컨텍스트란?

  • jpa를 공부하면서 빠질 수 없는 내용이라고 한다.
  • 엔티티를 영구 저장하는 환경을 의미 한다.
  • application과 DB 사이에서 객체를 보관하는 가상의 DB 같은 역할을 한다.
  • 서비스 각각마다 하나의 EntityManager Factory가 존재하며 EntityManager Factory에서 DB에 접근하는 트렌젝션이 생길 때마다 쓰레드 별로 EntityManager를 생성하여 영속성 컨텍스트에 접근한다.
  • 영속성 컨텍스트는 EntityManager를 생성할 때 만들어지며 EntityManager를 통해 영속성 컨텍스트에 접근하고 관리한다.

그럼 계속 언급되는 EntityManager는 무엇일까?

EntityManager

  • EntityManager는 영속성 컨텍스트 내에서 Entity들을 관리 한다.
  • EntityManager는 JPA에서 제공하는 interface로 spring bean으로 등록되어 있어 Autowired로 사용할 수 있다.
@Autowired
private EntityManager entityManager;
  • Query Method, Simple JPA repository는 직접적으로 entityManager를 사용하지 않도록 한번 더 감싸준 것이다.
    *결국 우리는 모르는 사이에 Jpa 영속성 컨텍스트를 쓰고 있었다는 것!!
  • 기존의 Spring jpa 에서 제공하는 것 이외의 작업이 필요하다면 EntityManager를 이용해서 직접 처리한다.
  • EntityManager는 Entity Cache를 가지고 있다.

Entity의 생명주기


모르는 사실중에, Entity도 생명주기가 있다는 이야기 였다. 정말 나는 모르고 작업을 많이 했다는 생각이 드는 부분이였다.

Entity의 생명주기는 각각 비영속, 준영속, 영속, 삭제로 나눌 수 있다. 일단은 하나하나 알아 보자.

비영속(new/transient)

  • 영속성 컨텍스트와 전혀 관계가 없는 상태이다.
  • 엔티티 객체를 생성하였지만 아직 영속성 컨텍스트에 저장하지 않은 상태를 의미한다.
    *말그대로 영속성 컨텍스트과 비영속, 즉 관계가 없는 상태라고 생각 하면 될 것 같다.
//객체만 생성한 비영속상태 
    User user = new User();

영속(managed)

  • 영속성 컨텍스트에 저장된 상태를 의미 한다.
  • 엔티티가 영속성 컨텍스트에 의해 관리된다.
  • 영속 상태가 되었다고 바로 DB에 값이 저장되지 않고 트렌젝션의 커밋 시점에 영속성 컨텍스트에 있는 정보들을 DB에 쿼리로 날리게 된다.(Entity Manager에서 관리 하다가 DB로 넘어가는 이미지를 생각하면 좋을 것 같다.)
@Autowired
private EntityManager entityManager;
// Class내에 Autowired로 EntityManager추가

    //객체만 생성한 비영속상태 
    User user = new User();
    
    // 객체를 저장한 영속상태
    entityManager.persist(user);

준영속(detached)

  • 영속성 컨텍스트에 저장되었다가 분리된 상태를 의미한다.
// 영속 -> 준영속
    // user엔티티를 영속성 컨텍스트에서 분리하면 준영속 상태가 된다.
    entityManager.detach(user);
    // 영속성 콘텍스트를 비우면 관리되고 있던 엔티티들은 준영속 상태가 된다. (대기 상태에 있는 변경 데이터들도 삭제)
    entityManager.clear();
    // 영속성 콘텍스트를 종료해도 관리되던 엔티티들은 준영속 상태가 된다.
   	entityManager.close();
    
    // 준영속 -> 영속 
    // detach를 하여 준영속상태에 빠진 entity를 merge를 하면 다시 영속 상태가 된다.
    entityManager.merge(user); 

그럼 준영속 상태의 특징은 무엇일까?

  • 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩을 포함한 영속성 컨텍스트가 제공하는 어떠한 기능도 동작하지 않는다.

삭제(removed)

  • 영속성 컨텍스트와 DB에서 해당 엔티티를 삭제하여 삭제된 상태이다.
 // user엔티티를 영속성 컨텍스트와 DB에서 삭제
    entityManager.remove(user);
profile
이상한 나라의 개발하는 예대생
post-custom-banner

0개의 댓글