[JPA] 객체의 상태(영속 ,비영속, 준영속)

장숭혁·2023년 11월 8일
0

TIL작성

목록 보기
13/60

영속 상태

 영속 상태란 JPA에서 관리하는 엔티티 객체가 영구 저장소(예: 데이터베이스)에 저장되었거나 저장될 예정인 상태를 나타낸다.
즉, 영속 상태의 엔티티 객체는 JPA가 관리하며, 객체의 변경 사항이 자동으로 데이터베이스에 반영된다.
일반적으로 영속 상태로의 전이는 EntityManager를 통해 엔티티를 조회하거나 새로운 엔티티를 생성하고 persist() 메서드를 호출하여 수행된다.

비영속 상태

 비영속 상태는 JPA에서 아직 관리되지 않는 엔티티 객체 상태를 의미한다.
즉, 비영속 상태의 엔티티 객체는 JPA가 관리하지 않으며, 데이터베이스와의 연관성이 없다.
일반적으로 엔티티 객체를 직접 생성한 경우 비영속 상태이다.

준영속 상태

준영속 상태란 이전에 영속 상태에 있던 엔티티 객체가 영속성 컨텍스트에서 분리되어 더 이상 관리되지 않는 상태를 나타낸다.
즉, 준영속 상태의 엔티티 객체는 JPA가 더 이상 추적하거나 관리하지 않는다.
이러한 상태에서는 엔티티의 변경이 데이터베이스에 반영되지 않는데 준영속 상태의 엔티티를 다시 영속 상태로 만들려면 merge() 메서드를 사용할 수 있다.

비영속 상태의 엔티티를 영속 상태로 만들려면 JPA에서 제공하는 persist() 메서드를 사용하는 것이 아니라 EntityManager의 merge() 메서드를 사용한다. merge() 메서드는 비영속 상태의 엔티티를 영속 상태로 병합(merge)하고 반환한다.

// 비영속 상태의 엔티티 생성
MyEntity entity = new MyEntity();
entity.setName("새로운 엔티티");

// EntityManager 가져오기
EntityManager entityManager = getEntityManager(); 
// EntityManager를 얻는 방법은 프로젝트 설정에 따라 다를 수 있습니다.

// 비영속 상태의 엔티티를 영속 상태로 만들기
entityManager.getTransaction().begin(); // 트랜잭션 시작
MyEntity managedEntity = entityManager.merge(entity);
entityManager.getTransaction().commit(); // 트랜잭션 커밋

// 이제 managedEntity는 영속 상태입니다.
비영속 상태 (Transient State):

비영속 상태는 JPA에서 아직 관리되지 않는 엔티티 상태를 나타낸다.
비영속 상태의 엔티티는 JPA가 인식하지 않으며 데이터베이스와의 연관성이 없다
주로 엔티티를 생성한 직후나 new 키워드로 만들었을 때 비영속 상태인데,
비영속 상태의 엔티티를 영속 상태로 만들기 위해 persist() 메서드를 사용해야 한다.

준영속 상태 (Detached State):

준영속 상태는 이전에 영속 상태에 있던 엔티티가 영속성 컨텍스트에서 분리되어 더 이상 관리되지 않는 상태를 나타낸다.
준영속 상태의 엔티티는 이전에 JPA가 추적하고 관리하던 엔티티이지만, 더 이상 그 역할을 하지 않는다.
준영속 상태에서 엔티티의 변경 사항은 데이터베이스에 자동으로 반영되지 않는다.
다시 영속 상태로 만들려면 merge() 메서드를 사용해야 한다.

준영속상태와 비영속상태의 차이점

 둘은 비슷한 느낌이지만 한번 영속상태였던적이 있는지 없는지의 차이점이 존재한다. 영속상태가 되려면 식별자가 존재해야 하는데 영속상태가 되었다가 준영속상태가 되면 식별자는 항상존재한다. 준영속 엔티티는 영속상태로 만드는 merge를 활용해서 영속성으로 전환할 수 있다.

실무에서는 영속상태가 되었다가 바로 준영속 상태가 되는 일은 드물고, 대신 엔티티를 조회하는데, 트랜잭션이 끝나 영속성 컨텍스트도 사라져 그 엔티티가 준영속상태가 된다. 이런경우는 실무에서 많이 발생한다.

profile
코딩 기록

1개의 댓글

comment-user-thumbnail
2024년 11월 30일

좋은 글 잘 읽고 갑니다~ 읽던 중 오타 발견하여 알려드려요~
준영속 상태 문단 밑 글 '비영속 상태의 엔티티를 영속 상태로 만들려면 JPA에서 제공하는 persist() 메서드를 사용하는 것이 아니라 EntityManager의 merge() 메서드를 사용한다.' -> '준영속 상태의 엔티티를 ~~'

답글 달기

관련 채용 정보