sol 개발 블로그 로고
Published on

영속성 컨텍스트와 엔티티 생명주기

Authors
  • avatar
    Name
    Chan Sol OH
    Twitter

목차

영속성 컨텍스트 (Persistence Context)

영속성 컨텍스트(Persistence Context)는 애플리케이션과 데이터베이스 사이에서 엔티티와 레코드의 차이를 줄이는 기능과 객체를 캐싱하는 기능을 수행한다. 엔티티 객체가 영속성 컨텍스트에 들어오면 JPA 관리하에 엔티티 객체의 맵핑 정보를 데이터베이스에 반영하는 작업을 수행한다. 이렇게 엔티티 객체가 JPA 관리하에 놓이면 영속 객체(Persistence Object)라고 한다.

애플리케이션에는 엔티티 객체가 있고, 영속성 컨텍스트에는 영속 객체가, 그리고 DB에는 레코드가 저장되어있다.

영속성 컨텍스트는 세션 단위생명주기를 가진다. 애플리케이션이 DB와 연결되면(세션이 생성되면) 영속성 컨텍스트가 만들어지고, 연결을 끊으면(세션이 종료되면) 영속성 컨텍스트가 제거된다. 엔티티 매니저는 영속성 컨텍스트에 접근하기 위한 수단으로 사용된다.

엔티티 매니저

엔티티 매니저는 DB에 접근해서 레코드의 CRUD 작업을 수행한다. 즉, 레코드를 읽고 영속 객체를 업데이트하거나 영속 객체의 변화를 레코드에 적용한다. Spring Data JPA를 사용하면 Repository를 통해 DB에 접근한다.

따라서 엔티티 매니저의 역할은 엔티티 객체와 영속 객체 그리고 레코드의 싱크를 맞추는 것이다.

엔티티 매니저는 엔티티 매니저 팩토리가 생성한다. Spring boot에서는 자동 설정 기능이 있지만, 하이버네이트에서는 persistence.xml이라는 설정 파일을 구성하고 사용해야하는 객체이다. 엔티티 매니저 팩토리는 WAS 로드 시점에 하나만 생성하고 WAS를 종료할 때 닫는다. 또한 엔티티 매니저 팩토리를 닫을 때 Connection pooling에 대한 Resource가 릴리스된다.

엔티티의 생명 주기

  1. 비영속 : 영속성 컨텍스트에 추가되지 않은 엔티티 객체의 상태를 의미
  2. 영속 : 영속성 컨텍스트에 의해 엔티티 객체가 관리되는 상태
  3. 준영속 : 영속성 컨텍스트에 의해 관리되던 엔티티 객체가 컨텍스트와 분리된 상태
  4. 삭제 : 데이터베이스에 레코드삭제하기 위해 영속성 컨텍스트에 삭제 요청을 한 상태

준영속이란 엔티티 객체가 애플리케이션에 남아있지만, em.close()와 같이 영속성 컨텍스트를 닫거나 초기화를 할 경우 준영속 상태가 된다. 이는 삭제와 다른데 삭제는 app의 엔티티 객체, 컨텍스트의 영속 객체 그리고 DB의 레코드 모두 제거되지만, 준영속은 영속성 컨텍스트와 그 안에 영속 객체만 제거되는 것이 다르다. 결국 영속성 컨텍스트로 연결된 엔티티 객체와 레코드가 끊어진 상태라고 볼 수 있을 것 같다.