Maven 입문 | 데이터베이스의 이용 | JPA를 사용하는 프로그램

JPA를 사용하는 프로그램을 만드는 방법을 설명한다.

persistence.xm 준비

JPA를 사용하는 경우, persistence.xml이라는 파일을 준비해야 한다. 이것은 JPA에서 사용하는 퍼시스턴스 유닛을 정의하는 것이다.

main 폴더에 resources 폴더를 작성한다. 이것은 앞에서 언급한 바와 같이, 리소스 폴더로 등록한 것이다. 이 폴더에 “META-INF"라는 폴더를 만든다. 그리고 그 안에 “persistence.xml ‘라는 이름으로 파일을 준비한다.

아래에 persistence.xml 소스 코드를 올려 두었다.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
    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_1.xsd">
 
    <persistence-unit name="sample-persistance" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.devkuma.MyEntity</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:db" />
            <property name="javax.persistence.jdbc.user" value="sa" />
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
            <property name="eclipselink.ddl-generation.output-mode" value="database" />
        </properties>
    </persistence-unit>
</persistence>

persistence.xml은 <persistence> 태그 안에 <persistence-unit>라는 태그를 준비하고, 거기에 퍼시스턴스 유닛의 정보를 작성한다. 여기에서는 다음과 같은 정보가 정리되어 있다.

  • 유닛 이름 : sample-persistance
  • 공급자 : org.eclipse.persistence.jpa.PersistenceProvider
  • 엔티티 클래스 : com.devkuma.MyEntity
  • 속성 :
    • javax.persistence.jdbc.driver (드라이버 클래스) : org.h2.Driver
    • javax.persistence.jdbc.url (데이터베이스 URL) : jdbc : h2 : mem : db
    • javax.persistence.jdbc.user (사용자 이름) : sa
    • eclipselink.ddl-generation (Eclipse Link 설정) : drop-and-create-tables
    • eclipselink.ddl-generation.output-mode (Eclipse Link 설정) : database

이들은 마지막 2개(Eclipse Link 설정) 이외는 JPA를 사용할 때 대부분은 필요한 정보이다. 이 중에는 특히 처음에 있는 유닛 이름, 프로바이더 클래스, 엔터티 클래스의 세 가지 필수 항목으로 반드시 준비한다.

<properties> 태그 안에 있는 속성의 값은 사용하는 데이터베이스에 따라 달라진다. 이 드라이버와 URL, 사용자 이름은 우선 대부분의 데이터베이스에 필요한 것이다. H2 이외의 데이터베이스의 설정은 여기에서 다루지 않는다. 별도 학습하길 바란다.

엔티티 클래스 생성

persistence.xml이 준비되면 다음에 필요한 것은 “엔티티 클래스"이다. 엔티티 클래스는 JPA에서 데이터베이스에 액세스할 때 기본이 되는 것이다. JPA에는 데이터베이스 테이블의 내용을 엔티티 클래스로서 정의해야 레코드를 주고 받을 때는 이 엔티티 클래스의 인스턴스로 처리하게 된다.

앞에서 persistence.xml에서 클래스로 com.devkuma.MyEntity 값을 설정했다. 이것이 sample-persistance 지속성 단위로 사용하는 엔티티 클래스이다. 이 클래스를 만들어 보자.

src/main/java/com/devkuma/ 폴더 안에 “MyEntity.java"라는 이름으로 파일을 작성한다. 그리고 아래와 같이 소스 코드를 작성하자.

package com.devkuma;
 
import java.util.Date;
import java.util.Calendar;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
 
@Entity
public class MyEntity {
    @Id
    @GeneratedValue
    private Integer id;
 
    private String name;
    private String message;
    private Date date = Calendar.getInstance().getTime();
 
    public MyEntity(){
        super();
    }
 
    public MyEntity(String name, String msg){
        super();
        this.name = name;
        this.message = msg;
    }
 
    public Integer getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String msg) {
        this.message = msg;
    }
    public Date getDate() {
        return date;
    }
 
    @Override
    public String toString() {
        return "{\n\tid: " + id + ",\n\tname: " + name + ",\n\tmessage: "
             + message+ ",\n\tdate: " + date + "\n}";
    }
 
}

엔티티 클래스는 @Entity 어노테이션을 붙인 POJO 클래스이다. Primary key가 되는 필드에는 @Id를 분여, 더불어 @GeneratedValue으로 값을 자동 할당하는 것을 나타낸다.

이 후에는 private 필드와 그 Setter/Getter 메소드의 형태로 저장하는 값을 준비하고 있다. 이것들은 테이블에 포함하는 항목에 해당하는 것이다. 이번에는 id, name, message, date 등 항목을 준비해 두었다.

MyEntity를 이용하기

이제 H2 + JPA에서 데이터베이스를 사용하는 환경이 되었다. 실제로 이용해 보자.

아래에 간단한 샘플을 올려 두었다. App.java을 편집한다.

package com.devkuma;
 
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
 
public class App {
    private static EntityManagerFactory factory
        = Persistence.createEntityManagerFactory("sample-persistance");
 
    public static void main( String[] args ){
        EntityManager manager = factory.createEntityManager();
        try {
            manager.getTransaction().begin();
            manager.persist(new MyEntity("sungjin", "This is sample message!"));
            manager.persist(new MyEntity("wonsuk", "안녕하세요!"));
            manager.persist(new MyEntity("byeongho", "이것을 테스트입니다."));
            manager.getTransaction().commit();
 
            Query query = manager.createQuery("select i from MyEntity i");
            List<MyEntity> list = query.getResultList();
            int count = 0;
            for (MyEntity p : list) {
                System.out.print("No," + ++count + " ");
                System.out.println(p);
            }
            System.out.println(" -- total: " + list.size() + " data.");
        } finally {
            manager.close();
        }
    }
}

소스가 변경되면,

mvn packge
mvn exec:java

이와 같이 실행하여 패키지와 프로그램의 실행을 한다. 실행하면 콘솔에 다음과 같은 텍스트가 출력된다.

No, 1 {
        id : 1
        name : sungjin,
        message : This is sample message !,
        date : Fri Oct 13 21:28:11 JST 2017
}
No, 2 {
        id : 2
        name : wonsuk,
        message : 안녕하세요!,
        date : Fri Oct 13 21:28:11 JST 2017
}
No, 3 {
        id : 3
        name : byeongho,
        message : 이것을 테스트입니다. ,
        date : Fri Oct 13 21:28:11 JST 2017
}
 - total : 3 data.

여기에서는 더미로 3개의 엔티티를 생성하여 데이터베이스에 저장하고 다시 데이터베이스에서 MyEntity을 얻어 내용을 출력한다. 우선 데이터의 읽고 쓰기 가능하다는 것은 확인할 수 있다.

여기서는 JPA의 사용법을 설명하기 위한 것이 아니기 때문에 자세한 설명은 생략하지만, 이것으로 “JPA를 사용하는 프로그램"의 기본적인 만드는 방법은 알게 되었다. 우선은 데이터베이스부터 시작하여 조금씩 사용할 수 있는 라이브러리의 폭을 넓혀 가면 된다.