엔티티와, 엔티티 매니저, 영속성 컨텍스트(Entity, Persistence context)

Seomoon·2023년 4월 19일
0

엔티티(Entity)

엔티티는 영속성을 가진 객체로, DB 테이블에 저장할 내용들을 의미합니다.

즉, 영속성 컨텍스트에 속한 객체를 의미합니다. 이러한 엔티티는 작업이 수행되면서

작업에 따라 JPA가 쿼리를 자동으로 생성해 주어 DB에 영향을 미치는 쿼리들(CRUD)

을 실행하게 됩니다. **@Entity**어노테이션을 사용함으로써 선언할 수 있습니다.

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

  • 엔티티 매니저(Entity Manager) : 엔티티의 CRUD 작업 등에 대한 엔티티에 관련된 모든 일들을 처리하는 것을 말하며, 영속성 컨텍스트를 통해 데이터의 변화를 감지하고, 필요한 쿼리들이 자동으로 수행될 수 있도록 도움을 준다.

  • 엔티티 매니저 팩토리(Entity Maneber Factory) : 데이터베이스를 하나만 사용하는 애플리케이션 이라면 엔티티 매니저가 하나만 필요하겠지만, 애플리케이션에서 여러 개의 데이터베이스를 사용하게 된다면 DB에 접근하는 트랜잭션이 생길 때 마다 엔티티 매니저 팩토리를 통해 엔티티 매니저를 만들어서 영속성 컨텍스트에 접근하고, 애플리케이션 전체에 공유하도록 설계된다.

    • 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하기 때문에 서로 다른 스레드 간에 공유가 가능하지만, 엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생할 수 있기 때문에 스레드 간에 공유해서는 안된다.

영속성 컨텍스트(Persistence context)

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

엔티티 매니저로 엔티티를 저장하거나 조회하게 되면, 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리하게 된다.

엔티티의 생명주기

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

영속성 컨텍스트의 특징/이점

1차 Cache

  • DB를 변경하는 메서드가 실행되었을 경우, 바로 DB를 업데이트 하는 것이 아니라, 영속성 컨텍스트 내부에 있는 캐시를 거쳐서 DB가 업데이트 되게 된다.
  • 1차 캐시에는 영속 상태의 엔티티들을 저장하며 , `Map<id,entity>` 형태로 만들어지게 된다.
  • 즉, 하나의 트랜잭션에서 id 값으로 조회하게 되는 데이터들은 1차 cache에 저장되어 관리되기 때문에 JPA의 조회 성능이 올라간다.

변경 감지(Dirty Checking)

  • 엔티티의 수정이 일어나도 개발자는 이 내용을 영속성 컨텍스트에 따로 알려주지 않아도 영속성 컨텍스트가 알아서 변경 사항을 체크하게 되는데, 이를 더티체킹(Dirty Checking) 이라고 한다.
  • 1차 캐시에 엔티티를 저장할 때, 스냅샷 필드도 따로 저장하여, commit 이나 flush를 할 때 해당 엔티티와 스냅샷을 비교하여 변경 사항이 있다면 알아서 UPDATE SQL 을 만들어 DB에 전송한다.
                           **스냅샷 → 더티체킹 → 트랜잭션 수행(커밋)**

플러시(Flush)

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 의미한다.
  • 1차 캐시를 지우지 않고 DB에 쿼리를 보냄으로써 DB와의 싱크를 맞추는(동기화) 역할을 한다.
  • flush()를 하거나 트랜잭션의 commit을 수행하게 될 경우, 영속성 컨텍스트 안에 있는 쿼리 저장소에 쌓여 있던 INSERT, UPDATE, DELETE 등의 SQL 들이 DB에 날라가게 된다.
  • flush()를 실행하면 더티 체킹을 통해 스냅샷과 비교하여 수정된 엔티티를 찾고, UPDATE 쿼리를 만들어 쿼리 저장소에 등록한 후에, 쿼리 저장소에 저장된 모든 쿼리를 DB에 보내 동기화한다.

참고 :
https://dev-troh.tistory.com/151
https://devbksheen.tistory.com/entry/엔티티-매니저와-엔티티의-영속성-관리
https://velog.io/@seongwon97/Spring-Boot-영속성-컨텍스트Persistence-Context

profile
◑﹏◐

0개의 댓글