JPA 영속성 관리 - 내부 동작 방식 플러시

2022. 6. 28. 23:31·공부/JPA
반응형

출처 : 자바 ORM 표준 JPA 프로그래밍 인프런 강의

 

JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.

 

플러시(flush)

플러시란 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 말한다. Transaction commit이 일어날 때 flush가 동작하면서 쓰기 지연 SQL 저장소에 담아놨던 SQL들이 DB에 전달된다. 그러면서 영속성 컨텍스트의 변경 사항들이 DB에 동기화된다.

 

플러시 동작 과정

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

! flush == commit()이 아니다. flush -> commit()이 맞는 표현이다.

 

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

  • em.flush() - 직접 호출
Member member = new Member(200L, "member200");
em.persist(member);

em.flush();

System.out.println("============================");
tx.commit();

// console 출력
Hibernate: 
    /* insert hellojpa.Member
        */ insert 
        into
            Member
            (name, id) 
        values
            (?, ?)
============================

flush가 없을 때는 SQL문이 sout로 찍은 선 밑으로 나오지만 flush를 직접 호출하기 때문에 이중선 위에서 SQL문이 실행된다.
참고로 플러시가 일어나면 1차 캐시가 모두 지워지는게(비워지는게) 아니다. 1차 캐시는 그대로 남아있고, 쓰기 지연 SQL 저장소에 있는 SQL문들만 DB에 전송되어 동기화되는 과정일뿐이다.

  • 트랜잭션 커밋 - 플러시 자동 호출
  • JPQL 쿼리 실행 - 플러시 자동 호출
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);

// JPQL 실행
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();

위 코드는 정상적으로 동작이 될까? em.persist()로 저장한 memberA, memberB, memberC는 아직 DB에 저장되지 않은 상태이고 쓰기 지연 SQL 저장소에 저장이 되어있는 상태이다. 그러므로 현재 member table에는 memberA, memberB, memberC의 데이터가 없는 상태이다. 이런 상황에서 JPA는 이러한 이상 상황을 줄여주고자 JPQL이 실행될 때 자동으로 flush를 호출해 영속성 컨텍스트에 저장되어 있는 SQL을 DB에 전달해 동기화해준다.

 

플러시 모드 옵션

  • em.setFlushMode(FlushModeType.COMMIT)
  • FlushModeType.AUTO : 기본값, 커밋이나 쿼리를 실행할 때 플러시
  • FlushModeType.COMMIT : 커밋할 때만 플러시
  • 그냥 있다는 것만 알아두고 가급적 AUTO로만 사용하자.

 

플러시 정리

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

 

 

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/JPA' 카테고리의 다른 글
  • JPA 엔티티 매핑 - 객체와 테이블 매핑, 데이터베이스 스키마 자동 생성
  • JPA 영속성 관리 - 내부 동작 방식 준영속 상태
  • JPA 영속성 관리 - 영속성 컨텍스트
  • JPA 시작하기 - Hello JPA 시작하기 (프로젝트 생성 및 개발)
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프론트엔드
    토비의스프링부트
    기출문제
    개발자
    토이프로젝트
    RESTful
    운영체제
    MSA
    Java
    프로그래머스
    SQL
    egov
    인프런
    에러해결
    알고리즘
    springboot
    JPA
    자바스크립트
    QueryDSL
    넥사크로
    전자정부프레임워크
    백준
    코딩테스트
    oracle
    SpringBoot를 이용한 RESTful Web Service 개발
    react
    방통대
    IT
    Spring
    스프링부트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
JPA 영속성 관리 - 내부 동작 방식 플러시
상단으로

티스토리툴바