영속성 관리(1)

2023. 12. 28. 01:20spring/JPA

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

데이터베이스를 하나만 사용하는 애플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성한다(비용이 비쌈)

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

 

Persistence.createEntityManagerFactory("hello")를 호출하면 META-INF/persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory를 생성한다.

<?xml version="1.0" encoding="UTF-8" ?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
        <properties>

            <!--필수-->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>

            <!--옵션-->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            <property name="hibernate.jdbc.batch_size" value="10"/>
        </properties>
    </persistence-unit>
</persistence>

 

엔티티 매니저 팩토리가 생성된 후 필요할 때마다 엔티티 매니저를 생성하면 된다.(비용이 거의 안 든다)

EntityManager entityManager = emf.createEntityManager();

 

주의* 엔티티 매니저 팩토리는 스레드 안전하지만 엔티티 매니저는 스레드 안전하지 않다.

 

일반적인 웹 애플리케이션

 

그림을 보면 하나의 EntityManagerFactory에서 다수의 엔티티 매니저를 생성했다. EntityManager!은 아직 데이터베이스 커넥션을 사용하지 않는데, 엔티티 매니저는 데이터베이스 연결이 꼭 필요한 시점까지 커넥션을 얻지 않는다. EntityManager2는 커넥션을 사용중인데 보통 트랜잭션을 시작할 때 커넥션을 획득한다.

 

 

2. 영속성 컨텍스트란?

엔티티를 영구 저장하는 환경이라는 의미다. 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

entityManager.persist(member);

 

영속성 컨텍스트는 논리적인 개념에 가깝고 눈에 보이지 않는다. 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어진다. 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리할 수 있다.

 

 

3. 엔티티의 생명주기

엔티티는 4가지 상태가 존재한다.

 - 비영속 : 영속성 컨텍스트와 관계가 없는 상태

Member member = new Member();
member.setId(6L);
member.setName("Hello");

 

 - 영속 : 영속성 컨텍스트에 저장된 상태

entityManager.persist(member);
Member findMember = entityManager.find(Member.class, 6L)

 

 - 준영속 : 영속선 컨텍스트에 저장되었다가 분리된 상태

entityManager.detach(member);

 

 - 삭제 : 삭제된 상태

entityManager.remove(member);

'spring > JPA' 카테고리의 다른 글

고급매핑 - 상속 관계 매핑  (0) 2024.01.15
연관관계 매핑(2) - 단방향, 양방향  (0) 2024.01.04
엔티티 매핑(2) - 컬럼 매핑  (0) 2024.01.03
엔티티 매핑(1) - 엔티티, 기본 키 매핑  (1) 2023.12.29
영속성 관리(2)  (0) 2023.12.28