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();
}
}
}