H2DB๋?
h2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ฐ ๊ธฐ๋ฐ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ (dbms) ์ ๋๋ค. ์ฉ๋์ด ๊ฐ๋ณ๊ณ ์คํ๋ง ๋ถํธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด ์์ด ๋จ์ ํ ์คํธ๋ ๋ก์ปฌ ํ๊ฒฝ ํ ์คํธ์ ์ ํฉํฉ๋๋ค. in-memory ๋ชจ๋๋ก ์คํ ์ ์ค์น๊ฐ ๋ฐ๋ก ํ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ ๋๋ฉด์ ๊ฐ์ด ๋ฐ์ดํฐ๊ฐ ํ๋ฐ๋๋ ๋จ์ ์ด ์์ต๋๋ค.
ํ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๋ณตํ์ฌ ์คํํ๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ํ๊ณ ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ ๋ด ์๋ค. ๋ํ ์ฝ์ ๋ชจ๋๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ํ์ ํ๊ณ ์คํ๋ง ๋ถํธ์์ ์ด๋ป๊ฒ h2๋ฅผ ์ธํ ํ ์ ์๋์ง ์์ ๋ณด๊ฒ ์ต๋๋ค.
h2 ์ค์นํ๊ธฐ
h2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ณ๋์ ์ค์น ์์ด๋ ์คํ๋ง์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ค์ ์ ํตํด ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ช ์ฃผ๊ธฐ์ ๊ฐ๊ฒ ๋์. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ์ด๊ธฐํ ๋ฉ๋๋ค. ์ด๋ฅผ In-memory ๋ชจ๋๋ผ๊ณ ํฉ๋๋ค. ์ฐ์ ์ h2๋ฅผ ์ค์นํ์ฌ Server ๋ชจ๋๋ก ํ ์คํธ ํ๊ฒฝ์ ๊ตฌ์ถํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ ํ In-memory ๊ตฌ์ถ ๋ฐฉ๋ฒ๋ ์์ ๋ด ์๋ค.
h2 ์์กด์ฑ ์ค์ ํ๊ธฐ
์คํ๋ง ๋ถํธ์์ h2๋ฅผ ์ฌ์ฉํด ์ฃผ๊ธฐ ์ํด build.gradle ํ์ผ์ dependency๋ฅผ ์ถ๊ฐํด ์ค๋๋ค.
runtimeOnly 'com.h2database:h2'
(์ธํ ๋ฆฌ์ ์ด ๊ธฐ์ค) ํ๋ก์ ํธ ๋ค๋น๊ฒ์ดํฐ๋ฅผ ํ์ธํด ๋ณด๋ฉด External Libraries๊ฐ ์์ต๋๋ค.
๊ทธ ์ค com.h2.database:h2:[h2 version]๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฒ์ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฆ ๋ท๋ถ๋ถ์์ ๋ฉ์ด์ , ๋ง์ด๋, ํจ์น ๋ฒ์ ์ ํ์ธ ํ ์ ์๋๋ฐ ์ ์ฌ์ง์์ ๋ฒ์ ์ 2.2.224๊ฐ ๋ฉ๋๋ค. dependency ์ค์ ์ ๋ฒ์ ์ ๋ฐ๋ก ๋ช ์ํ์ง ์์ ํ์ฌ ๊ธฐ์ค ์ต์ ๋ฒ์ ์ด ์ค์น๋์์ต๋๋ค. ๋ฐ๋ก ๋ฒ์ ์ ๋ช ์ํ์ฌ dependency๋ฅผ ์ค์ ํ๋ฉด ํด๋น ๋ฒ์ ์ library๊ฐ ์ถ๊ฐ๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
h2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง ๋ค์ด๋ก๋
https://h2database.com/html/main.html
์ด์ ์ ์ฌ์ดํธ๋ก ์ด๋ํฉ๋๋ค. h2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์๋ ์ฌ์ดํธ ์ ๋๋ค. ์ด ์ฌ์ดํธ์ ์ค๊ฐ ์ฏค์ ์ด๋ ๊ฒ ์๊ธด ๋ถ๋ถ์ด ์๋๋ฐ
์ถ๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ์ด ๋์ผํ๋ค๋ฉด ๋ค์ด๋ก๋ ๋ฒํผ์ ๋๋ฌ ์งํํด ์ฃผ๋ฉด ๋ฉ๋๋ค. ์๋์ฐ์ ๊ฒฝ์ฐ Windows Installer, ๋ค๋ฅธ ์ด์์ฒด์ ๋ฅผ ์ฌ์ฉ ์ค์ด๋ผ๋ฉด All Platforms๋ฅผ ๋๋ฌ ๋ค์ด๋ก๋ ๋ฐ์ต๋๋ค.
๋ง์ฝ ๋ฒ์ ์ด ๋ง์ง ์๋ค๋ฉด All Downloads ๋ฒํผ์ ๋๋ฌ ์ค๋๋ค.
All Downloads ๋ฒํผ์ ๋๋ฅด๋ฉด ์ ์ฌ์ดํธ๋ก ์ด๋ํ๋๋ฐ, ์ต์ ๋ฒ์ 2๊ฐ ์ ๋๊ฐ ๋ฆฌ์คํธ์ ๋ณด์ด๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ํ๋ ๋ฒ์ ์ด ์๋ค๋ฉด Archive Downloads ์น์ ์ ๋งํฌ๋ฅผ ๋๋ฌ์ค๋๋ค.
์ด์ ๋ฒ์ ์ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์์ต๋๋ค. Windows์ ๊ฒฝ์ฐ Windows Installer๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ณ ๋งฅ์ ๊ฒฝ์ฐ Platform-Independent Zip์ ๋๋ฌ zip ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ์ ์ฃผ์ธ์.
์์ถ์ ํ์ด ์ค๋๋ค. h2 ํด๋๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
h2 ์ฝ์ ์ฌ์ฉํ๊ธฐ
์์ถ์ ํ๋ฉด h2 ํด๋๋ฅผ ํ์ธํ ์ ์๋๋ฐ, ํฐ๋ฏธ๋์ ์ฌ์ฉํด์ ํด๋น ํด๋๋ก ์ด๋ํด ์ค๋๋ค. ํด๋ ์ด๋ํ bin ๊น์ง ์ด๋ํด ์ฃผ์ธ์. ๊ทธ๋ฌ๋ฉด ๊ฒฝ๋ก๊ฐ ~/์ง์ ํ ๊ฒฝ๋ก/h2/bin์ด ๋์ด ์์ ๊ฑฐ์์.
์ด ์ํ์์ ์คํ ๊ถํ์ ๋ฐ๊ฟ ์ฃผ๊ฒ ์ต๋๋ค.
chmod 755 h2.sh
ํด๋น ๊ฒฝ๋ก์์ ls ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด h2.sh ํ์ผ์ ํ์ธํ ์ ์์ต๋๋ค.
./h2.sh
์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ h2๋ฅผ ์คํํด ์ค๋๋ค.
์คํํ๊ฒ ๋๋ฉด ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ฝ์์ ์ ์ํ๊ฒ ๋ฉ๋๋ค. ์ต์ด ์ ๊ทผ์์๋ ํ์ผ๋ก ๋ฐ๋ก ์ ์ํด์ผ ํฉ๋๋ค. ์ต์ด 1ํ๋ง ํ์ผ๋ก ์ ๊ทผํฉ๋๋ค. ์ ๊ฒฝ๋ก๋ก ์ฐ๊ฒฐํ๋ฉด ์ฌ์ฉ์ ๊ณ์ ๋๋ ํ ๋ฆฌ์ test.mv.db ํ์ผ์ด ์์ฑ๋ฉ๋๋ค. ํ์ผ์ด ์์ฑ๋๊ณ ๋๋ฉด tcp ์์บฃ์ ์ฌ์ฉํ์ฌ ์ ์ํด ์ค๋๋ค. ์ด๋ ๊ฒ ํด์ผ ์ฝ์๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ์ ๊ทผํ์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
> tcp๋ก ์ ์
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ์ด ์๋ ์์ฑ๋์ง ์๋ ๊ฒฝ์ฐ
ํ์ผ๋ก ๋ฐ๋ก ์ ์์ not found, either pre-create it or allow remote database creation (not recommended in secure enviroments) ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ์ ์์ฑํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค.
[๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ].mv.db ํ์ผ์ ์์ฑํด ์ค๋๋ค. ๊ณ์ ๋๋ ํ ๋ฆฌ ํ์์ ์์ฑํด ์ค๋๋ค. ์ ๊ณผ์ ์์ ์ต์ด 1ํ์ ํ์ผ๋ก ์ ์ํ๊ณ ๊ทธ ์ดํ์๋ tcp๋ก ์ ์ํด์ผ ํ๋ค๊ณ ํ์๋๋ฐ์, ์ง๊ธ์ ๊ฒฝ์ฐ ํ์ผ๋ก ์ ์ํ์ฌ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ์ ์์ฑํด ์ฃผ๋ ๋จ๊ณ๋ฅผ ์ง์ ์๋์ผ๋ก ์ค์ ํด ์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ tcp๋ก ์ ์ ํ๋ฉด ๋ฉ๋๋ค.
๋ง์ฝ test2.mv.db ํ์ผ์ ์์ฑํ๋ค๋ฉด jdbc:h2:tcp://localhost/~/test2๋ก ์ ์ํ๋ฉด ๋ฉ๋๋ค.
Spring boot ์ค์ ํ๊ธฐ
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
build.gradle ์ ์์กด์ฑ์ ์ค์ ํด ์ค๋๋ค. jpa๋ฅผ ์ฌ์ฉํด์ ํ ์ด๋ธ์ ์์ฑํด ์ฃผ๊ธฐ ์ํด ๊ฐ์ด ์ถ๊ฐํด ์ฃผ์์ต๋๋ค.
Server mode
db ์์ง์ ์ค์นํ ํ ์ด ์์ง์ ๊ตฌ๋ํ๋ ๋ฐฉ์์ ๋๋ค. ์์ h2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ์ค์นํ๊ณ ์ค์ ํด ์ฃผ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
์๋ฒ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ๋๋ผ๋ ๋ก์ปฌ์ ๋ฐ์ดํฐ๊ฐ ๋จ์ ์์ต๋๋ค. ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ ๊ฐ๋ฅํฉ๋๋ค.
spring.datasource.url=jdbc:h2:tcp://localhost/~/[๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ]
spring.datasource.username=[user name]
spring.datasource.password=[password]
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.h2.console.enabled=true
logging.level.org.hibernate.SQL=debug
logging.level.org.hibernate.type.descriptor.sql=trace
> application.properties
๋ง์ฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ์ test2๋ก ์ค์ ํ๊ณ , ๋ณ๋์ username๊ณผ password๋ฅผ ์ค์ ํ์ง ์์๋ค๋ฉด ์๋์ ๊ฐ์ด ์ค์ ๋ฉ๋๋ค.
spring.datasource.url=jdbc:h2:tcp://localhost/~/test2
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
h2๋ฅผ ์ค์ ํ๋ ๊ฑด ์ฒซ 4์ค ์ ๋๋ค. ddl-auto ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ ์ ๋ต์ ์ค์ ํ๋ ๊ฒ์ธ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์๋ก ์์ฑํ๋ ๊ฒ์ด ์๋ ์ ๋ฐ์ดํธ ๋ฐฉ์์ผ๋ก ์ค์ ํ๊ธฐ ์ํด ddl-auto๋ฅผ update๋ก ์ค์ ํด ์ฃผ์์ต๋๋ค.
Entity ์ฌ์ฉํด์ ํ ์คํธํ๊ธฐ
package org.youable.personal_study.model;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Member {
@Id
private String id;
private String name;
}
ํ ์คํธ์ฉ Entity๋ฅผ ๋ง๋ค์ด ์ค๋๋ค. ์ดํ Application์ ์คํํด ์ฃผ์ธ์.
jpa์ ์ํด ์๋์ผ๋ก ํ ์ด๋ธ์ด ์์ฑ๋ ๊ฒ์ ์ฝ์์์ ํ์ธํ ์ ์์ต๋๋ค. ๋ง์ฝ ๋ณด์ด์ง ์๋ ๊ฒฝ์ฐ ์ฝ์์ ์๋ก๊ณ ์นจ ํ๊ฑฐ๋, ์ฌ ์ ์, ํน์ ์ค์ ์ด ์ ๋ชป ๋์ง ์์๋์ง ํ์ธํด๋ด ๋๋ค.
In-memory Mode
In-memory mode (์ดํ. ์ธ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋)๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์ ๋ด์ฅ๋์ด ์๋ DB ์์ง์ ์ฌ์ฉํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ช ์ฃผ๊ธฐ์ ๊ฐ์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ฉด ๊ตฌ๋๋๊ณ , ์ข ๋ฃํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ง ์๊ณ ์ฌ๋ผ์ง๋๋ค. ์ผํ์ฑ ํ ์คํธ, ๋จ์ ํ ์คํธ ๋ฑ์ผ๋ก ์ ํฉํ ๋ฐฉ์์ ๋๋ค.
application.properties์์ spring.datasource.url์ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํฉ๋๋ค.
spring.datasource.url=jdbc:h2:mem:testdb
๋ก์ปฌ ํธ์คํธ์์ ํ ์คํธํ๋ ๊ฒฝ์ฐ
localhost:8080/h2-console
url๋ก ์ ์
jdbc url์ spring.datasource.url์์ ์ง์ ํด ์ค ๊ฒฝ๋ก์ ๋์ผํ๊ฒ ์์ฑํด ์ค๋๋ค. ์ดํ connect๋ฅผ ๋๋ฌ ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ ๋จ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ํจ๊ป ํ๋ฐ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์คํ์ ๋ง๋ค ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์์ฑํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ defer-datasource-initializaion์ ์ฌ์ฉํ๋ฉด ์คํ ์ ๋ง๋ค ์ด๊ธฐ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ธฐ ์ํด sql์ ์๋์ผ๋ก ์คํํด ์ค ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
jpa:
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate.format_sql: true
defer-datasource-initialization: true # ์ถ๊ฐํ ๋ถ๋ถ
Hibernate๊ฐ ์ด๊ธฐํ ๋ ์ดํ data.sql์ ์คํํ๋ ์ต์ ์ ๋๋ค. data.sql ํ์ผ์ resources ํด๋์ ์ถ๊ฐํด ์ค๋๋ค.
insert into member(name)
values ('tester1'),
('tester2');
data.sql์๋ ์ด๊ธฐ์ ์คํ๋์ด์ผ ํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด ์ค ์ ์์ต๋๋ค.
Outro
๊ฐ๋จํ ํ ์คํธ ํ๋ก์ ํธ์ ๊ฐ๋ฐ ํ๊ฒฝ ์ ํ ์ h2 ์ค์ ์ ์์ฃผ ํ๊ฒ ๋๋๋ฐ, ํ ๋๋ง๋ค ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ์์ด ํ๋ฒ ์ ๋ฆฌํ๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ํน์๋ ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ธ์ ๋ ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค
์ฐธ๊ณ ์ฌ์ดํธ
https://colabear754.tistory.com/193
https://phantom.tistory.com/59
๋๊ธ