본문 바로가기

Spring/JPA & Hibernate

h2 database 사용하기

반응형

H2 database 다운로드

http://h2database.com/html/download.html

drive 버전 맞춰야

 

pom.xml

<dependencies>         
	<!-- JPA 하이버네이트 -->
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-entitymanager</artifactId>
		<version>5.3.10.Final</version>
	</dependency>         
	<!-- H2 데이터베이스 -->
	<dependency>
		<groupId>com.h2database</groupId>
		<artifactId>h2</artifactId>
		<version>1.4.199</version>
	</dependency>
</dependencies>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
	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_2.xsd">
	<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="1234" />
			<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />                          
			<!-- 옵션 -->
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.use_sql_comments" value="true" />             
			<!--<property name="hibernate.hbm2ddl.auto" value="create" /> -->
		</properties>
	</persistence-unit>
</persistence> 

하이버네이트 properties <참고>

hibernate.dialect 데이터베이스 방언 설정

  • JPA는 특정 데이터베이스에 종속되지 않는다.
    따라서, 애플리케이션의 구성에 맞게 데이터베이스를 설정할 수 있다.
  • 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름 
    가변 문자: MySQL은 VARCHAR, Oracle은 VARCHAR2 
    문자열을 자르는 함수: SQL 표준은 SUBSTRING(), Oracle은 SUBSTR() 
    페이징: MySQL은 LIMIT , Oracle은 ROWNUM
  • 방언: SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능

  • hibernate.dialect 속성에 지정

    하이버네이트는 40가지 이상의 데이터베이스 방언 지원한다.
    • H2 : org.hibernate.dialect.H2Dialect
    • Oracle 10g : org.hibernate.dialect.Oracle10gDialect
    • MySQL : org.hibernate.dialect.MySQL5InnoDBDialect

 

테스트 케이스 용 데이터베이스 설정

테스트는 케이스 격리된 환경에서 실행하고, 끝나면 데이터를 초기화하는 것이 좋다. 그런 면에서 인 메모리 DB를 사용하는 것이 가장 이상적이다.

H2에서 제공하는 인메모리 데이터베이스를 사용하면 된다. 

www.h2database.com/html/features.html#in_memory_databases 

추가로 테스트 케이스를 위한 스프링 환경과, 일반적으로 애플리케이션을 실행하는 환경은 보통 다르므로 설정 파일을 다르게 사용하자.

다음과 같이 간단하게 테스트용 설정 파일을 추가하면 된다.

다음 경로에 인 메모리 데이터베이스 설정 파일을 추가해준다.

test/resources/persistence.xml


<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
	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_2.xsd">
	<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="1234" />
			<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:testdb" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />                          
			<!-- 옵션 -->
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.use_sql_comments" value="true" />             
			<!--<property name="hibernate.hbm2ddl.auto" value="create" /> -->
		</properties>
	</persistence-unit>
</persistence> 

application.yaml 을 이용할 경우


spring:
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        #        show_sql: true
        format_sql: true
logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type: trace

 

스프링에서는 테스트 실행 시, test/resources 위치에 있는 설정 파일을 먼저 읽고, 만약 이 위치에 설정 파일이 없으면 src/resources 위치에서 찾는다.

스프링 부트는 datasource 설정이 없으면, 기본적을 메모리 DB를 사용하고, driver-class도 현재 등록된 라이브러를 보고 찾아준다. 추가로 ddl-auto create-drop 모드로 동작한다. 따라서 데이터소스나, JPA 관련된 별도의 추가 설정을 하지 않아도 된다.

반응형

'Spring > JPA & Hibernate' 카테고리의 다른 글

영속성 컨텍스트  (0) 2019.12.18
JPA Example  (0) 2019.12.18
고급 매핑  (0) 2019.12.17
연관관계 맵핑  (0) 2019.11.21
JPA  (0) 2019.10.30