JPA

JPA 와 H2 데이터베이스 간 연결

방구석 대학생 2020. 9. 2. 23:55

"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다."

www.inflearn.com/course/ORM-JPA-Basic#

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그

www.inflearn.com

JPA - DB 간 연결

 

이번엔 JPA 와 인 메모리(in - memory) 기능을 지원하는 H2 DB 를 JPA 설정 파일(persistence.xml) 을 이용하여 연결해보자.

 

우선 H2 데이터베이스를 설치해야 한다.

http://www.h2database.com/html/main.html

 

H2 Database Engine

H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2 MB jar file size     Suppor

www.h2database.com

 

위의 링크를 타고 들어가면 아래와 같은 웹 페이지가 나타난다.

 

H2 설치 홈페이지 화면

 

위의 페이지에서 본인 컴퓨터의 운영체제가 Windows 일 경우 Windows Installer 를, MAC 일 경우 All Platform 을 클릭하여 H2 데이터베이스를 설치해준다.

 

설치가 끝난 경우 H2 console 을 실행시킨 후 아래의 그림에서 연결 버튼을 클릭해 데이터베이스가 정상적으로 잘 연결되는지 확인해준다.

H2 console 창 화면

 

H2 DB 연결 성공

 

이후 Spring project 에서 resource 폴더 아래에 META-INF 디렉토리를 만든 후, 해당 디렉토리에 persistence.xml 파일을 생성한다.

이 파일의 위치는 항상 고정되어 있어야 한다.

 

JPA 설정파일 위치

 

이제 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="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"/>


            <!-- 옵션 -->
            <!-- 콘솔에 하이버네이트가 실행하는 SQL문 출력 -->
            <property name="hibernate.show_sql" value="true"/>
            <!-- SQL 출력 시 보기 쉽게 정렬 -->
            <property name="hibernate.format_sql" value="true"/>
            <!-- 쿼리 출력 시 주석(comments)도 함께 출력 -->
            <property name="hibernate.use_sql_comments" value="true"/>

        </properties>
    </persistence-unit>
</persistence>

 

위의 소스코드에서 필수 속성들을 한번 살펴보자.

 

** persistence-unit name 속성은 추후에 JPA 구동방식 관련 글에서 EntityManagerFactory 클래스의 객체를 생성할 때 JPA 설정 파일 persistence.xml 파일을 참조하기 위해 선언해놓은 이름이다.

 

필수 속성들 중에서 javax 로 시작하는 속성들을 보면 어떤 데이터베이스의 드라이버를 사용하는지, 그리고 사용자의 이름은 무엇이며, 패스워드는 무엇인지 표기해주고 있다.

 

그 아래를 보면 url 을 표시하는 속성이 있는데 해당 속성에서 value 값에 있는 url 주소와 h2 console 창에 나와있는 

JDBC URL 값이 같아야 JPA 와 H2 데이터베이스를 연결시켜 줄 수 있다.

 

- persistence.xml 파일 jdbc.url 속성

  ->  "jdbc:h2:tcp//localhost/~/test"

- h2 console 에서 JDBC URL 값

  -> jdbc:h2:tcp//localhost/~/test

 

여기서 한 가지 참고할 점은, 위의 필수 속성에서 javax 로 시작하는 속성들은 hibernate 가 아닌, 다른 JPA 를 구현하는 라이브러리를 사용해도 똑같이 적용될 수 있다.

그러나 가장 아래에 hibernate 로 시작하는 속성은 hibernate 전용 옵션이므로, 다른 라이브러리를 사용할 경우 그에 맞게 속성 값을 바꿔주어야 한다.

 

또한 필수 속성 가장 아래의 hibernate 속성은 hibernate.dialect 로 표시되어 있는데

여기서 dialect 를 직역하면 "방언" 이라는 뜻으로 hibernate 에서만 사용되는 방언을 활용한다는 뜻의 속성이다.

 - 방언 : SQL 표준을 지키지 않는 특정 데이터베이스 만의 고유한 기능

 

즉, 방언이란 각각의 데이터베이스가 제공하는 SQL 문법과 함수들의 고유한 키워드를 말한다.

- 가변 문자

  -> MySQL : VARCHAR

  -> Oracle : VARCHAR2

 

- 문자열을 자르는 함수

  -> SQL 표준 : SUBSTRING()

  -> Oracle : SUBSTR()

 

- 페이징

  -> MySQL : LIMIT

  -> Oracle : ROWNUM

 

위에서 페이징이 무엇인지에 대해서는 다음글에서 정리한다. 

 

추가로 JPA - H2 데이터베이스 간 연결을 위해 아래 그림과 같이 설치한 h2 폴더에 있는 jar 파일을 Project Settings -> Libraries 에 추가해주자.

 

위와 같이 jar 파일을 추가해주지 않을 경우 아래의 에러가 발생하게 된다.(H2 데이터베이스 연결 오류)

Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [org.h2.Driver]
Caused by: java.lang.ClassNotFoundException: Could not load requested class : org.h2.Driver

 

이제 설계한 도메인 클래스의 구조와 맞게 데이터베이스 테이블을 생성해보자.

사용하고자 하는 도메인 클래스의 필드 id, name 으로 총 2개 이며, 그중 id 값을 primary key 값으로 사용한다면 

해당하는 데이터베이스를 만들기 위한 SQL 쿼리는 아래와 같다.

 

create table Member (
	id bigint not null,
    	name varchar(255),
    	primary key(id)
);

 데이터베이스 테이블이 생성되었으니 이제 본격적으로 JPA 를 활용한 프로그래밍을 해보자.