본문 바로가기

JPA

JPA 영속 컨텍스트와 엔티티 상태

* 해당 게시글은 JPA의 공부를 위한 게시글로 JPA를 공부하며 이해했던 내용들을 정리하는 글입니다.

 

영속 컨텍스트(영속 컨테이너)

JPA가 제공하는 영속 컨텍스트는 persistence.xml 파일을 로딩하여 Entity Manager 객체를 생성할 때 자동으로 생성됩니다. 클라이언트는 직접적으로 영속 컨텍스트를 접근 할 수 없으며 Entity Manager가 제공하는 메소드(ex persiste)를 통해서만 접근할 수 있습니다. 

 

영속 컨텍스트가 관리하는 엔티티의 상태는 4가지로 존재 할 수 있습니다.  

 

상태 의미
생성(NEW) 엔티티가 생성한 상태이며 영속 컨텍스트에 등록되지 않은 상태
관리(MANAGED) 생성된 엔티티가 Entity Manager의 persist 메소드를 통해 영속 컨텍스트에 등록된 상태
분리(DETATCHED) 영속 컨텍스트에 등록된 엔티티가 영속 컨텍스트로부터 분리된 상태
삭제(REMOVED) 영속 컨텍스트에서 엔티티가 삭제된 상태

 

생성 상태

  • 엔티티 클래스가 생성된 상태이며 영속 컨텍스트에 등록되지 않은 상태이다.

 

Employee employee = new Employee();

 

관리 상태

  • Entity Manager의 persist 메소드에 의해 영속 컨텍스트의 엔티티 캐시에 등록된 상태
  • Entity Manager의 find 메소드에 의해 관리 상태로 전환 될 수 있다.

 

Employee employee = new Employee();
employee.setId(1L);

em.persist(employee);

 

 

* find 메소드 동작원리

1. find 메소드를 호출하면 우선 식별자 변수 값을 통해 엔티티 캐시의 등록된 엔티티를 검사한다.

2. 등록된 엔티티가 있을 경우 반환한다.

3. 등록된 엔티티가 없을경우 SELECT 구문을 생성하여 데이터베이스에 전송한다.

4. 데이터베이스에 등록되어 있다면 가져 온 후 엔티티를 생성하고 엔티티 캐시에 등록 후 반환한다.

5. 데이터베이스에 등록되지 않았다면 null을 반환한다.

 

 

분리 상태

  • 영속 컨텍스트의 엔티티 캐시에 등록되어 있다가 영속 컨텍스트 밖으로 분리된 상태
  • 분리된 상태이기 때문에 영속 컨텍스트가 관리하지 않음
  • Entity Manager의 detach, clear, close 등 메소드를 호출 했을 때 분리 상태로 전환된다.

 

Employee employee = new Employee();
employee.setId(1L);

em.persist(employee);

em.detach(employee);

 

삭제 상태

  • 영속 컨텍스트에 엔티티가 제거된 상태를 의미하며 트랜잭션이 종료되는 시점에 데이터베이스의 데이터가 삭제된다.

 

Employee employee = new Employee();
employee.setId(1L);

em.persist(employee);

em.remove(employee);

 

출처

  • JPA 퀵스타트 책 참고

'JPA' 카테고리의 다른 글

JPA 식별자 자동생성 방식  (0) 2020.12.11
JPA 엔티티 클래스 관련 애노테이션 알아보기  (0) 2020.12.10
JPA란?  (0) 2020.12.10