JPA 와 H2 데이터베이스 간 연결
"인프런 - 자바 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
위의 링크를 타고 들어가면 아래와 같은 웹 페이지가 나타난다.
위의 페이지에서 본인 컴퓨터의 운영체제가 Windows 일 경우 Windows Installer 를, MAC 일 경우 All Platform 을 클릭하여 H2 데이터베이스를 설치해준다.
설치가 끝난 경우 H2 console 을 실행시킨 후 아래의 그림에서 연결 버튼을 클릭해 데이터베이스가 정상적으로 잘 연결되는지 확인해준다.
이후 Spring project 에서 resource 폴더 아래에 META-INF 디렉토리를 만든 후, 해당 디렉토리에 persistence.xml 파일을 생성한다.
이 파일의 위치는 항상 고정되어 있어야 한다.
이제 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 를 활용한 프로그래밍을 해보자.