둘셋 개발!

[JPA 기본편] Jpa 구동방식 본문

JPA

[JPA 기본편] Jpa 구동방식

23 2022. 3. 26. 01:58

전체적으로 다음그림과 같이 Jpa가 동작한다

1.  설정 정보 조회

✔️Persistence라는 클래스가 persistence.xml에 있는 설정정보를 조회한다

다음은 persistence.xml 예시이다

<?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/~/jpashop2"/>
            <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"/> <!--sql을 한번에 db에 넣음-->
            <!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
        </properties>
    </persistence-unit>
</persistence>

➡️ 데이터베이스에 연결하기 위한 설정이 바로 여기에 있다

➡️ 특정 데이터베이스만의 고유한 기능을 jpa 에서는 방언이라고 하는데 방언을 여기서 지정해준다.  즉, jpa는 특정 데이터베이스에 종속적이지 않는다.

 

 


2.  EntityManagerFactory 생성

✔️persistence.xml의 설정정보를 조회하고 이를 토대로 엔티티매니저 팩토리(emf 라고 줄여서 쓰겠다..)를 생성한다.

✔️emf는 딱 하나만 생성해서 애플리케이션 전체에서 공유한다

    - persistence.xml 설정정보를 읽어서 jpa를 동작시키기 위한 기반 객체를 만들고 jpa 구현체에 따라서 데이터베이스 커넥션 풀도 생성하기 때문에 emf 생성비용이 크다. 그래서 딱 하나를 만들고 전체가 공유해야한다..!!

 

다음은 emf 생성 예시 코드이다

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

➡️ "hello"는 persistence.xml 설정정보에 있는 영속성 유닛이름이다

 


3. EntityManager 생성

✔️emf 에서 entitymanager을 생성한다

✔️엔티티매니저가 대부분의 jpa 기능을 제공하는데, 대표적으로 엔티티 crud를 할 수 있다

 

✔️엔티티 매니저는 데이터 커넥션을 유지하면서 데이터베이스와 통신한다.

그래서 쓰레드간에 공유하거나 재사용 하면 안된다

 


+ 트랜잭션 관리

우선 트랜잭션이란 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.
출처:https://mommoo.tistory.com/62[개발자로 홀로 서기]

 

✔️jpa를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다

 

다음은 트랜잭션을 사용하는 예시이다

EntityTransaction tx = em.getTransaction();
tx.begin();

//비지니스 로직 실행

tx.commit();

➡️ 트랜젝션을 시작하려면 엔티티매니저에서 트랜잭션 API를 받아와야 한다

 

 

(참고: 인프런 김영한 강사님 - 자바 ORM 표준 JPA 프로그래밍 - 기본편, 강의와 책)