[JPA] 영속성 컨텍스트

SJ·2022년 12월 1일

JPA

목록 보기
1/12

영속성 컨텍스트


클라이언트의 요청이 올 때마다, EntityManagerFactory는 EntityManager를 생성한다.

생성된 EntityManager는 내부적으로 커넥션을 사용해 데이터베이스를 접근할 수 있다.

EntityManagerFactory

  • 엔티티 매니저를 만드는 공장으로, 생성 비용이 커서 한개만 만들어서 애플리케이션 전체에서 공유하여 사용한다.
  • 여러 스레드가 동시에 접근해도 안전하다.

EntityManager

  • Entity의 CRUD 등 Entity와 관련된 모든 일을 처리한다.
  • EntityManager는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드간에 공유하면 안된다.

영속성 컨텍스트란?

Entity를 영구히 저장하는 환경이라는 뜻이다.

EntityManger.persist(member);

이 코드는 member를 DB에 바로 저장하는 것이 아니라, EntityManager를 사용해 member Entity를 영속성 컨텍스트에 저장하는 코드이다.

영속성 컨텍스트는 EntityManger를 생성할 때 하나만 만들어진다. EntityManager를 통해 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리할 수 있다.


엔티티의 생명주기

엔티티의 4가지 상태

  • 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 형태
  • 영속(managed): 영속성 컨텍스틍 관리되는 상태
  • 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed): 삭제된 상태

비영속(new/transient)

엔티티 객체가 생성된 순수 객체 상태로,
영속성 컨텍스트나 DB와는 전혀 관계가 없는 상태

영속(managed)

엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장하면, 영속성 컨텍스트가 엔티티를 관리하므로 영속 상태라고 한다.

EntityManger.persist(member)

위 코드를 수행하면 member 엔티티는 영속성 컨텍스트에 의해 관리되는 영속 상태가 된다.
그러나 위 코드가 수행된다고 데이터베이스에 저장되는 것은 아니다.

준영속(detached)

영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태이다.

EntityManager.detach(member); // member 엔티티를 준영속 상태로 만든다.
EntityManager.close(); // 영속성 컨텍스트를 닫는다.
EntityManager.clear(); // 영속성 컨텍스트를 초기화한다.

삭제(removed)

엔티티를 영속성 컨텍스트와 DB에서 삭제한다.

EntityManager.remove(member);

profile
slowly But Surely

0개의 댓글