EntityManagerFactory
영속적 컨텍스트가 데이터를 엑세스하는 영역에서 뿐아니라 프로그램이 실행되는 프레젠테이션 영역까지 사용하기 위해 커스텀 EntityManager로 static한 클래스를 만들어서 관리하도록 한다.
package studio.aroundhub.entity_manager_factory.factory;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class CEntityManagerFactory { // 커스텀
private static EntityManagerFactory entityManagerFactory;
/**
* EntityManagerFactory는 EntityManager를 생성하기 위한 팩토리 인터페이스로 persistence 단위별로 팩토리를 생성
*/
public static void initialization(){
entityManagerFactory = Persistence.createEntityManagerFactory("entity_manager_factory");
}
/**
* EntityManager 객체를 생성
* EntityManager 는 Persistence Context와 Entity를 관리
*
* @return EntityManager 객체
*/
public static EntityManager createEntityManger(){
return entityManagerFactory.createEntityManager();
}
/**
* EntityManagerFactory 객체 종료
*/
public static void close(){
entityManagerFactory.close();
}
}
클래스를 호출하면 동일한 객체에서 값을 받아와서 매번 팩토리를 만들어서 사용하지 않아도 된다.
기존 BasicJpaApplication 과 EntityManagerFactory와 비교
package studio.aroundhub.basic_jpa;
import java.time.LocalDateTime;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import studio.aroundhub.basic_jpa.entity.UserEntity;
public class BasicJpaApplication {
public static void main(String[] args) {
// EntityManagerFactory는 EntityManager를 생성하기 위한 팩토리 인터페이스로 persistence 단위별로 팩토리를 생성
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(
"basicjpa"); // persistence.xml 파일에 기입한 이름을 적어줘야 함
System.out.println("Check 1");
// EntityManager 객체를 생성
// EntityManager 는 Persistence Context와 Entity를 관리
EntityManager entityManager = entityManagerFactory.createEntityManager();
System.out.println("Check 2");
// EntityManager에서 트랜잭션을 가져와 관리하기 위한 객체 생성
EntityTransaction entityTransaction = entityManager.getTransaction();
System.out.println("Check 3");
try {
// 트랜잭션을 시작해야 DB를 조작할 수 있음
entityTransaction.begin();
System.out.println("Check 4");
// 저장하고자 하는 엔티티 객체를 생성
UserEntity userEntity = new UserEntity("thinkground.flature@gmail.com", "Flature",
LocalDateTime.now(), LocalDateTime.now());
System.out.println("Check 5");
// UserEntity 객체를 Persistence Context에 추가
entityManager.persist(userEntity);
System.out.println("Check 6");
// 실제 DB에 반영
entityTransaction.commit();
System.out.println("Check 7");
} catch (Exception e) {
e.printStackTrace();
// 예외가 발생했을 경우 트랜잭션 롤백 진행
entityTransaction.rollback();
} finally {
// 엔티티 매니저 종료. JDBC에서 Connection 종료하는 것과 동일한 기능으로 보면 됨
entityManager.close();
}
System.out.println("Check 8");
// 팩토리 종료. 커넥션 풀 자원을 반환
entityManagerFactory.close();
}
}
package studio.aroundhub.entity_manager_factory;
import java.time.LocalDateTime;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import studio.aroundhub.entity_manager_factory.entity.UserEntity;
import studio.aroundhub.entity_manager_factory.factory.CEntityManagerFactory;
public class EntityManagerFactoryApplication {
public static void main(String[] args) {
CEntityManagerFactory.initialization(); // persistence 설정 단순화
EntityManager entityManager = CEntityManagerFactory.createEntityManger();
// EntityManager에서 트랜잭션을 가져와 관리하기 위한 객체 생성
EntityTransaction entityTransaction = entityManager.getTransaction();
try {
// 트랜잭션을 시작해야 DB를 조작할 수 있음
entityTransaction.begin();
// 저장하고자 하는 엔티티 객체를 생성
UserEntity userEntity = new UserEntity("thinkground.flature@gmail.com", "Flature",
LocalDateTime.now(), LocalDateTime.now());
// UserEntity 객체를 Persistence Context에 추가
entityManager.persist(userEntity);
// 실제 DB에 반영
entityTransaction.commit();
} catch (Exception e) {
e.printStackTrace();
// 예외가 발생했을 경우 트랜잭션 롤백 진행
entityTransaction.rollback();
} finally {
// 엔티티 매니저 종료. JDBC에서 Connection 종료하는 것과 동일한 기능으로 보면 됨
entityManager.close();
}
// 팩토리 종료. 커넥션 풀 자원을 반환
CEntityManagerFactory.close();
}
}
*학습 자료 출처 : 어라운드 허브 스튜디오
'SPRING > JPA' 카테고리의 다른 글
[ JPA | 강의 따라 공부하기 ] 4.find()와 getReference()의 차이 (0) | 2024.02.01 |
---|---|
[ JPA | 강의 따라 공부하기 ] 3. CRUD 기능 사용법 소개 및 TypedQuery맛보기 (0) | 2024.01.31 |
[ JPA | 강의 따라 공부하기 ] 1.JPA 기본설정 (1) | 2024.01.29 |