[JPA] 영속성 컨텍스트(Persistence Context) 들어가기 전에

시나브로·2021년 5월 2일
0

JPA

목록 보기
2/12
post-thumbnail

들어가기 전에

  • 영속성 컨텍스트를 보기 전 알아야할 개념들이 있다.

  • 위의 이미지를 보면 알다시피, 그동안 conn을 직접 관리하던 것을 EntityManager가 대신 해주는 것을 알 수 있다.

  • 이 EntityManager는 EntityManagerFactory에서 생성을 해주며, 사용자는 생성된 EntityManager를 통해 db에 접근을 할 수 있다.

  • 전반적인 흐름은 위와 같다.


1. EntityManagerFactory


- application loading 시점에 DB 당 딱 하나만 생성되어야 한다 - WAS 가 종료되는 시점에 EntityManagerFactory 를 닫는다. 그래야 내부적으로 Connection pooling 에 대한 Resource 가 Release 된다.

ex) persistence.xml
<persistence-unit name="hello">
        <properties>
            <!-- 필수 속성 -->
            <property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="wcp_admin"/>
            <property name="javax.persistence.jdbc.password" value="1234"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/wcp?serverTimezone=UTC"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>

위의 persistence-unit의 name기반으로 EntityManagerFactory 생성이 가능하다
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");

2. EntityManager


  • EntityManagerFactory를 통해 생성이 가능하다.
   EntityManager entityManager = entityManagerFactory.createEntityManager();

  • JPA는 스레드가 하나 생성될 때 마다(Transaction 단위를 수행할 때마다) EntityManagerFactory에서 EntityManager를 생성한다.

  • EntityManager는 내부적으로 DB 커넥션 풀을 사용해서 DB에 붙는다.

  • Transaction 수행 후에는 내부적으로 DB Connection 을 반환하기 위해 반드시 EntityManager 를 닫는다.

    entityManager.close();

3. EntityTransaction


  • Data 를 변경하는 모든 작업은 반드시 Transaction 안에서 이루어져야 한다.

  • EntityManager를 통해 EntityTransaction를 관리할 수 있다.

    EntityTransaction tx = entityManager.getTransaction();
  • tx.begin(); : Transaction 시작
  • tx.commit(); : Transaction 수행
  • tx.rollback(); : 작업에 문제가 생겼을 시



4. 영속성 컨텍스트란?


엔티티를 영구 저장하는 환경

  • 위의 EntityManager를 사용해 Entity를 변경한다해서 바로 DB에 data가 적재되는 것은 아니다.

  • commit()를 하기 전 즉, 하나의 Transaction 사이에서 실행되는 Entity 정보들은 이 영속성 컨텍스트(Persistence Context)라는 곳에 먼저 저장된다.

  • 스프링에서 EntityManager를 주입받아서 사용하면, 같은 트랜잭션의 범위 내에 있는 EntityManager는 동일 영속성 컨텍스트에 접근한다.














출처 및 참고

profile
Be More!

0개의 댓글