Entity Manger

Entity를 관리하는 역할을 수행하는 클래스

 

 

Entity

Jpa가 관리하는 객체

 

 

EntityMangaerFactory (emf)

고객의 요청이 올때마다 엔티티 매니저를 하나씩 만들어 줍니다.

이 엔티티 매니저는 내부적으로 DB Connection 을 통해 DB를 사용하게 됩니다.

 

그래서 JPA는 EntityManagerFactory가 필요하며,

애플리케이션 로딩시점에 DB당 딱 하나만 생성되야 합니다.

 

그리고 WAS가 종료되는 시점에 emf 를 close 해주면 됩니다.

 

 

EntityManager

실제 트랜잭션 단위를 수행할 때 마다 생성합니다.

즉, 고객의 요청이 올 때마다 사용했다가 닫습니다.

 

 * 트랜잭션 수행 후에는 반드시 엔티티 매니저를 닫아줘야합니다. 그래야 내부적으로 DB Connection을 반환합니다.

 

 

EntityTransaction

데이터를 변경하는 모든 작업은 반드시 트랜잭션 안에서 이뤄져야 합니다.

단순 조회의 경우는 상관 없습니다.

 

 

Persistenct Context (영속성 컨텍스트)

엔티티 매니저 내부에서 엔티티를 관리해주는 역할을 합니다.

이는 엔티티를 영구히 저장하는 환경을 가진다는 특징이 있습니다.

엔티티를 영속성 컨텍스트에 저장하는 과정에 대한 코드를 먼저 보겠습니다.

EntityManagerFactory emf = Persistenct.createEntityMangerFactory("persistenceUnit name")
EntityManager em = emf.createEntityManger();
EntityTransaction tx = em.getTransaction();

tx.begin();

Member member = new Member();
memer.setName("aaa");

em.persist(member);

tx.commit();

[ 각 소스 코드의 역할 ]

1) EntityTransaction : 커밋한 순간에만 Insert 쿼리를 날릴 수 있게 쓰기 지연 기능을 도와준다.

2) persist : 영속성 컨텍스트에 해당 엔티티를 저장한다. ( 영속화 )

3) commit : Insert 쿼리가 날라간다.

 

[ 영속 상태가 되는 경우 ]

1) persist

2) find

find 해서 DB에서 가져왔는데 그게 영속성 컨텍스트에 없는 경우 1차 캐시에 올리게 됩니다.

1차 캐시에 올린다는 의미는 영속 상태가 된다는 의미입니다.

 

 

영속성 컨텍스트의 장점 - 1차 캐시 ( 쓰기 지연 SQL 저장소 )

1차 캐시란,

[ 처음 들어온 데이터 ] : 영속성 컨텍스트에 데이터 없음 -> DB 접근해서 데이터 조회

[ 두번째 들어온 데이터 ] : 영속성 컨텍스트에 데이터가 있으므로 바로 불러온다 ( DB조회 안함 )

 

이렇게 빠르게 조회할 수 있다는 장점이 있습니다.

이 1차 캐시를 보통 [ 쓰기 지연 SQL 저장소 ] 라고 부릅니다.

그렇다면 쓰기 지연 SQL 저장소와 현재 로컬에서의 엔티티가 다르다면 어떻게 적용 할 수 있을까요?

 

 

영속성 컨텍스트의 장점 - 동일성 보장

동일한 DB를 조회한 객체의 경우 동일한 객체임을 보장합니다.

그래서 (==) 로 비교시 true 가 됨을 알 수 있습니다.

Member a = em.find(Member.class,"sun");
Member b = em.find(Member.class,"moon");

Assertions.assertThat(a).isEqualsTo(b);

 

 

영속성 컨텍스트 장점 - Dirty Checking

데이터 수정시 update() -> persist() 로 업데이트를 해야한다고 생각할 수 있지만

그럴 필요는 없습니다.

 

데이터가 변경되더라도 commit하면 알아서 DB에 반영됩니다.

 

 

플러시

영속성 컨텍스트의 변경사항과 DB의 내용을 맞추는 작업

플러시가 발생하면 아래의 동작과정이 발생합니다.

 

  1. 변경 감지
  2. 수정된 엔티티 쓰기 지연 SQL에 등록
  3. 쓰기 지연 SQL 저장소 쿼리를 DB에 전송 ( INSERT / SELECT / DELETE )

단, 플러시가 발생했다고 트랜잭션에 커밋이 되는건 아닙니다.

플러시 시점에는 해당 쿼리를 DB에 동기화 시키고, 커밋시에 DB에 전달하게 됩니다.

 

[ 플러시 방법 ] 

1) em.flush() : 직접 플러시

2) Transaction commit : 자동 플러시

3) JPQL Query execute : 자동 플러시

'JPA(MySQL,H2Database)' 카테고리의 다른 글

임베디드 값 타입  (0) 2022.08.08
SQL 내장함수  (0) 2022.08.05
JPQL 와 JPQL의 테스트 코드 작성  (0) 2022.07.29
연관 관계 매핑  (0) 2022.07.15
exception just for purpose of providing stack trace  (0) 2022.07.13

+ Recent posts