본문 바로가기
Backend/JPA 프로그래밍

[JPA] maven으로 순수 JPA 프로젝트 생성하기

by 지금갑시다 2024. 1. 9.

 

maven을 이용한 순수 JPA 초기 설정하는 법을 알아보자!

 

여기서의 순수 JPA란 SpringBoot와 같은 프레임워크가 프로젝트에 추가되지 않고, maven의 설정JPA의 동작만으로 로컬 데이터베이스와 상호작용함을 의미한다

 

 

1. 인텔리제이에서 maven을 이용해 프로젝트를 생성하고 pom.xml 파일을 확인!

 

pom.xml 파일에는

1. maven의 버전

2. 프로젝트 초기 생성시에 입력한 groupId, artifactId

3. 프로젝트의 dependency들을 입력할 수 있다.

 

해당 프로젝트에서는 h2database를 사용하기에, 데이터베이스 dependency를 h2로 주었다. 만약 다른 DB서버를 이용한다면 해당 DB에 대한 디펜던시를 추가해주면 된다.

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>jpa</groupId>
    <artifactId>jpa-programming</artifactId>
    <version>1.0.0</version>

    <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>2.2.224</version>
        </dependency>
    </dependencies>
</project>

 

 

2. src/main/resources/META-INF/persistence.xml 생성!

 

위의 절대경로에 presistence.xml 파일을 만들어준다.

이 파일의 역할은 추후 JPA가 사용할 EntityManagerFactory의 구현체 설정 역할을 하게 된다.

 

해당 파일에는

1. EntityManagerFactory를 구현할때 필요한 식별자인 persistence-unit name

2. database의 연결 설정 정보인 프로퍼티

3. database의 종류에 의존적으로 sql의 문법이 바뀌기 때문에 필요한, hibernate.dialect

4. 추가 hibernate의 동작을 커스텀 할 수 있는 설정등이 가능하다. 

 

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

    <!-- EntityManagerFactory에서 인식할 이름 -->             
    <persistence-unit name="hello">
        <properties>
            <!-- 필수 속성 -->
            
            <!-- javax.** 다른 jpa 구현 라이브러리를 써도 동일-->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/> db 설정시 설정한 id
            <property name="javax.persistence.jdbc.password" value="1234"/> db 설정시 설정한 password
            h2 localhost로 db를 올리기 때문에 url은 localhost로 설정, 만약 db서버가 있다면, db서버 endpoint로 설정한다.
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/jpaprogramming"/> 
            
            <!-- jpa는 특정 db에 종속적이지 않음, 설정 db에 맞게 jpa한테 알아서 하라고 날림-->
            <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>

 

 

이 두가지 설정이 완료되었다면, 끝!

 

이제 Main으로 이동해 maven 설정과 JPA가 제대로 동작하는지 확인하자

 

1. EntityManagerFactory를 생성해준다.

2. EntityManagerFactory에서 EntityManager를 만든다.

3. EntityManager로 Trasaction을 실행, 데이터를 변경, Transaction 커밋

 

과 같은 과정으로 SpringBoot와 같은 프레임워크 없이 순수 JPA의 동작만으로 데이터를 저장하고 변경 및 제거를 할 수 있게 된다.

 

public class JpaMain {

    public static void main(String[] args) {
        // 1. persistence.xml에서 만든 식별자 이름으로 EntityManagerFactory 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        
	// 2. emf에서 EntityManager를 생성
        EntityManager em = emf.createEntityManager();

	// 3. em에서 트랜잭션 얻음
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        
        // 데이터 변경 코드~~~~
        
        // 3. 트랜잭션 커밋
        tx.commit();
        em.close();
        emf.close();
        
        }       
}

 

 

 

추가로 "// 데이터 변경 코드~~~" 의 정석 코드는 트랜잭션 안에서 실행되다가 오류가 난다면, 롤백을 해주어야 하기 때문에 아래와 같이 작성해주어야 한다.

try {
    데이터 변경 코드 
    em.persist();

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

 

 

끘!!!

 

 

출처: https://www.inflearn.com/course/ORM-JPA-Basic/dashboard