EntityManager와 EntityManagerFactory

sujin·2023년 5월 18일
0


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

일반적인 데이터베이스를 사용하고 있는 애플리케이션에서는 하나의 엔티티 매니저 팩토리를 생성해 사용한다. 엔티티 매니저 팩토리는 이름 그대로 엔티티 매니저를 만드는 공장이다. 처음 만들어지는 시점에 DB 커넥션 풀을 생성해 둔 후, 고객의 요청이 올 때마다 엔티티 매니저를 생성한다. 엔티티 매니저는 DB연결이 필요한 시점(보통 트랜잭션 시작되는 경우)에 커넥션 풀에 있는 connection을 얻는다.


출처 : 김영한님강의자료


엔티티 매니저 팩토리가 엔티티 매니저를 사용하는 이유

엔티티 매니저 팩토리는 생성시점에 DB 커넥션 풀을 생성하기 때문에 공장을 만드는 비용이 매우 크다. 그러나 엔티티 매니저를 만드는 비용은 거의 들지 않으므로, 엔티티 매니저 팩토리는 필요에 따라 엔티티 매니저를 생성하여 사용한다.


엔티티 매니저 팩토리는 여러 쓰레드가 동시에 접근해도 안전하여 서로 다른 스레드 간 공유해도 문제가 없다. 하지만 엔티티 매니저는 여러 쓰레드가 동시 접근하면 동시성 문제가 발생하기에 쓰레드간 공유를 하면 안된다.


✨ 정리

엔티티 매니저 팩토리

EntityManagerFactory emf = Persistence.createEntityManagerFactory("tudiiii");
  • 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번 생성하고 공유해서 사용한다.
  • 엔티티 매니저 팩토리는 스레드 세이프(Thread Safe)하다.
  • Persistence.createEntityManagerFactory("tudiiii")를 호출하면 META-INF/persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory를 생성한다. → 엔티티 매니저 팩토리를 persistence.xml를 참조해서 객체를 생성한다.

엔티티 매니저

EntityManager em = emf.createEntityManager();
  • 엔티티 매니저는 엔티티를 DB 에 등록/수정/삭제/조회(CRUD) 하는 역할이며, 엔티티와 관련된 일을 처리하는 엔티티 관리자이다.
  • 엔티티 매니저는 엔티티 매니저 팩토리를 통해 생성되며 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용하면 안된다.
  • spring boot + spirng data를 사용하면 Application이 시작될 때 EntityManager를 자동으로 bean에 등록하고 우리가 알지 못하는 사이에 가져다 쓴다.

0개의 댓글