엔티티 매니저 팩토리와 엔티티 매니저
웹 어플리케이션에서 요청이 들어올 때 마다 엔티티 매니저 팩토리 (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();
}
}
'Spring Boot > JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑 - 상속관계 매핑, @MappedSuperclass (1) | 2023.12.18 |
---|---|
[JPA] 연관관계 매핑 - 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) (0) | 2023.12.18 |
[JPA] 연관관계 매핑 - 단방향 매핑, 양방향 매핑 (1) | 2023.12.18 |
[JPA] 엔티티 매핑 관련 annotation 정리 (0) | 2023.12.14 |
[JPA] 영속성 컨텍스트, 엔티티 매니저 CRUD (0) | 2023.12.13 |