JPA

JPA 준비

lby132 2022. 10. 14. 23:10

라이브러리 추가

<dependencies>
    <!-- JPA 하이버네이트 -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.3.10.Final</version>
    </dependency>
    <!-- H2 데이터베이스 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.199</version>
    </dependency>

</dependencies>

DB는 H2를 사용

 

JPA설정파일인 persistence.xml을 만들어준다.

경로는  resource/META-INF/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/~/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.hbm2ddl.auto" value="create" />-->
        </properties>
    </persistence-unit>
</persistence>

property속성에 보면 dialect가 있는데 이건 데이터베이스 방언이라는 것으로 각 db마다 제공하는 sql문법과 함수가 조금씩 다르기 때문에 사용할 db를 value로 지정해주면 거기에 맞게 지원이 된다. 참고로 하이버네이트는 40가지 이상 db방언을 지원해 준다고 한다.

다음은 구동 방식이다.

위에서 설정해준 persistence.xml을 읽어와서 Persistence로 EntityManagerFactory를 생성한다.

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

createEntityManagerFactory안에 hello 는 persistence.xml에 보면 내가 지정한 persistence-unit name 이다.

그리고 

EntityManager em = emf.createEntityManager();

EntityManager를 생성해준다.

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

try {

    final Member findMember = em.find(Member.class, 1L);
    findMember.setName("HelloJPA");

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

emf.close();

EntityManager로 transaction을 얻어와서 트랜잭션을 실행 시켜준다.

엔티티매니저 팩토리는 어플리케이션이 실행될때 db당 하나만 생성해서 어플리케이션 전체에 공유한다.

엔티티매니저는 고객이 요청이 올때마다 계속 썻다가 close를 해주는 반복을 한다.

엔티티매니저는 항상 사용하고 버려야한다. 만약 엔티티매니저를 하나 생성하고 여러 스레드에서 같이 쓰게 되면 장애 발생.

JPA의 모든 데이터변경은 트랜잭션 안에서 실행해야한다.

 

Member클래스 파일.

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity	// JPA가 이 객체를 사용해야겠다는걸 인식함
public class Member {

    @Id	// JPA에게 primary key를 알려줘야함
    private Long id;
    private String name;

 

'JPA' 카테고리의 다른 글

Embedded Type  (0) 2022.10.19
테이블 전략  (0) 2022.10.18
mappedBy  (0) 2022.10.18
IDENTITY전략  (0) 2022.10.17
영속 컨텍스트  (1) 2022.10.15