ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring JPA] 영속성 컨텍스트의 특징
    Spring/Spring JPA 2021. 6. 14. 18:36

    1. 1차 캐시 기능

     

    다음과 같이 Member 객체를 생성하고 persist했다고 가정해보자

     

    // 객체 생성
    Member member = new Member();
    member.setId("member1");
    member.setUsername("회원1");
    
    // 객체 영속화
    em.persist(member);

     

    영속성 컨텍스트가 flush되기 전까지는 다음과 같은 상태를 유지한다

     

     

    만약 이 상태에서 다음과 같이 객체를 조회한다면 DB에 쿼리를 날리지 않고 바로 조회될 것이다

     

    Member findMember = em.find(Member.class. "member1");

     

     

    만약 DB에 존재하는 member2를 조회한다면 1차 캐시를 거쳐서 조회될 것이다

     

    Member findMember2 = em.find(Member.class, "member2");

     

     

     

    2. 영속 엔티티의 동일성 보장

     

    동일 트랜잭션 내에서 조회시 영속 엔티티의 동일성을 보장한다

     

    findMember1 = em.find(Member.class, "member1");
    findMember2 = em.find(Member.class, "member2");
    sout(a==b); // 동일성 true 출력

     

    3. 트랜잭션을 지원하는 쓰기 지연

     

    모든 쓰기 명령은 쓰기 지연 SQL 저장소에 저장되었다가 flush에 의해 실제 DB에 query된다

    다음과 같이 memberA와 memberB를 저장했다고 가정하자

     

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    
    em.persist(memberA);
    em.persist(memberB);
    
    tx.commit();
    

     

    em.persist(memberA) 명령을 실행하면 다음과 같이 쓰기지연 SQL 저장소에 INSERT 명령이 저장된다

     

     

    em.persist(memberB) 명령을 실행해도 동일하다

     

     

    tx.commit() 명령을 실행하면 내부적으로 flush 명령이 실행되고 이때 DB에 쿼리가 전달된다

     

     

    4. Dirty Checking (변경 감지)

     

    엔티티를 수정한 경우 추가적인 update 명령이 없어도 자동으로 변경을 감지하여 쿼리를 전달한다

    다음처럼 데이터를 수정한 경우를 살펴보자

     

    EntityManagerFactory emf = Persistence.CreateEntityManagerFactory("hello");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTrasaction();
    tx.begin();
    
    Member findMember = em.find(Member.class, "memberA");
    
    findMember.setUsername("hi");
    findMember.setAge(10);
    
    tx.commit();

     

    commit() 명령 내부에서 flush() 함수가 실행되는 과정은 다음과 같다

    1. flush()

    2. EntityManager에서 엔티티와 스냅샷을 비교하여 변경 사항을 확인한다

    3. Update SQL 쿼리를 생성하여 쓰기지연 SQL 저장소에 저장한다

    4. flush를 실행하면서 SQL쿼리를 전달한다

     

    이를 그림으로 표현하면 다음과 같다

     

     

     

    'Spring > Spring JPA' 카테고리의 다른 글

    [Spring JPA] 엔티티 매핑  (0) 2021.06.18
    [Spring JPA] 엔티티의 생명주기  (0) 2021.06.14
    [Spring JPA] @어노테이션 정리  (0) 2021.06.14
Designed by Tistory.