Spring&IntelliJ

JPA (실습을 통해 익숙해 지는 JPA)EntityManager

NandaNanda 2024. 1. 1. 21:15

출처: https://www.youtube.com/watch?v=dxnTN-fKbGA&list=PLOSNUO27qFbvzGd3yWbHISxHctPRKkctO&index=3

요약: EntityManager란? 영속성을 위해 Entity를 관리하는 객체.

 

즉 JPA를 위한 어노테이션이 존재하고 그 어노테이션들 중 특정 어노테이션이 붙은 클래스는 DB에 테이블 형태로 저장되는 클래스임(예를들어 @Entity, @Table).

위 그림에서 보는 것처럼 JPA는 JDBC를 기반으로함. 실제 DB에데이터를 쓰고 읽는 것은 JDBC를 통해 행해지는 것임.

EntityManager란? 영속성을 위해 Entity를 관리하는 객체.

public class Join {
    public void join(String name, int age) {
        // 아직까지는 해당 엔티티를 엔티티 매니저가 관리하지 않는다.
        Member member = new Member();
        member.setName(name);
        member.setAge(age);
        
        Member member2 = new Member();
        member2.setName(name);
        member2.setAge(age);
        
        // 엔티티 매니저가 있다고 가정.
        // 추후에 엔티티 매니저 팩토리와 함께 엔티티 매니저를 어떻게 생성하는지 설명.
        EntityManager em;
        
        //db에 데이터를 읽고 쓰는 단위는 트랜잭션. 보는 것과 같이 Entity메니저는 우선 트랜잭션을 가져와야 한다(getTransaction()). 그리고 그 트랜잭션안에서 데이터를 읽고
		//쓰고 변형할 작업들이 하나의 트랜잭션을 구성하게 되는 것이다. 아래와 같이 EntityManager가 persist()호출하면 그안의 객체를 대상으로 대응되는 테이블에 데이터를 넣는다던지 하는 것. 물론 그 중간 과정에서
		//Hibernate가 자바코드를 SQL쿼리로 변환해줌.

        EntityTransaction tx = em.getTransaction();
        
        try {
            // 엔티티 매니저에서 수행하는 모든 로직은 트랜잭선 안에서 수행돼야 한다.
            tx.begin();
            
            // 쿼리는 전송되지 않는다.
           	// 이렇게 하면 해당 엔티티 매니저의 영속성 컨텍스트에 member 객체가 저장된다.  
            // 이제 member 엔티티는 엔티티 매니저의 관리 대상이 되고, 영속성을 가졌다고 말할 수 있다.
            em.persist(member);
            em.persist(member2);
            
            //commit하면 DB에 반영됨 
            tx.commit();
        } catch(Exception e) {
            // 어떤 이유에서 오류가 났다면 트랜잭션을 롤백 시켜줘야한다.
            tx.rollback();
        } finally {
            // 엔티티 매니저를 종료시켜줘야 한다.  
            // 아마 더 이상 사용하지 않는 자원이므로 더 이상 사용하지 않는 자원이라고 표시하는 것 같다.
            // 그럼 아마 GC가 해당 엔티티 매니저 자원을 수거해가서 메모리에 반환하지 않을까??
            // 성능 상 문제가 있어서 이렇게 종료시켜줘야 하는 건지 모르겠다. 
            em.close();
        }
    }
}