본문 바로가기

JPA/자바 ORM 표준 JPA 프로그래밍

[JPA] 3장. 영속성 관리(1): 엔티티 매니저 팩토리, 엔티티 매니저

김영한, 『 자바 ORM 표준 JPA 프로그래밍 』, 에이콘, 2015.

 

해당 포스팅은 위 책을 학습하기 위한 용도로 쓰여진 글입니다.

 


엔티티 매니저 팩토리, 엔티티 매니저란?

  • 엔티티 매니저 팩토리는 이름 그대로 엔티티 매니저를 만드는 공장이다.
    그러나 공장을 만드는 비용이 상당히 크기 때문에, 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다(공장에서 엔티티 매니저를 생성하는 비용은 거의 들지 않는다).  
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
  • 공장을 만드는 비용이 큰 이유는 다음과 같다.
  • META-INF/persistence.xml에서 이름이 jpabook인 영속성 유닛(persistence-unit)을 찾아서 엔티티 매니저 팩토리를 생성한다. 이때 persistence.xml의 설정 정보를 읽어서 JPA를 동작시키기 위한 기반 객체를 만들고, JPA 구현체에 따라서는 DB 커넥션 풀도 생성하므로 엔티티 매니저 팩토리를 생성하는 비용은 아주 크다.

 

  • 엔티티 매니저는 특정 작업을 위해 DB에 액세스하는 역할을 담당한다.  
    엔티티를 DB에 저장, 수정, 삭제, 조회(CRUD) 하는 역할이며, 엔티티와 관련된 모든 일을 처리하는 엔티티 관리자이다. 개발자 입장에서 엔티티 매니저는 엔티티를 저장하는 가상의 DB로 생각하면 된다.
  • 엔티티 매니저는 DB 커넥션과 밀접한 관계가 있으므로, 스레드간에 공유하거나 재사용하면 안 된다.

 

특징

[ 그림 1 ] 출처:   - 김영한, 『 자바 ORM 표준 JPA 프로그래밍 』, 에이콘, 2015, 91쪽.

 

  • 그림 1을 보면, 하나의 EntityManagerFactory가 다수의 엔티티 매니저를 생성한다.
  • EntityManager1은 아직 DB 커넥션을 사용하지 않는데, 엔티티 매니저는 DB 연결이 꼭 필요한 시점까지 커넥션을 얻지 않는다. 보통 트랜잭션을 시작할 때, EntityManager2와 같이 커넥션을 획득한다.
  • 엔티티 매니저 팩토리 여러 스레드가 동시에 접근해도 안전하므로, 서로 다른 스레드 간에 공유해도 되지만,
    엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드간 공유하면 절대 안 된다.

 

코드

  • 엔티티 매니저 팩토리를 생성하는 코드
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");

 

  • 엔티티 매니저 팩토리를 이용하여 엔티티 매니저를 생성하는 코드
EntityManager em = emf.createEntityManager();

Reference

  • 김영한, 『 자바 ORM 표준 JPA 프로그래밍 』, 에이콘, 2015, 89~91쪽.