개발놀이터

JPA 엔티티 생명주기 본문

JPA/JPA

JPA 엔티티 생명주기

마늘냄새폴폴 2023. 6. 21. 21:23

이번 포스팅에선 JPA에서 엔티티의 생명주기에 대해서 알아보도록 하겠습니다. 

 

스프링의 빈 생명주기를 공부해 보신 분들이라면 JPA의 엔티티 생명주기라는 말을 들으실 때 대충 감이 잡히실겁니다. 엔티티의 생명주기란 엔티티를 사용할 수 있는 다양한 상태라는 것을 말이죠. 

 

스프링 빈 생명주기에 객체 생성, 의존 설정, 초기화, 사용, 소멸의 생명 주기를 가지고 있다면 JPA의 엔티티는 Trasient (비영속), Managed (영속), Detached (준영속), Removed (삭제) 상태가 있습니다. 

 

한번 자세히 알아보죠. 

 

JPA 엔티티 생명주기

New / Transient (비영속)

  • 엔티티 객체가 생성된 상태를 말합니다. 이 상태를 New 혹은 Transient 상태라고 합니다. 이 상태는 객체가 아직 EntityManager에 연관된 상태가 아니고 데이터베이스와 연결도 되지 않은 상태입니다. 
  • Transient 상태는 곧 GC에 의해 삭제될 객체이고 더 이상 참조가 남아있지 않은 상태로 바뀔 것입니다. 

 

Managed (영속)

  • 엔티티 객체는 Managed 혹은 Persist 상태가 되고 EntityManager의 persist() 메서드를 통해 데이터베이스와 연결됩니다. 그리고 이 의미는 현재 활동중인 트랜잭션에 포함된다는 의미입니다. 
  • 영속 상태인 인스턴스는 항상 영속성 컨텍스트와 연결되어 있고 @Transactional의 대상이기도 합니다. 
  • 만약 영속 상태의 객체의 값이 변한다면 트랜잭션이 커밋할 때 데이터베이스와 자동으로 동기화 작업을 진행해줍니다. 이 작업이 바로 잘 알려지기로는 Dirty Checking 우리말로 변경 감지라고 합니다. 
  • EntityManager에 의해 데이터베이스로부터 조회된 엔티티 객체 또한 영속 상태입니다. 

 

Detached (준영속)

  • Detached (준영속) 상태는 EntityManager로부터 연결이 끊어진 엔티티 객체를 나타냅니다. 
  • 객체의 식별자는 데이터베이스 테이블 안에서 존재해야하고 객체는 영속성 컨텍스트와 연관되어있지 않습니다. 
  • 인스턴스는 하이버네이트 세션에서 close() 메서드를 수행할 때 영속성 컨텍스트와의 연관성을 잃어버립니다. 
  • 이 상태는 더 이상 데이터베이스와 동기화를 보장하지 않습니다. 준영속 상태의 객체는 더 이상 영속성 컨텍스트의 관리아래 있지 않고 GC에 의해 삭제될 운명입니다. 

 

Removed (삭제)

  • 영속 상태인 엔티티 객체는 EntityManager의 remove() 메서드에 의해 트랜잭션에서 떨어져나오고 머리에 "삭제" 딱지를 붙이고 있습니다. 그럼 이 엔티티 객체는 Managed 상태에서 Removed 상태로 변경됩니다. 이 상태는 물리적으로 데이터베이스로부터 떨어져나온 상태입니다. 

 

 

 

계속 영속성 컨텍스트에 대해서 언급하는데 영속성 컨텍스트에 대해 빠르게 짚고 넘어가겠습니다. 

 

영속성 컨텍스트

영속성 컨텍스트는 EntityManager의 모든 영속화된 객체들을 모아둔 컬렉션입니다. 만약 우리가 엔티티를 조회하려고 하면 영속성 컨텍스트에 엔티티가 존재하는지 살펴보고 존재하면 엔티티 객체는 데이터베이스에 접근해서 엔티티 객체를 가져오는 것이 아니라 영속성 컨텍스트로부터 엔티티 객체를 리턴받아 관리합니다. 

 

모든 EntityManager는 영속성 컨텍스트를 가지고 있고 영속성 컨텍스트는 주어진 EntityManager의 로컬 캐시로서 사용됩니다. 

 

 

마치며

이번 포스팅은 JPA의 엔티티 생명주기에 대해서 알아봤습니다. 사실 오래전에 이 개념에 대해서 포스팅을 하긴 했는데요. 그땐 뭔소리인지도 모르고 그냥 들었어서 다시 업데이트할겸 새롭게 올렸습니다. 

 

이번 개념을 공부하면서 느낀점은 보통 Spring Data JPA를 사용할텐데 저렇게 영속 준영속 왔다갔다 하면서 쓸 일이 있을까 싶은 느낌은 있습니다. 

 

그냥 영속 상태에서 작업하는게 생각할 것도 없고 간단한데말이죠. 이 부분에 대해서는 추후에 GPT한테 물어보도록 하겠습니다. 

 

이렇게 긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~

 

 

출처

https://www.mastertheboss.com/java-ee/jpa/understanding-jpa-entity-life-cycle/

 

Understanding JPA Entity life cycle - Mastertheboss

This article discusses the life cycle of Entity objects in JPA Applications. Understanding the different stages that an Entity goes through is crucial for

www.mastertheboss.com

https://javabydeveloper.com/jpa-entity-lifecycle-jpa-developer-should-know/

 

Entity lifecycle in JPA

In this tutorial we are going to see about JPA Entity lifecycle and Instance state transitions.

javabydeveloper.com