hayu's 개발 일지

[TIL]240418 영속성 컨텍스트 본문

프레임워크/spring

[TIL]240418 영속성 컨텍스트

hayu00 2024. 4. 18. 21:52

영속성 컨텍스트란?

  • 엔티티를 영구 저장하는 환경
  • 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 저장소같은 역할이다.
  • 엔티티 메니저(EntityManager)를 통해 영속성 컨텍스트에 접근한다.

→ 엔티티 메니저를 통해 엔티티를 저장, 조회하면 엔티티 매니저는 영속성 컨텍스트에 해당 엔티티를 보관하고 관리한다.

  • 영속성 컨텍스트는 JPA에서 사용되는 개념 중 하나이며, 엔티티(Entity) 객체를 영구 저장하고 데이터 베이스와 상호작용한다.

엔티티의 생명주기

  • 비영속(new/transient): 영속성 컨텍스트와 관계가 없는 새로운 상태이다.(무관한 상태)
  • 영속(managed): 영속성 컨텍스트에 관리되는 상태이다.(저장된 상태)
  • 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태이다.
  • 삭제(remove): 삭제된 상태이다.

비영속(new)

  • 엔티티 객체를 생성했지만, 아직 영속성 컨텍스트에는 저장되지 않은 상태(순수 객체)
Member member = new Member();

영속(Managed)

  • 엔티티 매니저를 통해서 엔티티를 영속성 컨텍스트에 저장한 상태이다.
  • 객체는 영속성 컨텍스트에 의해 관리된다는 의미이다.
//	순수 객체
Member member = new Member();

//	영속성 컨텍스트에 저장 -> 영속성 컨텍스트가 관리
EntityManager em;
em.persist(member);

준영속(detached)

  • 영속성 컨텍스트가 관리하던 상태에서 엔티티를 더이상 관리하지 않는 상태이다.

준영속 상태의 특징

  • 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩을 포함한 영속성 컨텍스트가 제공하는 어떠한 기능도동작하지 않는다.
  • 식별자 값을 가지고 있다.
//	엔티티를 영속성 컨텍스트에서 분리.
em.detach(member);
//	영속성 콘텍스트를 비움(초기화).
em.claer();
//	영속성 콘텍스트를 종료.
em.close();

엔티티를 준영속 상태로 전환하는 방법

detach(entity)

  • 특정 엔티티만 준영속 상태로 전환(영속성 컨텍스트로부터 분리)
  • 1차 캐시, 쓰기 지연, SQL 저장소 정보 제거
  • 영속성 컨텍스트 안에서의 Insert, Update 쿼리도 제거되어 DB에 저장되지 않음

clear()

  • 영속성 컨텍스트를 완전히 초기화
  • 영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만듦
  • 영속성 컨텍스트 틀은 유지하지만 내용은 비워 새로 만든 것과 같은 상태

close()

  • 영속성 컨텍스트를 종료
  • 해당 영속성 컨텍스트가 관리하던 영속성 상태의 엔티티들은 모두 준영속 상태로 변경

엔티티를 영속 상태로 전환하는 방법

merge(entity)

  • 준영속 상태의 엔티티를 다시 영속 상태로 변경(병합)
  • 파라미터로 전달된 엔티티의 식별자 값으로 영속성 컨텍스트를 조회하고 엔티티가 없다면, DB에서 조회
  • 만약 DB에서도 없다면 새로운 엔티티를 생성하여 병합
  • 병합은 save(저장) 또는 update(수정) 기능 수행

삭제(remove)

  • 엔티티를 영속성 컨텍스트와 데이터 베이스에서 삭제
em.remove(member);

영속성 컨텍스트의 특징

  • 엔티티 매니저를 생성할 때 영속성 컨텍스트도 생성된다.(1:1)
  • 엔티티 메니저를 통해 해당 영속성 컨텍스트에 접근, 관리할 수 있다.
    • 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다.
    • 영속 상태는 식별자 값이 있어야 한다.
  • JPA 는 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터 베이스에 반영한다.
  • 트랜잭션: 데이터 베이스의 상태를 변화시키는 작업이다. 여러 개의 데이터 베이스 조작 명령문(쿼리)이 모여서 한번에 실행되는 것을 말한다.
  • 영속성 상태의 엔티티는 모두 영속성 컨텍스트에서 관리한다.
    • 내부 캐시(1차 캐시)에 저장
    • 동일성 보장
    • 트랜잭션을 지원하는 쓰기 지연
    • 변경 감지
    • 지연 로딩

 

참고 자료

- https://dev-jwblog.tistory.com/125

- https://velog.io/@seongwon97/Spring-Boot-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Persistence-Context

- https://yuha00e.tistory.com/entry/TIL240307-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8