영속성 컨텍스트 1

초코칩·2024년 2월 5일

JPA

목록 보기
1/4
post-thumbnail

JPA에서 가장 중요한 두 가지

  • 객체와 관계형 데이터베이스 매핑(ORM, Object Relational Mapping)

    설계 관점

  • 영속성 컨텍스트

    실제 동작 관점

엔티티 매니저 팩토리와 엔티티 매니저

엔티티 매니저 팩토리(Entity Manager Factory)는 JPA의 핵심 인터페이스 중 하나로, 엔티티 매니저를 생성하는 역할을 담당합니다. 일반적으로 애플리케이션의 생명 주기 동안 단 한 번만 생성되고, 애플리케이션이 종료될 때까지 유지됩니다.

엔티티 매니저(Entity Manager)는 영속성 컨텍스트를 관리하며, 엔티티의 생명 주기를 추적하고 데이터베이스와의 상호 작용을 수행합니다. 엔티티 매니저는 엔티티 매니저 팩토리를 통해 생성되며, 트랜잭션이나 비즈니스 로직의 범위 내에서 사용됩니다. 트랜잭션 종료 후에는 주로 닫히게 됩니다.

엔티티 매니저 팩토리와 엔티티 매니저는 다음과 같이 작동됩니다.

  1. 사용자로부터 요청이 들어옵니다.
  2. Entity Manager Factory로부터 Entity Manager를 생성합니다.
  3. Entity Manager는 내부적으로 ConnectionPool을 통해 DB와 통신합니다.

영속성 컨텍스트

  • JPA를 이해하는데 가장 중요한 용어로, 엔티티를 영구 저장하는 환경이라는 뜻을 가지고 있습니다.

  • EntityManager.persist(entity);

    이 코드로 DB에 엔티티를 바로 저장하는 것처럼 보이지만, 그렇지 않습니다. 영속성 컨텍스트를 통해서 엔티티를 영속화하는 것입니다.

영속성 컨텍스트는 엔티티 객체의 상태를 관리하는 논리적인 개념으로 엔티티 매니저를 통해 엔티티 객체를 관리하며, 엔티티의 상태 변화를 추적하고 데이터베이스와의 일관성을 유지합니다.

J2SE 환경

엔티티 매니저와 영속성 컨텍스트의 관계는 1:1입니다.

J2EE, 스프링 프레임워크 같은 컨테이너 환경은 추후 스프링 프레임워크 학습 후 설명합니다.

엔티티의 생명주기

  • 비영속 (new/transient)
    영속성 컨텍스트와 전혀 관계가 없는 새로운 상태입니다.

    객체가 생성된 상태

  • 영속 (managed)
    영속성 컨텍스트에 관리되는 상태입니다.

    EntityManager.persist(entity);를 통해 관리되는 상태

  • 준영속 (detached)
    영속성 컨텍스트에 저장되었다가 분리된 상태입니다.

  • 삭제 (removed)
    영속성 컨텍스트에서 삭제된 상태입니다.

  • 정리

비영속

객체를 생성하여 JPA가 객체를 인식하지 못하는 상태를 말합니다.
즉, JPA가 해당 객체를 아직 데이터베이스와 매핑하지 않은 상태를 의미합니다.

예제 코드 :

//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
	

영속

영속 상태란, JPA가 해당 객체를 관리하는 상태를 말합니다.
즉, JPA가 해당 객체를 데이터베이스와 매핑하고, 객체와 데이터베이스의 상태를 동기화하여 관리하는 상태입니다.

예제 코드 :

//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername(“회원1);

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

//객체를 저장한 상태(영속)
em.persist(member);

em.persist(member);를 통해 영속화해도 DB에 저장되지 않습니다.
INSERT SQL문이 실행되지 않는 것을 확인할 수 있습니다.

JpaMain 실습 코드

/* src/main/java/hellojpa/JpaMain.class 파일 코드*/
package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;

public class JpaMain {
    public static void main(String[] args){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();

        tx.begin();
        try{
            //비영속
            Member member = new Member();
            member.setId(100L);
            member.setName("HelloJPA");

            //영속
            System.out.println("=== BEFORE ===");
            em.persist(member);
            System.out.println("=== AFTER ===");

            tx.commit();
        } catch(Exception e){
            tx.rollback();
        }
        finally{
            em.close();
        }

        emf.close();
    }
}

결과로 알 수 있는 것은 영속 상태가 된다고 해서 바로 DBquery를 전송하는 게 아라 transaction 을 commit 할때 query가 전송됩니다.

준영속, 삭제

준영속 상태(Detached)는 영속성 컨텍스트에서 분리된 상태를 말합니다. 즉, JPA가 해당 객체를 더 이상 관리하지 않는 상태를 의미합니다. 준영속 상태는 이미 데이터베이스에 저장되어 있는 엔티티를 다시 조회하면서 영속성 컨텍스트에서 분리된 상태이거나, 영속 상태의 엔티티를 영속성 컨텍스트에서 분리한 상태를 의미합니다.

삭제 상태(Removed)는 엔티티를 삭제한 상태를 의미합니다. 즉, JPA가 해당 객체를 데이터베이스에서 삭제했다는 것을 의미합니다. 삭제 상태의 엔티티는 영속성 컨텍스트에서 분리된 상태이므로, 데이터베이스와의 연관성을 가지지 않습니다. 따라서, 삭제 상태의 엔티티를 다시 조회하면 해당 엔티티가 존재하지 않는 것으로 처리됩니다.

예제 코드 :

//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);

//객체를 삭제한 상태(삭제)
em.remove(member);

영속성 컨텍스트의 이점

영속성 컨텍스트를 이용하면 다음의 이점을 가질 수 있습니다.

  • 1차 캐시
  • 동일성(identity) 보장
  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
  • 변경 감지(Dirty Checking)
  • 지연 로딩(Lazy Loading)
profile
초코칩처럼 달콤한 코드를 짜자

0개의 댓글