영속성 컨텍스트

yesrin·2023년 6월 15일

Spring

목록 보기
2/18

영속성 컨텍스트

persistence: 영속성, 지속성

객체가 생명(객체가 유지되는 시간)이나 공간(객체의 위치)을 자유롭게 유지하고 이동할수 있는 객체의 성질을 의미함.

Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간

EntityManager: Entity를 관리하는관리자

EntityManager은 EntityManagerFactory를 통해 생성하여 사용할 수 있음.

영속성 컨텍스트에 접근하여 Entity 객체들을 조작하기 위해서는 EntityManager가 필요합니다.

EntityManager는 이름 그대로 Entity를 관리하는 관리자입니다.

개발자들은 EntityManager를 사용해서 Entity를 저장하고 조회하고 수정하고 삭제할 수 있습니다.

EntityManagerFactory

  • EntityManagerFactory는 일반적으로 DB 하나에 하나만 생성되어 애플리케이션이 동작하는 동안 사용됩니다.
  • EntityManagerFactory를 만들기 위해서는 DB에 대한 정보를 전달해야합니다.
    • 정보를 전달하기 위해서는 /resources/META-INF/
      위치에 persistence.xml 파일을 만들어 정보를 넣어두면 됩니다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("memo");
해당 코드를 호출하면 JPA는 persistence.xml 의 정보를 토대로 EntityManagerFactory를 생성합니다.

EntityManager em = emf.createEntityManager(); 코드를 호출하면 EntityManagerFactory를 사용하여 EntityManager를 생성할 수 있습니다.

JPA의 트렌젝션
영속성 컨텍스트에 Entity 들을 T쓰기 지연 저장소에 전부 자기고 있다가 commit이 되면 디비에 반영함.(트렌젝션 개념을 가져옴)

영속성 컨텍스트의 기능

1차 캐시기능
영속성 컨텍스트는 내부적으로 캐시 저장소를 가지고 있음(Map 구조)
캐시저장소 key에 저장한 식별자 값을 사용하여 Entity 객체를 구분하고 관리함


캐시 저장소에 조회하는 Id가 존재하지 않은 경우
1. 캐시 저장소 조회

2. DB SELECT 조회 후 캐시 저장소에 저장

em.find(Memo.class, 1); 호출 시 캐시 저장소를 확인 한 후 해당 값이 없다면?
DB에 SELECT 조회 후 해당 값을 캐시 저장소에 저장하고 반환합니다.

쓰기지연저장소

데이터베이스의 트랜잭션처럼 쿼리를 담고 있다가 트랜잭션 커밋 하면서 한번에 반영해줌

JPA는 이를 구현하기 위해 쓰기 지연 저장소를 만들어 SQL을 모아두고 있다가 트랜잭션 commit 후 한번에 DB에 반영합니다.

flush

트랜잭션 commit 후 쓰기 지연 저장소의 SQL들이 한번에 요청됨을 확인했습니다.
사실 트랜잭션 commit 후 추가적인 동작이 있는데 바로 em.flush(); 메서드의 호출입니다.
flush 메서드는 영속성 컨텍스트의 변경 내용들을 DB에 반영하는 역할을 수행합니다.
즉, 쓰기 지연 저장소의 SQL들을 DB에 요청하는 역할을 수행합니다.

insert,update,delete 데이터를 변경하는 sql을 데이터베이스에 반영하기 위해서는 트랜젝션이 필요함(select는 필수아님)

변경감지

JPA 에서의 update의 처리

  • JPA는 영속성 컨텍스트에 Entity를 저장할 때 최초 상태(LoadedState)를 저장합니다.
    - 트랜잭션이 commit되고 em.flush(); 가 호출되면 Entity의 현재 상태와 저장한 최초 상태를 비교합니다.
    - 변경 내용이 있다면 Update SQL을 생성하여 쓰기 지연 저장소에 저장하고 모든 쓰기지연 저장소의 SQL을 DB에 요청합니다.
    - 마지막으로 DB의 트랜잭션이 commit 되면서 반영됩니다.

    따라서 변경하고 싶은 데이터가 있다면 먼저 데이터를 조회하고 해당 Entity 객체의 데이터를 변경하면 자동으로 Update SQL이 생성되고 DB에 반영됩니다.
    이러한 과정을 변경 감지, Dirty Checking이라 부릅니다.

**트랜젝션 환경이 걸려 있어야 변경감지가 된다!!

profile
안녕하세요! 틀린 정보는 댓글 달아 주세요.

0개의 댓글