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

서문🌙·2023년 4월 19일
0
post-thumbnail

엔티티(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
예외(exception)는 있다

0개의 댓글