본문 바로가기
JPA

[JPA] JPA 영속성 및 상태

by 신입같은 3년차 2020. 12. 20.
728x90

이번 공부한 내용 정리에는 JPA를 통해 EntityManager를 사용하여 데이터를 CRUD하는 작업에 대해 알아봤는데 내부적으로 EntityManager가 어떻게 돌아가는지 확인해보겠습니다


:) EntityManagerFactory와 EntityManager

EntitymanagerFactory는 데이터베이스를 하나만 사용하는 Application에서는 하나만 생성된다.

EntityManagerFactory를 생성하는 방법은 다음과 같았다.

// name - persistence.xml의 persistence-unit name을 의미함
EntityManagerFactory emf = Persistenct.createEntityManagerFactory(name);

EntityManagerFactory는 클래스명 그대로 EntityManager를 만드는 공장인데 해당 객체를 만드는 비용은 생각보다 상당히 크다. 따라서 한개만 만들어서 Application의 전체에서 공유하도록 설계되있다고 합니다. 또한 EntityManagerFactory는 여러 스레드가 동시에 접근해도 안전하고, 다른 스레드간에 공유해도 괜찮다.

그 반면에 EntityManager를** 생성하는 비용은 거의 들지 않는다, EntityManager는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드간에 **절.대 공유하면 안된다.

EntityManagerFactory를 통해 EntityManager를 만들었다고 해서 커넥션을 사용하지는 않는다. EntityManager는 꼭 필요한 시점까지 커넥션을 얻지 않다가 트랜잭션을 시작할때 커넥션을 획득한다.



:) 영속성 컨텍스트 ( Persistence Context )


JPA에서 가장 중요한 단어가 영속성 컨텍스트 입니다.

일반적으로 앞에있던 포스팅에서 find()와 , persist()를 할경우 EntityManager는 영속성 컨텍스트에 Entity를 보관한다

  • 영속성 컨텍스트 개념은 논리적인 개념에 가깝고 눈에보이지 않는다.
  • 영속성 컨텍스트는 EntityManager를 생성할 때 하나 만들어진다.
  • EntityManager를 통해 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리 가능



:) 엔티티의 생명 주기 ( Entity LifeCycle )


Entity에는 4가지 상태가 존재합니다.

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


영속(managed)상태

영속 상태란 EntityManager를 통해 영속성 컨텍스트에 저장되어 영속성 컨텍스트가 관리하는 엔티티를 영속 상태라 한다.
결국은 영속성 컨텍스트에 의해 관리되는 상태를 영속 상태라고 한다 .

entityManager.persist(entity);

비영속(new/transient)상태

비영속 상태란 위에 나오는 영속 상태를 반대로 생각하면 됩니다.
엔티티 객체를 생성하여도 , 영속성 컨텍스트에 등록하지 않았다면 이 상태를 비영속 상태라고 한다.


준영속(detached)상태

준영속이란 영속성 컨텍스트에 의해 엔티티가 관리되다가 영속성 컨텍스트가 관리하지 않겠다고 하였을때 준영속 상태가 된다.

일반적으로 영속 상태의 엔티티를 준영속 상태의 엔티티로 만들기 위해서는 EntityManager가 가지고있는 dettach()메서드를 통해 준영속 상태를 만들수 있다 또한 , clear(), close()를 통해 영속성 컨텍스트를 닫거나 , 초기화 해도 준영속 상태가 된다

em.detach(entity);


삭제 상태

삭제는 말그대로 엔티티를 영속성 컨텍스트와 , 데이터베이서에서 삭제한다

em.remove(entity);



728x90
반응형

'JPA' 카테고리의 다른 글

[JPA] 플러시 ( flush )  (0) 2020.12.22
[JPA] 영속성 컨텍스트의 특징 및 기본 구조  (0) 2020.12.20
[JPA] JPA 실습 구성하기 - 2  (0) 2020.12.16
[JPA] JPA 실습 구성하기 - 1  (0) 2020.12.16
[JPA] JPA란??  (0) 2020.12.16

댓글