파게로그

[실습] JPA in Maven project 본문

콤퓨타 왕기초/JPA

[실습] JPA in Maven project

파게 2021. 5. 27. 13:27

Spring 프레임워크 없이, 기본적인 Maven project에서 JPA를 사용해보자.

 

pom.xml

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.4.32.Final</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
</dependencies>

 

 

Maven dependencies에 Hibernate를 추가하면, JPA 또한 자동으로 추가된다.

한편 resources 아래에 META-INF라는 디렉터리를 생성하고, persistence.xml에 다음과 같은 내용을 추가한다. 다만 Spring Boot를 사용하면 프레임워크 내부에서 동작하므로 작성할 필요는 없다.

 

persistence.xml

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">

    <persistence-unit name="hello">
        <properties>

            <!-- 필수 속성 -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.user" value="berry"/>
            <property name="javax.persistence.jdbc.password" value="straw"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/jpa-practice-schema"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

            <!-- 옵션 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>

        </properties>

    </persistence-unit>
</persistence>

 

entity가 될 클래스를 만들고 다음과 같이 클래스를 작성한다.

 

package helloJpa.entity;

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

@Entity
public class Member {

    @Id
    private long id;
    private String name;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

 

@Id는 PK에 달아주어야 한다. 그리고 JPA는 기본적으로 getter, setter와 constructor를 통해 동작하므로 모두 필요하다(라고 말씀하셨는데 constructor는 생성하지 않았다...)

 

다음과 같은 코드를 통해 JPA를 느껴본다. 놀랍다...

 

package helloJpa;

import helloJpa.entity.Member;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class Main {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        // 파라미터는 persistence.xml의 persistence-unit 값으로서 해당 설정을 이용하겠다는 것이다.
        // EMF는 서버가 가동될 때 딱 한 번 생성하여 애플리케이션 전체에서 공유해야 한다.

        EntityManager em = emf.createEntityManager();
        // 실제로는 비즈니스 로직의 요청이 있을 때마다 EntityManager를 생성한다.
        // EM은 쓰레드 간에 공유하면 안 된다. 사용한 후 바로 버려야 한다.

        EntityTransaction tx = em.getTransaction();
        // JPA에서 모든 데이터 변경은 트랜잭션 내에서 실행한다.
        
        tx.begin();

        try {
            Member member = new Member();
            member.setId(100L);
            member.setName("스폰지밥");

            em.persist(member);

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

        emf.close();
        // 사실상 어플리케이션의 종료를 의미한다.
    }
}

 

'콤퓨타 왕기초 > JPA' 카테고리의 다른 글

JPA 내부 구조  (0) 2021.06.02
연관관계 매핑  (0) 2021.05.28
실습 3 (Mapping annotations)  (0) 2021.05.27
[실습] Mapping to DDL  (0) 2021.05.27
Why JPA?  (0) 2021.05.26
Comments