[JPA] EntityManager, EntityManagerFactory

jinni·2022년 12월 3일
0
post-thumbnail

엔티티 매니저란?

엔티티(Entity)를 데이터 베이스에 CRUD하는 역할이며, 엔티티와 관련된 일을 수행하는 엔티티 관리자다.

엔티티 매니저 팩토리란?

엔티티 매니저 팩토리에서 필요할 때마다 여러 개의 엔티티 매니저를 생성해준다.

🧐 엔티티 매니저가 엔티티를 관리하는데, 왜 엔티티 매니저 팩토리에서 엔티티 매니저를 생성할까?

프로그램 내부에 thread라는 일꾼이 있다. 최근의 프로그램들은 성능을 위해 여러 스레드들이 일을 같이 하게 되어 있는데, 하나의 큰 일을 동시에 처리하려다 보면, 동시성 문제가 발생할 수 있다. 이런 일을 방지하기 위해 특정 리소스나 정보는 공유하지 못 하게 하는 등의 처리가 필요하다.

이를 위해 엔티티 매니저 팩토리를 생성하는 것이다. 엔티티 매니저 팩토리는 Thread-safe(여러 스레드에서 접근해도 안전)하다. 허나, 생성할 때, 많은 비용을 초래하므로 하나의 팩토리를 생성해서 공유하는 방식을 택한다. 비용이 거의 들지 않는 엔티티 매니저를 요청이 들어올 때마다 1개씩 생성해준다.

하지만, 엔티티 매니저는 여러 스레드가 동시에 접근하면, 문제가 발생한다. 그렇기 때문에 스레드 간에 공유할 수 없다.

//Entity 생성
Member member1 = new Member();
member.setId(1L);
member.setUsername("회원1");

// EntityManagerFactory
EntityMangerFactory emf = Persistence.createEntityManagerFactory("xml에 작성한 db name");

// EntityManger
EntityManager em = emf.createEntityManger();

// Entity 영속화
em.persist(member1);

// Entity 찾기
em.find(Member.class, 1L);

그림으로 쉽게 알아보자!!

요청이 1개 들어올 때마다, 엔티티 매니저 팩토리에서 요청 1개당 매니저 1개를 붙여준다. 해당 그림에서는 요청1요청2이 DB 연결이 필요하기 때문에 Connection Pool과 연결되어 있지만, DB 연결이 필요하지 않다면, 꼭 필요한 시점까지 connection을 얻지 않는다.

connection은 그럼 언제 얻어? 🤔

connection을 얻는 시점은 보통 트랜잭션을 시작할 때, connection을 획득한다.

그리고 JPAEntityManagerFactory를 생성할 때, Connection Pool도 생성하는데 이게 가능한 이유는 persistence.xml에 DB 정보를 미리 적어놓고 EntityManagerFactory는 해당 xml을 참조해서 객체를 생성하기 때문에 가능하다.

우리에겐 spring 이 있다.

spring은 JPA의 entityManager를 관리해준다. 그 말은 즉, 싱글톤 객체라는 것이다.

싱글톤 패턴이 적용되면, 동시성 문제가 발생할 수 있기 때문에 이 문제를 해결해줘야 한다.

뭐야, 동시성 해결 방법은?

spring은 생성자 주입 시, 실제 entityManger를 주입하는 것이 아니라, 가짜 entityManager를 주입해준다. 그래서 entityManager를 호출할 때, 실제 데이터 베이스와 관련된 실제 entityManger를 호출해준다.

profile
조금씩 천천히 꾸준하게

0개의 댓글