본문 바로가기

SPRING/JPA

[ JPA | 강의 따라 공부하기 ] 2.커스텀 EntityManagerFactory 만들기

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();

    }

}

 

 

*학습 자료 출처 : 어라운드 허브 스튜디오