Spring Boot/JPA

[JPA] 엔티티 매니저 팩토리, 엔티티 매니저

공대생안씨 2023. 12. 13. 16:09

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

 

웹 어플리케이션에서 요청이 들어올 때 마다 엔티티 매니저 팩토리 (Entity Manager Factory) 에서 엔티티 매니저 (Entity Manager)를 생성한다. 이 엔티티 매니저는 데이터 베이스 커넥션을 얻는 것이라고 생각할 수 있다.

 

엔티티 매니저 팩토리

엔티티 매니저 팩토리는 어플리케이션 구동 시점에 딱 하나만 생성하면 된다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistence-unit의 이름);

 

전체 어플리케이션이 종료하면 엔티티 매니저 팩토리도 닫아줘야 한다.

emf.close();

 

엔티티 매니저

엔티티 매니저는 실제 DB에 저장하는 등 의 트랜잭션 단위로 생성해야 한다.

EntityManager em = emf.createEntityManager();

 

엔티티 매니저는 트랜잭션 단위로 동작하기 때문에 트랜잭션이 종료되는 시점 (커밋 / 롤백)에 닫아줘야 한다.

em.close();

 

트랜잭션

JPA에서 데이터를 변경하는 모든 작업은 꼭 트랜잭션 단위 내에서 작업해야 한다. 따라서 엔티티 매니저를 통해서 트랜잭션을 시작해야 한다.

// 엔티티 매니저로부터 트랜잭션을 가져와서 EntityTransaction 객체에 저장
EntityTransaction tx = em.getTransaction();	

// 트랜잭션 시작
tx.begin();

 

데이터를 변경한 후에는 트랜잭션을 커밋 혹은 롤백 해줘야 한다.

tx.commit();	// 트랜잭션 커밋

tx.rollback();	// 트랜잭션 롤백

 

 

종합

 

위의 코드들을 종합하여 엔티티 매니저 팩토리, 엔티티 매니저, 트랜잭션을 생성하고 닫는 정석적인 코드는 아래와 같다.

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;

public class Main {
    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {                   // 정상적일 때 커밋
            
            // ======== DB 변경 코드 ======== //
            
            tx.commit();
        } catch(Exception e){   // 문제가 생기면 롤백
            tx.rollback();
        } finally {             // 작업이 다 끝나면 엔티티 매니저 닫아줌
            em.close();
        }
        
        emf.close();
    }
}