[Spring] JPA flush

2025. 8. 14. 18:23·Back end/Spring Project
반응형

1. flush의 개념

flush는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 과정입니다.
여기서 중요한 점은 영속성 컨텍스트를 비우지 않는다는 것입니다.
즉, 1차 캐시(영속성 컨텍스트)는 그대로 유지되며, 단순히 SQL 저장소에 쌓여있던 쿼리들이 데이터베이스로 전송됩니다.


2. flush의 특징

  • 1차 캐시(영속성 컨텍스트)는 유지됨
    → clear()처럼 캐시를 비우지 않습니다.
  • 쓰기 지연 SQL 저장소의 쿼리를 DB에 반영
    → em.persist()나 entity.setName() 등으로 변경된 내용을 DB에 즉시 보냅니다.
  • 트랜잭션을 끝내는 것이 아님
    → flush() 호출 후에도 트랜잭션은 여전히 활성 상태입니다.
  • 동기화 목적
    → JPQL 실행 전, 트랜잭션 커밋 직전에 DB와 영속성 컨텍스트를 맞추기 위해 사용됩니다.

3. flush가 실행되는 시점

JPA에서는 보통 flush()를 직접 호출하지 않아도 자동으로 동작합니다. 자동 실행 시점은 다음과 같습니다.

  1. 트랜잭션 커밋 시
    → 커밋 직전에 영속성 컨텍스트의 변경 내용을 DB에 반영합니다.
  2. JPQL 쿼리 실행 시
    → 쿼리 실행 전에 flush를 호출하여 영속성 컨텍스트의 변경 내용이 쿼리 결과에 반영되도록 합니다.
  3. 직접 호출 시
    → em.flush()를 코드에서 명시적으로 호출할 수 있습니다.

4. 예제 코드

Member member = new Member(200L, "member200");
em.persist(member); // INSERT SQL은 아직 DB에 전송되지 않음 (쓰기 지연)

// flush 호출
em.flush(); // SQL 저장소의 INSERT 쿼리 DB로 전송, 1차 캐시는 유지됨

System.out.println("===============================");
tx.commit(); // 이미 flush 되었으므로 INSERT 재전송 없음

💻 실행 결과

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

💡 Tip: flush()는 특별한 상황에서만 직접 호출하고, 대부분의 경우 커밋 시점 자동 flush에 의존해도 무방합니다.
하지만 JPQL 실행 전에 현재까지의 변경 내용이 쿼리에 반영되어야 하는 경우 직접 호출하는 것이 좋습니다.

반응형

'Back end > Spring Project' 카테고리의 다른 글

[Spring] JPA 양방향 연관관계와 연관관계의 주인  (0) 2025.08.20
[Spring] JPA 준영속 상태(Detached)  (0) 2025.08.15
[Spring] JPA 기본 CRUD 동작 예제  (0) 2025.08.13
[Spring] Maven profile 이용한 환경별 (local, dev, prod) 빌드 및 설정 분리  (0) 2025.07.23
[Spring] BeanFactory와 ApplicationContext  (0) 2025.07.17
'Back end/Spring Project' 카테고리의 다른 글
  • [Spring] JPA 양방향 연관관계와 연관관계의 주인
  • [Spring] JPA 준영속 상태(Detached)
  • [Spring] JPA 기본 CRUD 동작 예제
  • [Spring] Maven profile 이용한 환경별 (local, dev, prod) 빌드 및 설정 분리
Kim-SooHyeon
Kim-SooHyeon
개발일기 및 알고리즘, 블로그 운영에 대한 글을 포스팅합니다. :) 목표: 뿌리 깊은 개발자 되기
    반응형
  • Kim-SooHyeon
    soo_vely의 개발로그
    Kim-SooHyeon
  • 전체
    오늘
    어제
    • 분류 전체보기 (258)
      • 알고리즘 (108)
        • 자료구조 (3)
        • Java (104)
        • Python (1)
      • Back end (73)
        • Spring Project (28)
        • Java (23)
        • API (1)
        • Python (0)
        • Django (3)
        • Linux (1)
        • 서버 (2)
        • 에러로그 (11)
        • 부스트 코스 (1)
      • Front end (9)
        • HTML, CSS (4)
        • JavaScript (4)
        • JQuery (0)
      • 기타 프로그래밍 (4)
        • Android Studio (1)
        • Arduino (2)
        • Azure Fundamental(AZ-900) (1)
      • 개발도구 (24)
        • IntelliJ (2)
        • Git (12)
        • SVN (0)
        • Eclipse (2)
        • 기타 Tool (8)
      • Database (17)
        • Oracle (11)
        • MySQL (0)
        • H2 Database (3)
        • ORM & JPA (1)
      • 자격증 (10)
        • 컴활 1급 (7)
        • 컴활 2급 (2)
        • SQLD (1)
      • 기타 (13)
        • 블로그 운영 (6)
        • 문서 (1)
        • 기타 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java
    백준알고리즘
    단계별풀기
    알고리즘
    1차원 배열
    jpa
    github
    배열
    구현
    오라클
    BOJ
    백준 자바
    백준
    solved.ac
    문자열
    Oracle
    for문
    springboot
    spring
    Git
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kim-SooHyeon
[Spring] JPA flush
상단으로

티스토리툴바