[Java] 45. JPA 설정하는 방법


Study/Java  2021. 6. 11. 07:58

안녕하세요. 명월입니다.

 

이 글은 JPA 설정하는 방법에 대한 글입니다.

 

Java 프로그램 중에서 데이터 베이스와 연결관리 해주는 프레임워크가 있습니다.이 프레임워크를 우리는 ORM(Object-relational mapping)이라고 합니다.

예전, ORM 프레임워크가 없었을 때(?), 사용 빈도가 낮았을 때는 프로그램에서 직접 SQL Connection을 만들어서 소스에 직접 sql query를 작성해서 데이터 베이스로 부터 데이터를 취득했었습니다.

이럴 때, 여러 문제점이 있는데 만약 데이터 베이스 테이블이 변경이 되었을 경우, Sql query가 String 형식으로 만들었기 때문에 프로그램에서 컴파일 에러가 나오지 않습니다. 그래서 각 sql 수정을 하여야 했었는데 큰 프로젝트라고 생각하면 수정하는데 꽤나 힘들었습니다.

또 String으로 작성한 것이라, 혹시라도 수정을 놓치면 디버그로 에러를 잡히는 것이 아니라 실행 중에 에러가 발생합니다.

또 다른 문제점은 Reference의 관리입니다. Sql 쿼리문 상에서 join을 해서 결과에 맞게 Entity 클래스를 만들게 되면, Join의 상황에 따라 클래스가 많이 생성이 되게 됩니다. 그러면 클래스를 관리하기가 매우 어려워 집니다.

 

개인적인 생각으로는 이 두가지의 문제점을 해결하고 Database의 트리 구조의 데이터를 Class형식의 연결리스트의 형식으로 변환하여주는 프레임워크가 ORM입니다.

 

Java에서 ORM의 종류는 많습니다. Hibernate가 있고 Doma의 seasor도 있습니다. 한국에서는 예전에 ibatis의 프레임워크를 많이 사용했습니다.

저도 언제부터인가 잘 모르겠으나 Java 진영에서 JPA(Java Persistence API)를 표준 ORM을 지정이 되었고, 최근 Java IDE 툴인 eclipse에서 JPA 프레임워크를 다루기 쉽게 지원하고 있습니다.

요즘에는 이런 분위기라 JPA로 ORM을 선택해서 사용하는 거의 표준으로 사용합니다.

 

JPA를 사용하기 위해서는 maven으로 라이브러리를 연결해야 합니다.

 

먼저 pom.xml에 두개의 라이브러리를 연결합니다.

<!-- https://mvnrepository.com/artifact/org.eclipse.persistence/org.eclipse.persistence.jpa -->
<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>org.eclipse.persistence.jpa</artifactId>
  <version>2.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.41</version>
</dependency>

첫번째 dependency는 JPA 라이브러리이고, 두번째 dependency는 mysql-connector입니다. 저의 경우는 mariaDB(mysql)로 연결할 생각이기 때문에 mysql-connector를 연결했지만, 다른 종류의 DB를 사용하려면 이 connector 라이브러리를 해당 디비의 라이브러리로 바꾸면 됩니다.

 

project에서 jpa project로 변환하겠습니다.

이제 Platform과 connection 설정을 합니다.

그리고 add connection 링크를 눌러 eclipse에 db 커넥션을 설정해야 합니다. 이전에 eclipse로 mariaDB(mysql)를 접속한 적이 없으면 설정해야 합니다.

connector의 경우는 maven으로 update를 해서 라이브러리를 다운로드 받았으면 maven repository 디렉토리에 jar 파일이 있습니다.

따로 maven 경로 설정을 하지 않았으면, 보통은 c:\(원도우 유저 경로)\.m2\repository\mysql\mysql-connector-java\5.1.41에 있습니다.

커넥션 연결이 끝났으면 Platform을 Eclipse 2.5.x로 설정하고 type을 Disable Library Configuration으로 설정합니다.

그리고 연결 확인을 한 후에 Finish 버튼을 누르면 src\META-INF\persistence.xml가 생성됩니다.

 

Java 프로젝트에서 데이터 베이스를 연결하고 사용하기 위해서 데이터 베이스에 우선 테이블을 만들고 연결하겠습니다.

-- test 데이터 베이스에 접속
use test;
-- 이전 테이블이 있다면 일단 삭제
-- drop table info;
-- drop table user;
-- user 테이블 생성
create table user(
  id varchar(255) not null,
  name nvarchar(255) not null,
  
  primary key(id) -- 키 설정
);
-- info 테이블 생성
create table info(
  idx int not null auto_increment, -- 자동 증가
  id varchar(255) not null,
  age int not null,
  
  primary key(idx), -- 키 설정
  foreign key(id) references user(id) -- id는 user의 id로 연결
);

다시 persistence.xml로 돌아와서 여기에 connection 정보를 입력합니다.

<?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="JpaExample">
    <properties>
      <!-- 캐쉬 기능. 이게 true가 되어 있으면 이 프로젝틀르 통하지 않는 query는 반영이 늦을 수 있음 -->
      <property name="eclipselink.query-results-cache" value="false" />
      <!-- 데이터 베이스 연결 상의 로그 레벨 설정 -->
      <property name="eclipselink.logging.level" value="INFO" />
      <property name="eclipselink.logging.parameters" value="true" />
      <!-- driver 패키지 설정 -->
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
      <!-- database 설정 -->
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" />
      <!-- 접속 id -->
      <property name="javax.persistence.jdbc.user" value="id" />
      <!-- 접속 password -->
      <property name="javax.persistence.jdbc.password" value="password" />
    </properties>
  </persistence-unit>
</persistence>

persistence.xml 설정이 되었으면 이제 entity class를 만듭니다.

entity class란 테이블의 데이터를 담기 위한 데이터 클래스입니다.

데이터 베이스의 테이블이 class로 만들어 졌습니다. 이제는 실제 데이터 베이스에서 데이터를 가져오겠습니다.

-- user 테이블에 데이터를 삽입
insert into user (id, name) values('nowonbun', 'Hello');
-- info 테이블에 데이터를 삽입
insert into info(id, age) values('nowonbun', 20);
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import model.User;
import model.Info;
// 실행 함수가 있는 클래스
public class Main {
  // 실행 함수
  public static void main(String... args) {
    // FactoryManager를 생성합니다. "JpaExample"은 persistence.xml에 쓰여 있는 이름이다.
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("JpaExample");
    try {
      // Manager를 생성한다.
      EntityManager em = emf.createEntityManager();
      try {
        // User 테이블에서 nowonbun의 아이디를 가져온다.
        User user = em.find(User.class, "nowonbun");
        // 콘솔 출력
        System.out.println(user.getName());
        // User테이블에 연결되어 있는 Info테이블의 데이터를 가져온다.
        List infos = user.getInfos();
        for (Info info : infos) {
          // 콘솔 출력
          System.out.println(info.getAge());
        }
      } finally {
        // Manager를 닫는다.
        em.close();
      }
    } finally {
      // FactoryManager를 닫는다.
      emf.close();
    }
  }
}

여기까지 기본 JPA 설정을 완료하고 데이터 베이스로부터 데이터를 취득하고 콘솔에 출력하는 것까지 확인했습니다.

 

여기까지 기본 JPA 설정은 완료되었는데, 실제 프로젝트에서 사용하려면 여러가지 설정이 더 필요합니다. 구체적인 설정하는 방법은 다음 글에서 설명하겠습니다.

 

여기까지 JPA 설정하는 방법에 대한 글이였습니다.

 

궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.