twocowsong

EntityManagerFactory와 EntityManager 본문

IT/JPA

EntityManagerFactory와 EntityManager

WsCode 2022. 4. 30. 22:29

깃허브 정리 URL : https://github.com/sWineTake/jpa.git

 

GitHub - sWineTake/jpa: 자바 ORM 표준 JPA 프로그래밍 - 김영한

자바 ORM 표준 JPA 프로그래밍 - 김영한. Contribute to sWineTake/jpa development by creating an account on GitHub.

github.com

 

엔티티 매니저는 엔티티를 저장, 수정, 삭제, 조회등 엔티티관련된 모든일을 처리합니다.

개발자 입장에서는 엔티티 매니저는 엔티티를 저장하는 가상의 DB로 생각하면됩니다.

구현과 관련된 부분들은 하이버네이트를 기준으로 진행합니다.

 

엔티티 매니저 팩토리와 엔티티 매니저

DB를 하나만 사용하는 애플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성합니다.

// 엔티티 매니저 팩토리 생성
EntityManagerFactory emf =
      Persistence.createEntityManagerFactory("jpa-study");

createEntityManagerFactory를 호출하면 META-INF/persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory를 생성합니다.

 

이제부터는 필요할 때마다 엔티티 매니저 팩토리에서 엔티티 매니저를 생성하면됩니다.

// EntityManagerFactory에서 엔티티 매니저 생성 비용이 거의 안 듭니다.
EntityManager em = emf.createEntityManager();

EntityManagerFactory는 만드는 비용은 상당히 큽니다.

따라서 한 개만 만들어서 애플리케이션 전체에서 공유 하도록 설계가 되어있습니다.

 

반면에 EntityManagerFactory에서 엔티티 매니저를 생성하는 비용은 거의 들지 않습니다.

EntityManagerFactory는 여러 스레드가 동시에 접근해도 안전하므로 스레드간에 공유해도 되지만,

엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드간에 절대 공유하면 안됩니다.

 

위 그림에서는 EntityManagerFactory에서 다수의 엔티티 매니저를 생성했습니다.

 

EntityManager1은 DB 커넥션을 사용하지 않으므로 엔티티 매니저는 DB연결에 곡 필요한 시점까지 커넥션을 얻지 않습니다. 예를 들어 트랜잭션을 시작할 때 커넥션을 획득합니다.

 

EntityManager2는 커넥션을 사용중인데 보통 트랜잭션을 시작할 때 커넥션을 획득합니다.

 

하이버네이트를 포함한 JPA구현체들은 EntityManagerFactory를 생성할 때 커넥션 풀도 만드는데 이것은J2SE 환경에서 사용하는 방법입니다.

 

'IT > JPA' 카테고리의 다른 글

엔티티의 생명주기  (0) 2022.05.01
영속성 컨테스트  (0) 2022.05.01
JPQL  (0) 2022.04.29
JPA - 비즈니스 로직  (0) 2022.04.28
JPA - hibernate.dialect (트랜잭션)  (0) 2022.04.28