본문 바로가기

JPA/영속성 관리

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

Index

  • 사용방법과 주의사항
  • DB connection 획득
  • 정리

 JPA가 제공하는 기능은 크게 두가지가 있다.

1. 엔티티와 테이블을 매핑한다.

2. 설계 부분과 매핑한 엔티티를 실제 사용한다.

 

EntityManager 는 Entity의 C/R/U/D 등 Entity와 관련된 모든일을 처리한다. 개발자 입장에서는 EntityManager를 가상의 데이터베이스 생각하면 된다. 그리고 책에 나오는 구현관련 예제는 Hiberante를 기준으로 이야기 해주고있다. 다른 JPA 구현체도 크게 다르지는 않다고하니까 크게 신경쓰지 않아도 될 것 같다.

 

사용방법과 주의사항

데이터 베이스를 하나면 사용하는 애플리케이션은 일반적으로 EntityManager Factory를 하나만 생성한다.

 

1. EntityManagerFactory를 생성하는 코드

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

Persistence.createEntityManagerFactory("jpabook") 를 호출하면 META-INF/persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory를 생성한다.

 

2. EntityManager를 생성하는 코드

//엔티티 매니저 생성
EntityManager em = emf.createEntityManager();

너무 당연하지만 emf.createEntityManager()를 호출하면 EntityManager 를 생성한다.

 

3. 주의사항

- EntityManagerFactory는 만드는 비용이 상당히 크다. 따라서 한 개만 만들어서 애플리케이션 전체에서 공유하도록 설계되어 있다. 또한 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유해도 안전하다.

 

- EntityManager는 만드는 비용이 거의 들지 않는다. 필요에 따라서 생성하고 사용하면 된다. 하지만 주의할 점은 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안된다.

 

DB connection 획득

JPA 프로그래밍 그림 3.1 일반적인 웹 애플리케이션

그림을 보면 EntityManager1 과 EntityManager2가 보인다. 이중 EntityManager2는 connection을 사용하고 EntityManager1 은 사용하지 않는데, EntityManager는 데이터베이스 연결이 꼭 필요한 시점까지 connection을 얻지 않는다. connection을 얻는 시점은 보통 트랜잭션을 시작할 때 커넥션을 획득한다. 그리고 JPA는 EntityManagerFactory를 생성할 때 Connection pool 도 만드는데 이게 가능한 이유는 우리가 persistence.xml에 DB정보를 미리 적어놓고 

EntityManagerFactory는 persistence.xml를 참조해서 객체를 생성하기 때문에 가능하다.

 

 

정리

EntityManager는 스레드공부 금지

Connection은 보통 트랜잭션을 시작할 때 얻는다.

EntityManagerFactory가 생성될 때 Connection pool도 만든다.