DATABASE

[JPA] 영속성 관리(Entity Manager, Entity Factory, Persistence Context)

sagecode 2025. 2. 16. 00:27

Entity Manager와 Entity Factory

JPA는 크게 Entity와 테이블을 매필하는 설계 부분과 매핑한 Entity를 실제 사용하는 부분으로 나눌 수 있다.

// Entity Factory 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa");

 

Entity Manager는 Entity를 저장하고, 수정하고, 삭제하고, 조회하는 등 Entity와 관련된 모든 일을 처리하는 관리자이다.

// Entity Manager 생성
EntityManager em = emf.createEntityManager();

Entity Factory는 이름 그대로 Entity Manager을 만드는 공장이다. 공장을 만드는 비용은 상당히 크므로 애플리케이션 전체에서 하나만 만든다.

 

따라서, Entity Manager Factory는 여러 스레드가 동시에 접근해도 되지만 Entity Manager의 경우 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안된다.

 

영속성 컨텍스트(Persistence Context)

영속성 컨텍스트는 'Entity를 영구 저장하는 환경' 이다. Entity Manager를 통해서 Entity를 저장하거나 조회하면 Entity Manager는 영속성 컨텍스트에 Entity를 보관하고 관리한다. 영속성 컨텍스트에 저장되는것에 따라 Entity의 생명주기가 달라진다. 영속, 비영속, 준영속, 삭제.

  • 비영속

Entity 객체 생성한다. 지금은 순수한 객체 상태이며 아직 저장하지 않았다. 따라서 영속성 컨텍스트 또는 데이터베이스와 관련이 전혀 없다. 이것을 비영속 상태라고 한다.

  • 영속

Entity Manager를 통해서 Entity를 영속성 컨텍스트에 저장했다. 이렇게 영속성 컨텍스트가 관리하는 Entity를 영속 상태라고 한다. 

  • 준영속

영속성 컨텍스트가 관리하던 영속 상태의 Entity를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 된다. 특정 Entity를 em.detach()를 호출하여 준영속 상태로 만든다.

  • 삭제

Entity를 영속성 컨텍스트와 데이터베이스에서 삭제한다.

영속성 컨텍스트의 주요 특징

  • 영속성 컨텍스트와 식별자 값

영속성 컨텍스트는 Entity를 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다. 식별자 값이 없으면 예외가 발생한다.

  • 영속성 컨텍스트와 데이터베이스 저장

영속성 컨텍스트에 Entity를 저장하면 이 Entity는 언제 데이터베이스에 저장될까? JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 Entity를 데이터베이스에 반영하는데 이것을 Flush라고 한다.

  • 영속성 컨텍스트가 Entity를 관리했을 때 장점
    • 1차 캐시 : 영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이것을 1차캐시라고 한다. em.find()로 Entity를 호출했을 때, 식별자 값으로 1차 캐시에 동일한 Entity가 존재하면 DB에 직접 접근하지 않고 1차 캐시에서 값을 반환한다.
    • 동일성 보장 : em.find()를 통해 반복해서 동일한 Entity를 호출해도 영속성 컨텍스트는 1차 캐시에 있는 같은 Entity 인스턴스를 반환한다. 
    • 트랜잭션을 지원하는 쓰기 지연 : Entity Manager는 트랜잭션을 커밋하기 전까지 데이터베이스에 Entity를 저장하지 않고 내부 쿼리저장소에 INSERT SQL을 모아둔다. 그리고 트랜잭션 커밋할 때 모아둔 쿼리를 DB에 보내는데 이것을 쓰기지연이라 한다.
    • 변경 감지 : JPA로 Entity를 수정할 때는 단순히 Entity를 조회에서 데이터만 변경하면 된다. Entity의 변경사항을 데이터베이스에 자동으로 반영하는 기능을 변경 감지라고 한다.
    • 지연 로딩 : 실제 객체 대신 프록시 객체를 로딩해두고 해당 객체를 실제 사용할 때 영속성 컨텍스트를 통해 데이터를 불러오는 방법이다. 

'DATABASE' 카테고리의 다른 글

[SQL] JPA란 무엇인가?  (2) 2025.02.12
[SQL] YEAR()은 효율적인가?  (0) 2025.01.26