[์ฐธ๊ณ ] H2 DB documentation
DB URL OverviewEmbedded (local) connectionIn-Memory DatabaseCompatability ModesExecute SQL on ConnectionTroubleShootingschema.sql ์์ ์๊ธฐ๋ ์๋ฌtable already exists์๋ฌ
DB URL Overview
Embedded (local) connection
jdbc:h2:[file:][<path>]<databaseName> jdbc:h2:~/test jdbc:h2:file:/data/sample
- local file system์ ํด๋น db ํ์ผ์ด ์์ฑ๋จ
In-Memory Database
- rapid prototyping, testing, high performance operations, read-only databases์ ๋ํด์ ๋ฐ์ดํฐ๋ฅผ ์์ํ ์ํฌ ํ์๊ฐ ์์ ๋๊ฐ ์์. ์ด๋ in-memory ๋ชจ๋๋ก ์ฌ์ฉํจ
jdbc:h2:mem
์ผ๋ก ์ฌ์ฉํ๋ฉด database๊ฐ privateํ๊ฒ ์ด๋ฆฐ๋ค๋ ์๋ฏธ โ ์ค์ง ํ๋์ connection๋ง ๊ฐ๋ฅํจ
- ํ๋์ in-memory db์ ์ฌ๋ฌ ์ปค๋ฅ์ ์ ์ด์ฉํ๋ ค๋ฉด database URL์ด ์ด๋ฆ์ ํฌํจํด์ผํจ
jdbc:h2:mem:db1
์ ๊ฐ์ด- Jdbc ์ด์ฉ์์๋ ์ด๋ ๊ฒ ๋ช
์ํ๊ธฐ.
jdbc:h2:mem
์ ํํ๋ก ์์ฑ ์, connection metadata ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํจ. ์์๋จ
- in-memory db๋ฅผ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ์ปดํจํฐ์์ ์ ์ํ๊ณ ์ถ์ ๋๋ TCP Server๋ก ๋์์ผ ํจ.
jdbc:h2:tcp://localhost/mem:db1
- ๋ํดํธ๋ก ๋ง์ง๋ง connection์ ๋๊ฒ ๋๋ฉด database๊ฐ ๊บผ์ง๊ฒ ๋๊ณ content๊ฐ ๋ค ๋ ์๊ฐ๊ฒ ๋จ. database๋ฅผ openํ ์ํ๋ก ์ ์งํ๋ ค๋ฉด
;DB_CLOSE_DELAY=-1
์ URL์ ๋ช ์ํด์ฃผ์ด์ผํจ โVM์ด ์ด์์๋ ๋์์ ๋ฉ๋ชจ๋ฆฌ db ์ ์ง๋จ jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
- H2๋ ๋๋ฌธ์๋ก ์ด๋ฆ์ ๊ฐ์ง ํ ์ด๋ธ์ ๋ง๋ ๋ค์ ์คํฌ๋ฆฝํธ์์ ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๊ธฐ์ ์ด๋ฅผ ๊ตฌ๋ถํ์ง ์๊ฒ ํด์ฃผ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑ
jdbc:h2:mem:test;DATABASE_TO_UPPER=false
- In-Memory๋ก ์ธ๊ฑฐ๋ฉด ์ด๋ ๊ฒ ์ฐ๋๊ฒ ์ ์ผ ํธํ ๋ฏ
jdbc:h2:mem:test;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1
Compatability Modes
- ํน์ ํ ๊ธฐ๋ฅ๋ค์ ๋ํด h2๋ ๋ค๋ฅธ db๋ฅผ ๋ชจ๋ฐฉํ ์ ์์
jdbc:h2:<url>;MODE=<databaseType> jdbc:h2:~/test;MODE=MYSQL;DATABASE_TO_LOWER=TRUE
Execute SQL on Connection
- DDL๊ณผ DML์ ํด๋ผ์ด์ธํธ๊ฐ db์ ์ฐ๊ฒฐํ ๋ ์๋์ผ๋ก ์คํํด์ฃผ๋๋ก ํ๋ ๊ธฐ๋ฅ์
jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:/schema.sql';DB_CLOSE_DELAY=-1
TroubleShooting
schema.sql ์์ ์๊ธฐ๋ ์๋ฌ

- sql syntax error๊ฐ ์๊พธ ์๊ฒผ์๋๋ฐ, ์๋ schema.sql ๊ณผ ๊ฐ์ด DROP ๋ถ๋ถ์ ๋ถ์ฌ์ฃผ๋ ํด๊ฒฐ์ด ๋์์. ์์ธ์ ์ ๋ชจ๋ฅด๊ฒ ์;
DROP TABLE IF EXISTS product; CREATE TABLE product( id BINARY(16) NOT NULL PRIMARY KEY, name varchar(20) NOT NULL, category varchar(50) NOT NULL, price bigint NOT NULL, description varchar(500) DEFAULT NULL, created_at datetime(6) NOT NULL, updated_at datetime(6) DEFAULT NULL );
table already exists์๋ฌ
spring: h2: console: enabled: true datasource: url: jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:/schema.sql'; username: sa hikari: maximum-pool-size: 1 minimum-idle: 1 jpa: properties: hibernate: dialect: org.hibernate.dialect.MySQL5InnoDBDialect
- url๋ถ๋ถ์ INIT์ผ๋ก runscript๋ฅผ ๋ช ์ํด์ฃผ๋ฉด, h2๊ฐ ์์๋ ๋ ๋ฐ๋ก ์ schema.sql์ด ์คํ๋๋ ๋ฏํจ
- ๊ทธ๋ฌ๊ณ ๋์ spring์์ ์๋์ผ๋ก ์คํ์ํค๋ schema.sql์ ์คํ์ํค๋ฉด, Table์ด ์ด๋ฏธ ์๋ค๊ณ ํ๋ฉด์ ์๋ฌ๊ฐ ๋ฐ์ํจ โ schema.sql์ด ๋๋ฒ ์คํ๋๋ ๊ฒ