[JPA] 영속성 컨텍스트 (2)

형이·2023년 10월 12일

Spring

목록 보기
17/21
post-thumbnail

📝 JPA

🖥️ 1. 영속성 컨텍스트

1-1. 엔티티 등록 - 트랜잭션을 지원하는 쓰기 지연

          EntityManager em = emf.createEntityManager();
          EntityTransaction ts = em.getTransaction();
          ts.begin();	// 트랜잭션 시작

          em.persist(memberA);
          em.persist(memberB);
          // 여기까지 InsertSQL을 데이터베이스에 보내지 않는다.

          // 커밋하는 순간 데이터베이스에 InsertSQL을 보낸다.
          ts.commit();	// 트랜잭션 커밋(종료)

1-2. 엔티티 수정 - 변경 감지 (Dirty Checking)

          EntityManager em = emf.createEntityManager();
          EntityTransaction ts = em.getTransaction();
          ts.begin();	// 트랜잭션 시작

          // 영속 엔티티 조회
          Member memberA = em.find(Member.class, "memberA");

          // 영속 엔티티 데이터 수정
          memberA.setUsername("admin");
          memberA.setAge(20);

          // em.update(memberA); 이런 코드가 있어야 하지 않을까? (X)

          ts.commit();	// 트랜잭션 커밋(종료)
  • flush()가 호출되는 시점에 Entity와 스냅샷을 전부 비교 후 (최적화 알고리즘으로 진행) 변경이 된 것을 감지 (Dirty Checking) 한 후에 update 쿼리를 작성 후, update 쿼리를 날린다.

1-3. 엔티티 삭제

          // 삭제 대상 엔티티 조회
          Member memberA = em.find(Member.class, "memberA");

          em.remove(memberA);

🖥️ 2. 플러시

2-1. 플러시 발생

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
  • 변경 감지
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송 (등록, 수정, 삭제 쿼리)

2-2. 영속성 컨텍스트를 플러시하는 방법

  • 트랜잭션 커밋 : 플러시 자동 호출
  • em.flush() : 직접 호출
  • jpql 쿼리 실행 : 플러시 자동 호출

2-3. 플러시 주요사항

  • 영속성 컨텍스트를 비우지 않음
  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
  • 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 된다.
  • JPA는 동시성, 데이터를 맞추거나 등을 모두 트랜잭션에 위임한다.

2-4. 준영속 상태

  • 영속상태 -> 준영속 상태
  • 준영속 : 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태 (detached)
  • 영속성 컨텍스트가 제공하는 기능을 사용 못함

2-5. 준영속 상태로 만드는 방법

  • em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
  • em.clear() : 영속성 컨텍스트를 완전히 초기화
  • em.close() : 영속성 컨텍스트를 종료

** 준영속 상태로 만드는 방법은 알아만 둘 것

0개의 댓글