twocowsong

JPA - 엔티티 매니저 본문

IT/JPA

JPA - 엔티티 매니저

WsCode 2022. 4. 27. 21:19

깃허브 정리 URL : https://github.com/sWineTake/jpa.git

 

GitHub - sWineTake/jpa: 자바 ORM 표준 JPA 프로그래밍 - 김영한

자바 ORM 표준 JPA 프로그래밍 - 김영한. Contribute to sWineTake/jpa development by creating an account on GitHub.

github.com

 

Jpa (JpaMain.class)예제 코드는 아래와같습니다.

public static void main(String[] args) {
    // 엔티티 매니저 팩토리 생성
    EntityManagerFactory emf =
            Persistence.createEntityManagerFactory("jap-study");

    // 엔티티 매니저 생성
    EntityManager em = emf.createEntityManager();

    // 트랜잭션 획득
    EntityTransaction tx = em.getTransaction();

    try {
        // 트랜잭션시작
        tx.begin();
        // *** 비즈니스 로직 실행 ***

        // 트랜잭션 커밋
        tx.commit();
    }
    catch (Exception e) {
        tx.rollback(); // 롤백
    }
    finally {
        em.close();
    }
    // 엔티티 매니저 팩토리 종료
    emf.close();
}

코드는 크게 3부분으로 나뉘어 있습니다.

 

- 엔티티 매니저 설정 (본 글의 주제)

- 트랜잭션 관리

- 비즈니스 로직

 

엔티티 매니저 설정

엔티티 매니저의 생성 과정을 분석하면 아래와같습니다.

JPA를 시작하려면 우선 persistence.xml의 설정 정보를 사용해서 엔티티 매니저 팩토리를 생성해야합니다.

이때 Persistence클래스를 사용하는데 이 클래스는 엔티티 매니저 팩토리를 생성해서 JPA를 사용할 수 있게 준비합니다.

// 엔티티 매니저 팩토리 생성
EntityManagerFactory emf =
      Persistence.createEntityManagerFactory("jpa-study");

이렇게 하면 persistence.xml에서 이름이 jpa-study인 영속성 유닛 persistence-unit을 찾아서 엔티티 매니저 팩토리를 생성합니다.

 

이때 persistence.xml의 설정 정보를 읽어서 JPA를 동작시키기 위한 기반 객체를 만들고 JPA 구현체에 따라서는 DB 커넥션 풀도 생성하므로 엔티티 매니저 팩토리를 생성하는 비용은 아주 큽니다.

 

따라서 엔티티 매니저 팩토리는 애플리 케이션 전체에서 딱 한번만 생성, 공유해서 사용해야합니다.

 

// 엔티티 매니저 생성
EntityManager em = emf.createEntityManager();

엔티티 매니저 팩토리에서 엔티티 매니저를 생성합니다.

JPA의 기능 대부분은 이 엔티티 매니저가 제공합니다.

대표적으로 엔티티 매니저를 사용해서 DB 등록/수정/삭제/조회를 할 수 있습니다.

참고로 엔티티 매니저는 DB커넥션과 밀접한 관계가 있으므로 스레드간에 공유, 재사용을해서는 안됩니다.

 

em.close();
emf.close();

마지막으로 사용이 끝난 엔티티 매니저, 엔티티 매니저 팩토리는 다음처럼 꼭 종료해야합니다.

'IT > JPA' 카테고리의 다른 글

JPA - 비즈니스 로직  (0) 2022.04.28
JPA - hibernate.dialect (트랜잭션)  (0) 2022.04.28
JPA - hibernate.dialect (데이터베이스 방언)  (0) 2022.04.26
JPA persistence.xml  (0) 2022.04.26
JPA - @Entity, @Table, @Id, @Column  (0) 2022.04.25