[영상후기] [토크ON세미나] JPA 프로그래밍 기본기 다지기 6강 - JPA 내부구조 | T아카데미]

박철현·2023년 4월 11일
0

영상후기

목록 보기
88/160

movie

  • 영속성 컨텍스트 : 엔티티 타입과 식별자를 키로 사용하는 객체의 집합

  • 엔티티 매니저 : 커밋 시점에 영속성 컨텍스트에서 관리하고 있던 영속 객체의 변경 내역을 추적하여 데이터베이스에 반영

    • 엔티티 매니저 생성하면 영속성컨텍스트 있구나
  • 영속성 컨텍스트 : 엔티티를 영구 저장하는 환경(논리적 개념)

  • 엔티티 매니저는 영속성 컨텍스트다 일단 이해

  • 엔티티 생명주기

    • 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태
    • 영속(managed) : 영속성 컨텍스트에 저장된 상태
    • 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
    • 삭제(removed) : 삭제된 상태

  • 비영속 : 객체를 생성한 상태

  • 영속 : 객체 생성 -> 엔티티매니저 persist 집어넣기

  • 영속성 컨텍스트

    • 1차 캐시
    • 동일성 보장
    • 트랙잭션을 지원하는 쓰기 지연
    • 변경감지
    • 지연로딩
  • 엔티티 조회, 1차 캐시

    • 1차 캐시 조회 : DB에 바로 접근이 아닌 먼저 1차 캐시에서 조회
    • 없으면 DB에서 조회한 후 1차 캐시에 넣고 반환
    • 쓰레드 하나당 잠깐 생겼다 사라짐(트랜잭션 있을 동안만)
      • 공유하지 않음
  • 트랜잭션을 지원하는 쓰기 지연

    • 1차캐시에 넣고, 쓰기 지연에 SQL문 저장

    • commit되는 시점에 모아둔 쿼리를 DB에 보냄

      • flush : DB에 쿼리를 보내는 것
        ※ flush가 1차 캐시를 비우는 것은 아님!
  • 엔티티 수정 : 값만 바꾸고 커밋하면 update 쿼리 나감

    • 변경감지(Dirty Checking)
      • 1차 캐시 저장하는 시점에 스냅샷 저장
      • 비교해서 변경 사항을 DB로 보내버림

  • 플러시

    • 변경 감지
    • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
    • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
      (등록, 수정, 삭제 쿼리)
  • 영속성 컨텍스트를 플러시 하는 방법

    • em.flush() - 직접 호출
    • 트랜잭션 커밋 - 플러시 자동 호출
    • JPQL 쿼리 실행 - 플러시 자동 호출
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);

// 중간에 JPQL 실행 : flush를 먼저 보내고 JPQL 실행함
// MyBatis or JDBCTemplete 과 섞어 사용할 땐 flush를 해줘야 결과가 나옴
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
  • 플러시

    • 영속성 컨텍스트를 비우지 않음
    • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
    • 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨
  • 준영속 상태 : 영속 상태의 엔티티가 영속성 컨텍스트에서 분리

    • em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
    • em.clear() : 영속성 컨텍스트를 완전히 초기회
      • 1차 캐시 삭제
    • em.close() : 영속성 컨텍스트를 종료
  • 지연로딩 LAZY를 사용해서 프록시로 조회

    • 영속성컨텍스트에서 관리 되어야 조회할 수 있음
    • 지연로딩 객체를 영속성 컨텍스트에서 관리하지 않으면 예외
    • LazyInitializationException 발생
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글

관련 채용 정보