Entity Life Cycle | Transient, Managed, Detached, Removed

2024. 1. 21. 21:55

내가 JPA 강의를 보고 작성한 VELOG 시리즈

목표

내가 그린 그림..

지난 번에 영속성 컨텍스트에 대해서 알아봤다. 
영속성 컨텍스트는 데이터베이스의 테이블을 관리하기 위해서 
엔티티라는 객체를 사용하여 데이터 조작을 한다.
엔티티의 생명 주기에 대한 이해를 통해 작동 원리에 대한 이해를 높여 보자 

 

엔터티의 생명 주기 4 가지 

 

비영속 ( new / Transient )   

- 순수한 객체 상태이며, @Entity 로 선언된 객체 인스턴스 이며 영속성 컨텍스트에 등록되지 않은 상태

Member newMember = new Member();

 

영속 ( Managed )

@Entity 로 선언된 객체를 영속성 컨텍스트에서 관리하는 상태를 말한다.
- 관리되는 상태에서 JPA 의 여러가지 API 를 사용할 수 있게 된다.
- 영속화 된 엔티티는 영속성 컨텍스트의 1차 캐시에 @Id 필드를 식별자로 하여 저장된다.

// Persistence Unit 에서 JPA 설정정보를 불러옴 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

// 설정 정보를 토대로 Entity Manager 객체를 생성
EntityManager em = emf.createEntityManager();

// Entity Manger 객체에서 트랜잭션을 실행 
EntityTransaction et = em.getTransaction();
et.begin();

// @Entity 로 선언된 객체를 생성 - 비영속 
Member newMember = new Member();

// 비영속된 객체를 persist 메소드를 통해 영속화 ( 영속성 컨텍스트에서 관리 시작 ) 
em.persist( newMember );​

 

준영속 ( Detached )

- 객체는 존재하지만 더 이상 영속성 컨텍스트에서 관리하지 않는 상태
- 영속화 된 객체를 영속성 컨텍스트의 1차 캐시에서 지우는 것을 말함

// Persistence Unit 에서 JPA 설정정보를 불러옴 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

// 설정 정보를 토대로 Entity Manager 객체를 생성
EntityManager em = emf.createEntityManager();

// Entity Manger 객체에서 트랜잭션을 실행 
EntityTransaction et = em.getTransaction();
et.begin();

// @Entity 로 선언된 객체를 생성 - 비영속 
Member newMember = new Member();

// 비영속된 객체를 persist 메소드를 통해 영속화 ( 영속성 컨텍스트에서 관리 시작 ) 
em.persist( newMember );

// 준영속 상태로 전환 ( 영속성 컨텍스트에서 더 이상 newMember 에 객체에 대한 관리를 하지 않음 )
em.detach( newMember );

 

삭제 ( Removed )

- 엔티티 삭제를 의미
- 엔티티를 삭제하는 쿼리를 작성하여 트랜잭션이 커밋 이나, 쿼리가 flush 되는 시점에 데이터 베이스에 적용

            Member member = em.createQuery("select m from Member m where m.username = :username", Member.class)
                    .setParameter("username","member1")
                            .getSingleResult();

            System.out.println("member.getUsername() : "+ member.getUsername());
            em.remove(member);
            em.clear();
            tx.commit();
Hibernate: 
    /* select
        m 
    from
        Member m 
    where
        m.username = :username */ select
            member0_.id as id1_0_,
            member0_.age as age2_0_,
            member0_.TEAM_ID as TEAM_ID4_0_,
            member0_.username as username3_0_ 
        from
            Member member0_ 
        where
            member0_.username=?
member.getUsername() : member1
1월 22, 2024 10:35:50 오전 org.hibernate.engine.jd
entityManager 의 remove 를 실행시키면 바로 DB 에 적용 되는 것이 아닌 
트랜잭션이 커밋되고 나서 적용이 되어 delete 쿼리가 발생해야 적용이 된다. 
위 처럼 트랜잭션 커밋 이전에 영속성 컨텍스트를 초기화 하면 query 가 발생하지 않아 DB 에 적용이 되지 않은 것을 볼 수 있다.

 

작성을 마치며 

엔티티의 생명 주기를 이해하면 영속성 컨텍스트에서 발생하는 작업을 이해하는 데 많은 도움이 된다.
원래는 다른 개념들과 함께 정리하고 싶었지만 알아보기 힘들고 
내용이 너무 많아져서 여기서는 엔티티 생명 주기에 대해서만 알아보았다.

BELATED ARTICLES

more