[JPA] JPA? JPA 세팅 및 시작하기

 

 

기존에 MyBatis 방식만을 사용하다가 ORM(Object-Relation Mapping)기반인 JPA(Java Persistence Interface) 프로그래밍에 관심이 생겨서 알아보게 되었다.

 

자바 퍼시스턴스 API또는 자바 지속성 API(Java Persistence API, JPA)는 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.

기존에 EJB에서 제공되던 엔터티 빈(Entity Bean)을 대체하는 기술이다. 자바 퍼시스턴스 API는 JSR 220에서 정의된 EJB 3.0 스펙의 일부로 정의가 되어 있지만 EJB 컨테이너에 의존하지 않으며 EJB, 웹 모듈 및 Java SE 클라이언트에서 모두 사용이 가능하다. 또한, 사용자가 원하는 퍼시스턴스 프로바이더 구현체를 선택해서 사용할 수 있다.

 

 

MyBatis과 JPA의 특징

-MyBatis

  • 동적인 쿼리를 사용하기 유연하다.
  • 새로운 패러다임(ex. JPA) 없이 Sql을 그대로 이용할 수 있다.
  • 프로그래밍 코드와 sql을 분리하여 작업 할 수 있다.

-JPA

  • CRUD 시 반복적인 Sql쿼리 사용을 줄여준다
  • 테이블을 엔티티로 관리하여 객체지향적으로 데이터를 관리할 수 있다.
  • 스키마 변경 시 엔티티 변경만으로 관련 테이블쿼리 변경이 가능하다.
  • 동일한 트랜잭션에서 엔티티의 동일성을 보장한다.

 

추후에는 Spring Data JPA 를 쓰겠지만 JPA의 고유의 특징들을 알기위해 기본적인 설정부터 했다.

 

	<!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.29.Final</version>
        </dependency>
        
	<!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.200</version>
        </dependency>

프로젝트의 의존성 추가를 위해 pom.xml에 위 항목을 추가한다. 테스트를 위한 데이터베이스로 H2 데이터베이스를 사용했다. 프로젝트나 사용하려는 데이터베이스를 맞게 설정하면 된다.

 

 

<?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="xxx">
        <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>

'src - main - resources - META-INF - persistence.xml'

위의 경로에 해당 xml파일을 생성하고 <persistence-unit name="xxx"> 태그에 이름을 등록한다. 해당 태그에 들어갈 이름은 추후에 EntityManagerFactory을 생성 시에 매핑될 이름이다.

 

 

import javax.persistence.EntityManagerFactory;

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

        EntityManager em = emf.createEntityManager();

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

        try {
        
        	// 실행할 코드 //

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

 

 

-EntityManagerFactory

  • 데이터베이스와의 커넥션 등과 같은 역할을 하며 보통 하나만 생성하여 애플리케이션 전체에서 공유하며 사용한다. 그리고 persistence.xml에서 지정한 name을 통해 연결한다.

 

-EntityManager

  • 특정 작업을 위해 단위별로 데이터베이스에 접근하는 것을 관리한다. EntityManagerFactory의 경우는 Thread-Safe하지만 EntityManager는 쓰레드간의 공유하면 안되며 사용하고 버려야한다.

 

-EntityTransaction

  • JPA의 모든 데이터 변경은 트랜잭션 안에서 수행되어야 한다. 데이터의 변경이 발생했을 때, 문제 없이 성공했다면 commit을 하고 반대로 문제가 발생 했을 시 rollback을 실행한다.

 

+ Recent posts