자라선

[자바 ORM 표쥰 JPA 프로그래밍] 5일차 - 엔티티 매니저 프로세스 본문

Develop/JPA

[자바 ORM 표쥰 JPA 프로그래밍] 5일차 - 엔티티 매니저 프로세스

자라선 2021. 8. 7. 01:29

https://github.com/TaehyunGong/jpabook/blob/master/ch02-jpa-start1/src/main/java/jpabook/start/JpaMain.java

 

GitHub - TaehyunGong/jpabook

Contribute to TaehyunGong/jpabook development by creating an account on GitHub.

github.com

 

1. 엔티티 매니저 팩토리 생성

JPA를 실행하기 위해서는 가장 기초가 되는 작업으로 META-INF/persistence.xml 의 설정파일을 읽어들여 엔티티 매니저 팩토리를 생성한다.

엔티티 매니저 팩토리설정파일을 읽어 객체를 생성하거나 JPA 구현체에 따라서 DB 커넥션 풀도 생성하므로 비용이 크기 때문에 어플리케이션 전체에 한 번만 생성하고 공유해야한다.

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

Persistence static 인스턴스로 createEntityManagerFactory 메소드를 실행하는데

이때 jpabook 이라는 persistence-unit 를 찾게된다. 

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
    <persistence-unit name="jpabook"> 
        <properties>
        ....

 

META-INF/persistence.xml 설정 파일에 명시되어있는 persistence-unit 를 찾아 해당 설정을 읽고 객체를 생성한다.

 

2. 엔티티 매니저 생성

엔티티 매니저 팩토리 객체를 사용하여 엔티티 매니저를 생성해주게 되는데

엔티티 매니저는 항시 DB와 커넥션을 유지하고있기 때문에 절대 다른 스레드와 공유해서는 안되며 재사용 또한 하면 안된다.

한 트랙잭션에 무조건 하나의 엔티티 매니저를 사용해야한다.

 

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

이러한 엔티티 매니저 객체를 사용하여 CRUD를 할 수가 있다.

 

3. 트랜잭션 작업

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

        try {
            tx.begin(); //트랜잭션 시작
            logic(em);  //비즈니스 로직
            tx.commit();//트랜잭션 커밋
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback(); //트랜잭션 롤백
        } finally {
            em.close(); //엔티티 매니저 종료
        }

        emf.close(); //엔티티 매니저 팩토리 종료

JPA는 무조건 하나의 트랜잭션에 모두 처리를 해야한다.

엔티티 매니저로 트랜잭션을 생성하게 되고 tx.begin() 메소드로 트랜잭션 시작을 알리게 된다.

logic(em) 라는 비즈니스 로직을 실행하고 오류가 없다면 tx.commit() 으로 상태를 DB에 전달하고

트랜잭션을 종료 후 엔티티 매니저 또한 역할을 끝냈으므로 닫아준다.

 

위의 엔티티 매니저 팩토리를 닫는건 어플리케이션이 하나기 때문에

 

4. logic method 

    public static void logic(EntityManager em) {

        String id = "id1";
        Member member = new Member();
        member.setId(id);
        member.setUsername("지한");
        member.setAge(2);

        //등록
        em.persist(member);

        //수정
        member.setAge(20);

        //한 건 조회
        Member findMember = em.find(Member.class, id);
        System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());

        //목록 조회
        List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
        System.out.println("members.size=" + members.size());

        //삭제
        em.remove(member);

    }

이전 글에 작성했던 것과 비슷한 엔티티 매니저를 사용하여 CRUD를 실행하는 메소드이다.

Comments