엔티티 매니저와 엔티티 매니저 팩토리

- 엔티티 매니저 팩토리가 요청마다 Entity Manager를 생성합니다.
- Spring에서는 spring이 EntityManager를 관리합니다.
- EntityManager는 DB Connection을 사용해서 CRUD를 처리합니다.
EntityManagerFactory entityManagerFactory = new EntityManagerFactory();
EntityManager em = entityManagerFactory.createManager();
EntityTransaction tx = em.getTransation();
tx.begin(); // 트랜잭션 관련 처리 ...
tx.commit() or tx.rollback();
em.close();영속성 컨텍스트
1. 엔티티를 영구 저장하는 환경
EntityManager.persist(entity); 영속성 컨텍스트에 저장하는 것
- 엔티티 매니저가 생성되면 영속성 컨텍스트가 생성됩니다.
- 엔티티의 생명 주기
- 비영속(new/transient)
//new로 생성하여 아직 영속되지 않은 상태를 말함.
//persist() 이전
EntityObject entityObj = new EntityObj();
entityObj.set("field");- 영속(managed)
///persist()를 사용 했을 경우
entityManager.persist(entityObj); // 컨텍스트에 영속된 상태.
//merge() 준영속 상태를 다시 영속으로 바꿨을 때 다시 영속으로 바뀐다.- 준영속(detached)
entityManager.detach(entityObj); // 영속성 컨텍스트에서 특정 엔티티를 지운다.
entityManager.clear(entityObj); // 영속성 컨텍스트의 모든 캐싱된 엔티티를 초기화 한다.
entityManager.close(); //영속성 컨텍스트를 종료한다.- 삭제(removed)
entityManager.removed(entityObj) // 객체를 삭제한다. 딜리트 쿼리 요청.2. 영속성 컨텍스트의 이점
- 같은 트랜잭션 내에
1차 캐시 기능을 가지고 있습니다.
//트랜잭션 단위는 일반적으로 entityManager가 닫힐 때 까지다.
// 한번 가져오면 캐싱이 되어 다시 불러 오더라도 쿼리문이 아닌 캐시에서 가져온다.
EntityObj obj1 = entityManager.find(EntityObj.class, condition);
EntityObj obj2 = entityManager.find(EntityObj.class, condition);
obj1.equals(obj2) == true- INSERT 및 UPDATE의
쓰기 지연기능을 제공한다.
EntityObj obj1 = new EintityObj();
EntityObj obj2 = new EintityObj();
obj1.setId(1L);
obj2.setId(1L);
entityManager.persist(obj1); // 영속성 컨텍스트 쓰기 지연 저장소에 저장
entityManager.persist(obj2); // 쓰기 지연 저장소에 저장
entityTransaction.commit(); // fulsh가 동작하고 commit- 엔티티 수정
변경 감지
EntityObj obj = entityManager.find(EntityObj.class, condition);
obj.setfield("updated"); // 영속성 컨텍스트 캐시에 바꾼 값으로 엔티티가 저장.
entityTransation.commit(); // flush가 작동하면서 스냅샷을 비교하여 바뀐 엔티티에 대해 update 쿼리 생성3. Flush
- 언제 사용할까?
1. entityTransation을 커밋하면 동작한다.
2. JQPL문을 실행하면 동작한다.
3. entityManager.flush()로 강제 호출한다.
- 특징 및 사용
1. 변경감지
2. 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록한다.
3. 쓰기 지연 쿼리를 데이터 베이스에 전송한다
4. 실제 커밋 되진 않고 DB에 쿼리문이 적용된다.
5. **테스트에서 이점**이 있다. DB에 데이터를 Insert, update ,delete 이후 rollback으로 데이터 복구가 가능하다.
6. 데이터를 보내더라도 캐싱된 엔티티는 남아있다. 만약 컨텍스트의 초기화가 필요하다면 클리어 작업을 해야한다.- 이미지 저작권: 인프런 김영한님 강의에 있습니다!!.
'Framework & Library > SpringDataAccess' 카테고리의 다른 글
| JPA ) JPQL DTO Mapping 및 interface Mapping 방법 (0) | 2024.05.21 |
|---|---|
| QueryDSL ) Spring에서 queryDsl 사용해보기. (0) | 2024.05.20 |
| @DataJpaTest를 사용한 단위 테스트에서 @Autowired Repository의 빈이 등록되지 않는 문제 해결하기. (0) | 2024.05.10 |
