참치코더의 꿈 메모장

JPA / Entitymanager와 영속성 컨텍스트 관계 정리 본문

JPA

JPA / Entitymanager와 영속성 컨텍스트 관계 정리

참치깡 2025. 10. 1. 14:12
728x90

 

영속성 컨텍스트

 

- 엔티티를 영구 저장하는 환경, 엔티티 매니저로 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 

  엔티티를 보관하고 관리한다.

 

- 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리할 수 있다.

 

영속성 컨텍스트 특징

 

- 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. (엔티티 객체의 필드값 == 영속성 컨텍스트의 구분값)

 

- 영속성 컨텍스트는 내부 지연 데이터베이스에서 사용자가 트랜잭션 범위 내에서 변경된 sql 쿼리 문을 가지고

  있다가 트랜잭션을 커밋한 순간 해당 데이터가 데이터베이스에 완전히 반영된다.

  (tx.commit(); -> 영속성 컨텍스트 내부에서 flush(); 실행)

 

- em.find(Member.class, "member1")을 호출하면 먼저 1차 캐시에서 엔티티를 찾고 만약 캐시에 데이터가 없다면

  데이터베이스에서 데이터를 영속성 컨텍스트로 끌어온다. 

 

엔티티의 생명주기

 

1. 비영속(new/transition)

 

- 엔티티 객체를 생성만 하고 엔티티 매니저에 등록을 하지 않은 상태

 

Member member = new Member();

member.setId("member1");

member.setUsername("회원1");

// 동작 끝

 

2. 영속(managed)

 

- 영속성 컨텍스트에 저장된 상태

 

em.persist(member);

// 동작 끝

 

3. 준영속(detached)

 

- 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않도록 떼어내는것

- em.close( )를 호출해서 영속성 컨텍스트를 닫거나 em.clear( )를 호출해서 영속성 컨텍스트를 초기화해도 

  영속성 컨텍스트가 관리하던 영속 상태의 엔티티는 준영속 상태가 된다.

 

- em.detach(member);

// 동작 끝

 

4. 삭제(removed)

 

- 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한다.

 

- em.remove(member);

 

플러시

 

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.

 

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

 

1. em.flush()를 직접 호출

 

2. 트랜잭션 커밋 시 자동 flush() 호출

 

3. JPQL 쿼리 실행 시 플러시가 자동 호출된다.

 

 

주의점

 

- 플러시를 하면 영속성 컨텍스트에 보관된 캐시 내용을 지우면서 데이터베이스에 반영되는것이 아니라

  영속성 컨텍스트에 변경된 캐시값을 확인하여 순차적으로 쓰기 지연 저장소에 저장된 쿼리 SQL문을 

  데이터베이스에 반영하는 것이다.

 

준영속

 

- 준영속 상태의 엔티티는 영속상태인 엔티티를 해제한 엔티티이기 때문에 영속상태가 제공하는 기능을 

  사용할 수 없다.

- 쉽게 말하면 해당 영속 컨텍스트 에서 관련 엔티티 정보를 관리하지 않는다.

 

영속 상태인 엔티티를 준영속 상태로 만드는 방법 3가지(영속 상태 해제 방법 3가지)

 

1. em.detach(entity) : 특정 엔티티만 준영속 상태로 전환한다.

 

2. em.clear() : 영속 컨텍스트를 완전히 초기화한다.

 

3. em.close() : 영속 컨텍스트를 종료한다.

 

준영속 상태의 특징

 

- 영속성 컨텍스트가 관리하지 않으므로, 1차 캐시, 쓰기 지연, 변경 감지, 지연로딩을 포함한 영속성 컨텍스트가

  제공하는 어떠한 기능도 동작하지 않는다.

 

- 준영속 상태는 이미 한번 영속 상태였다 해제된것이기 때문에 반드시 식별자 값을 가지고 있다.(@ Id가 된 기본키값)

 

- 지연 로딩을 할 수 없다.

 

728x90
Comments