JPA: 영속성 컨텍스트 정리

Hwalyo·2024년 3월 29일
0
post-thumbnail
post-custom-banner

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

  • 엔티티 매니저 팩토리가 요청마다 Entity Manager를 생성한다.
  • EntityManager는 DB Connection을 사용해서 CRUD를 처리한다.
	EntityManagerFactory entityManagerFactory = new EntityManagerFactory();
	EntityManager em = entityManagerFactory.createManager();
	EntityTransaction tx = em.getTransation();
	tx.begin();
	// em 관련 처리
	...
	tx.commit() or tx.rollback();
	em.close();

영속성 컨텍스트

1. 엔티티를 영구 저장하는 환경

EntityManager.persist(entity); 영속성 컨텍스트에 저장하는 것

  • 엔티티 매니저가 생성되면 영속성 컨텍스트가 생성된다.
  1. 엔티티의 생명 주기
    • 비영속(new/transient)
      	```java
      	//new로 생성하여 아직 영속되지 않은 상태를 말함.
      	//persist() 이전
      	EntityObject entityObj = new EntityObj();
      	entityObj.set("field");
      
      	```
    • 영속(managed)
      	```java
      	///persist()를 사용 했을 경우
      	entityManager.persist(entityObj); // 컨텍스트에 영속된 상태.
      	//merge() 준영속 상태를 다시 영속으로 바꿨을 때 다시 영속으로 바뀐다.
      
      	```
    • 준영속(detached)
      	```java
      	entityManager.detach(entityObj); // 영속성 컨텍스트에서 특정 엔티티를 지운다.
      	entityManager.clear(entityObj); // 영속성 컨텍스트의 모든 캐싱된 엔티티를 초기화 한다.
      	entityManager.close(); //영속성 컨텍스트를 종료한다.
      	```
    • 삭제(removed)
      	```java
      	entityManager.removed(entityObj) // 객체를 삭제한다. 딜리트 쿼리 요청.
      	```
  2. 영속성 컨텍스트의 이점
  • 같은 트랜잭션 내에 1차 캐시 기능을 가지고 있다.
    		```java
    		//트랜잭션 단위는 일반적으로 entityManager가 닫힐 때 까지다.
    		// 한번 가져오면 캐싱이 되어 다시 불러 오더라도 쿼리문이 아닌 캐시에서 가져온다.
    		EntityObj obj1 = entityManager.find(EntityObj.class, condition);
    		EntityObj obj2 = entityManager.find(EntityObj.class, condition);
    		obj1.equals(obj2) == true
    		```
  • INSERT 및 UPDATE의 쓰기 지연 기능을 제공한다.
    		```java
    		EntityObj obj1 = new EintityObj();
    		EntityObj obj2 = new EintityObj();
    		obj1.setId(1L);
    		obj2.setId(1L);
    		entityManager.persist(obj1); // 영속성 컨텍스트 쓰기 지연 저장소에 저장
    		entityManager.persist(obj2); // 쓰기 지연 저장소에 저장
    		entityTransaction.commit(); // fulsh가 동작하고 commit
    		```
  • 엔티티 수정 변경 감지
    		```java
    		EntityObj obj = entityManager.find(EntityObj.class, condition);
    		obj.setfield("updated"); // 영속성 컨텍스트 캐시에 바꾼 값으로 엔티티가 저장.
    		entityTransation.commit(); // flush가 작동하면서 스냅샷을 비교하여 바뀐 엔티티에 대해 update 쿼리 생성
    	
    			```
  1. Flush
    • 언제 사용할까?
      1. entityTransation을 커밋하면 동작한다.
      2. JQPL문을 실행하면 동작한다.
      3. entityManager.flush()로 강제 호출한다.
    • 특징 및 사용
      1. 변경감지
      2. 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록한다.
      3. 쓰기 지연 쿼리를 데이터 베이스에 전송한다
      4. 실제 커밋 되진 않고 DB에 쿼리문이 적용된다.
      5. 테스트에서 이점이 있다. DB에 데이터를 Insert, update ,delete 이후 rollback으로 데이터 복구가 가능하다.
      6. 데이터를 보내더라도 캐싱된 엔티티는 남아있다. 만약 컨텍스트의 초기화가 필요하다면 클리어 작업을 해야한다.
  • 이미지 저작권: 인프런 김영한님 강의에 있습니다!!.
profile
꾸준하게글을작성해보자
post-custom-banner

0개의 댓글