H2 Database

H2 Database

[์ฐธ๊ณ ] H2 DB documentation
 

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 ์—์„œ ์ƒ๊ธฐ๋Š” ์—๋Ÿฌ

notion image
  • 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์ด ๋‘๋ฒˆ ์‹คํ–‰๋˜๋Š” ๊ฒƒ