상세 컨텐츠

본문 제목

엔티티 매니저와 1차 캐시

백엔드 공부진행도/JPA

by myeongjaechoi 2024. 11. 27. 13:38

본문

개념을 모호하게 아는 것들이 많기 때문에, 확실하게 정리하고자 한다.

엔티티 매니저란?

  • 엔티티 매니저는 persist, merge, remove, close 메서드를 이용하여 엔티티의 상태를 변경할 수 있다.
  • 엔티티 매니저는 영속성 컨테스의 1차 캐시로부터 엔티티를 조회할 수 있다.
    • 1차 캐시 : 기본적으로 'Map' 구조로 되어 있으며, 키는 엔티티의 식별자(@Id 값), 값은 해당 엔티티 객체
    • 1차 캐시 존재O : 데이터베이스 조회X, 1차 캐시에 저장된 엔티티 반환
    • 1차 캐시 존재X : 데이터베이스에서 해당 엔티티 조화한 뒤, 영속성 컨텍스트(즉, 1차 캐시)에 저장하고 반환
    • 1차 캐시의 동일성 보장 : 동일한 트랜잭션 내에서 동일한 식별자를 가진 엔티티는 항상 같은 객체를 반환
    • 성능 최적화 : 동일한 데이터를 반복적으로 조회할 때 데이터베이스 접근을 줄여 성능을 향상
  • 쓰기 지연 저장소에 있는 쿼리들을 flush하여 DB와 동기화 시킬 수 있다.
    • JPA - 쓰기 지연이라는 기능을 통해, 데이터베이스에 즉시 쿼리를 실행하지 않고, 내부적으로 쓰기 지연 SQL 저장소에 SQL 명령 저장
    • flush() - 영속성 컨텍스트와 데이터베이스를 동기화하는 작업
      • 변경 감지 : 영속성 컨텍스트에 저장된 엔티티와 스냅샷(초기 상태)을 비교하여 변경된 엔티티를 찾는다.
      • SQL 생성 : 변경된 엔티티에 대해 적절한 SQL을 생성하고 쓰기 지연 SQL 저장소에 추가
      • DB 전송 : 쓰기 지연 SQL 저장소에 모인 쿼리들을 데이터베이스로 전송하여 동기화를 수행
      • 성능 최적화 : 여러 쿼리를 모아 한 번에 처리함으로써 데이터베이스와의 통신 비용을 줄인다.
  • JPQL이나 Native Query를 이용하여 직접 DB로부터 데이터를 불러올 수 있다.
    • JPQL(Java Persistence Query Language) 객체지향 쿼리로 JPA가 지원하는 다양한 쿼리 방법 중 하나
      • 엔티티 객체를 대상으로 쿼리
    • query DSL : 정적 타입을 이용하여 SQL, JPQL을 코드로 작성할 수 있도록 도와주는 오픈소스 빌더 API
      • JPQL 보완을 위해 나옴 -> 쿼리에 대한 내용을 함수 형태로 제공
      •  
Member member = new Member();

비영속 상태는 엔티티 객체가 새로 생성되었지만, 아직 영속성 컨텍스트와 연관되지 않은 상태(데이터베이스와 관련X, 메모리 상에만 존재)

em.persist(member)

영속 상태는 엔티티 객체가 영속성 컨텍스트에 관리되고 있는 상태. 엔티티의 변경 사항이 자동으로 데이터베이스에 반영

 

영속성 컨텍스트란?

  • 엔티티 객체를 관리하는 JPA의 핵심 메커니즘
  • 엔티티의 상태를 메모리에 저장하고 추적

 

'백엔드 공부진행도 > JPA' 카테고리의 다른 글

JPA N+1 문제  (0) 2024.12.02

관련글 더보기