[Spring] JPA 준영속 상태(Detached)

2025. 8. 15. 00:49·Back end/Spring Project
반응형

1. 준영속 상태란?

준영속 상태(Detached)는 말 그대로 한 번 영속 상태였다가 영속성 컨텍스트와의 관계가 끊어진 상태를 말합니다.
즉, 엔티티 객체는 여전히 메모리에 존재하지만 JPA가 해당 엔티티를 관리하지 않는 상태입니다.

📌 영속 상태 → 준영속 상태 전환 시, 더 이상 1차 캐시나 변경 감지(Dirty Checking)가 동작하지 않습니다.


2. 준영속 상태로 만드는 방법

JPA에서 엔티티를 준영속 상태로 전환하는 방법은 크게 세 가지가 있습니다.

  1. em.detach(entity)
    → 특정 엔티티만 준영속 상태로 전환합니다.
  2. em.clear()
    → 영속성 컨텍스트를 완전히 초기화하여 모든 엔티티를 준영속 상태로 만듭니다.
  3. em.close()
    → 영속성 컨텍스트를 종료합니다. (트랜잭션 종료 시 주로 발생)

3. 준영속 상태의 특징

  • 1차 캐시에서 제거됨
    → 해당 엔티티는 영속성 컨텍스트가 관리하지 않음
  • 변경 감지(Dirty Checking) 안 됨
    → 준영속 상태에서는 필드 값을 변경해도 DB에 반영되지 않음
  • 다시 영속 상태로 만들려면 merge() 필요
    → 준영속 → 영속 상태 복귀는 em.merge(entity)로 가능
  • 조회 시 DB에서 다시 조회
    → 1차 캐시에서 찾을 수 없으므로 select 쿼리 실행

4. 예제 코드

// 1. 영속 상태
Member member = em.find(Member.class, 150L);
member.setName("AAAAA"); // 변경 감지 대상

// 2. 준영속 상태 전환
// em.detach(member); // 특정 엔티티만 준영속
em.clear(); // 영속성 컨텍스트 전체 초기화

// 3. 동일 엔티티 재조회
Member member2 = em.find(Member.class, 150L);

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

💻 실행 결과

Hibernate: 
    select
        m1_0.id,
        m1_0.name 
    from
        Member m1_0 
    where
        m1_0.id=?
Hibernate: 
    select
        m1_0.id,
        m1_0.name 
    from
        Member m1_0 
    where
        m1_0.id=?
===============================
  • 첫 번째 em.find()에서 조회한 후, em.clear()로 캐시가 비워졌기 때문에
  • 두 번째 em.find()도 DB에서 다시 select 쿼리를 실행합니다.

💡 Tip: 준영속 상태 전환은 주로 대규모 데이터 처리 시 메모리 최적화를 위해 사용됩니다.
예를 들어, 배치 처리 중 일부 데이터만 영속 상태로 유지하고 나머지는 em.clear()로 정리하면 메모리 사용량을 줄일 수 있습니다. 

반응형

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

[Spring] JPA - @MappedSuperclass  (0) 2025.08.27
[Spring] JPA 양방향 연관관계와 연관관계의 주인  (0) 2025.08.20
[Spring] JPA flush  (0) 2025.08.14
[Spring] JPA 기본 CRUD 동작 예제  (0) 2025.08.13
[Spring] Maven profile 이용한 환경별 (local, dev, prod) 빌드 및 설정 분리  (0) 2025.07.23
'Back end/Spring Project' 카테고리의 다른 글
  • [Spring] JPA - @MappedSuperclass
  • [Spring] JPA 양방향 연관관계와 연관관계의 주인
  • [Spring] JPA flush
  • [Spring] JPA 기본 CRUD 동작 예제
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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kim-SooHyeon
[Spring] JPA 준영속 상태(Detached)
상단으로

티스토리툴바