ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] 3. 영속성 관리 - 플러시, 준영속
    ComputerScience/JPA 2022. 6. 19. 15:05

    앞 장에서 영속성 컨텍스트에 대해 알아봤습니다.

    이번 장에서는 영속성 컨텍스트에서 사용하는 플러시와 준영속 상태에 대해 알아보겠습니다.

    플러시

    플러시를 작동시키게 되면 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하게 됩니다. 

    보통은 DB가 commit 될 때 flush가 발동하게 됩니다. 

     

    플러시의 특징은 다음과 같습니다.

    • 영속성 컨텍스트를 비우지 않음 -> 1차 캐시를 비우는 게 아닙니다.
    • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
    • 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됩니다.

     

    플러시 작동 순서

    • 변경감지
    • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
    • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)

    영속성 컨텍스트를 플러시 하는 방법

    영속성 컨텍스트를 플러시 하는 방법은 자동으로 직접 실행되는 경우도 있고 직접 실행하는 경우가 있습니다.

    • em.flush() - 직접 함수호출하여 플러시를 실행 
    • 트랜잭션 커밋 - 트랜잭션이 Commit 될 때 플러시가 자동 호출
    • JPQL 쿼리 실행 - JPQL 쿼리가 실행될 때 플러시가 자동 호출

    flush함수를 호출하거나 트랜잭션이 커밋되는 경우 플러시가 실행되는 것은 알겠는데, JPQL이 실행될 때 플러시가 자동호출 되는 이유는 무엇일까요?

    em.persist(memberA);
    em.persist(memberB);
    em.persist(memberC);
    //중간에 JPQL 실행
    query = em.createQuery("select m from Member m", Member.class);
    List<Member> members= query.getResultList();

    만약 엔티티 매니저가 객체들을 영속성 컨텍스트에 넣어준 뒤, 중간에 JPQL이 실행될 경우 JPQL은 그냥 SQL로 번역되어 실행되기 때문에 DB를 바로 접근하게 됩니다.

    만약 이런 경우 플러시가 실행되지 않은 채로 SQL이 작동하면 영속화된 객체들을 감지하지 못하기 때문에 JPA는 일반모드로 JPQL을 실행할 때 플러시를 먼저 실행합니다.

     

    플러시 모드 옵션

    em.setFlushMode(모드옵션);

    플러시 모드에는 기본적으로 2가지 모드가 있습니다.

    • FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시함 (기본값)
    • FlushModeType.COMMIT : 커밋할 때만 플러시

    기본세팅은 FlushModeType.AUTO 이며 대부분 AUTO 세팅으로 개발을 진행한다고 합니다.

     


    준영속 상태

    영속상태란 영속성 컨텍스트의 1차캐시에 올라와 있는 상태를 말합니다.

    그렇다면 준영속상태는 무엇일까요?

    • 영속 상태에서 준영속 상태로 변경되면
    • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
    • 영속성 컨텍스트가 제공하는 기능을 사용하지 못함

    준영속 상태로 만드는 방법

    준영속 상태로 만드는 방법은 다음과 같습니다.

    • em.detach(entity) : 특정 엔티티만 준영속 상태로 전환
    • em.clear() : 영속성 컨텍스트를 완전히 초기화 (영속성 엔티티들을 모두 초기화)
    • em.close() : 영속성 컨텍스트를 종료

     

    댓글

Designed by Tistory.