๐ฏ Goals
- SpringBoot - H2 DB ๊ฐ ์ ์ ํ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ์ ์ ํํ ์ค ์๋ค.
- SpringBoot - H2 DB Automatic mixed ์ฐ๊ฒฐ์ ์ง์ ์คํํด๋ณธ๋ค.
H2 DB ์ฐ๊ฒฐ 3๊ฐ์ง ๋ชจ๋
1. Embedded Mode
์ด๋ฆ ๊ทธ๋๋ก JVM App ๋ด์ DB๋ฅผ '๋ด์ฅ'ํ๋ ๋ชจ๋๋ค.
๋คํธ์ํฌ IO๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๋น ๋ฅธ ๋์ ์ธ๋ถ ํด๋ผ์ด์ธํธ๋ก ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๋จ์ ์ด ์๋ค.
(์ฌ์ง์ด ๋ก์ปฌ ํธ์คํธ ๋ด์ ๋ค๋ฅธ ์ฑ์ด๋ผ๋ ๋ถ๊ฐํ๋ค.)

2. Server - Client Mode

H2 DB ๊ณต์๋ฌธ์์์ ์ถ์ฒํ๋ ๋ฐฉ์์ผ๋ก ์ธ๋ถ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
๋์ , TCP/IP ๋คํธ์ํฌ IO ๋ก ๋ฐ์ดํฐ ํต์ ์ด ์ด๋ค์ง๊ธฐ ๋๋ฌธ์ Latency ๋ฐ์์ด ๋ถ๊ฐํผํ๋ค.
It's recommended to use the client-server model instead,
the client side may interrupt own threads.
3. Mixed Mode

์ฌ๊ธฐ์ Mix ๋ Embedded + Server ๋ฅผ ํผํฉํ๋ค๋ ๋ป์ธ๋ฐ
์ต์ด๋ก DB๋ฅผ ์ฐ๊ฒฐํ ์ฑ์ด ์์ฒด์ ์ธ Server ๋ฅผ ๋์ H2 DB ๋ฅผ Wrapping ํ๋ ๋ฐฉ์์ด๋ค.
์ต์ด ํด๋ผ์ด์ธํธ๋ Embedded DB๋ฅผ ์ฌ์ฉํ๋ฏ๋ก Latency ์์ด DB๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋์์ ์ด ์ต์ด ํด๋ผ์ด์ธํธ ์ฑ์ด ๊ณง ์๋ฒ ํธ์คํ ์ ๋ง๋๋ค.
์ธ๋ถ ์ฑ์์ ๋์ผํ URL ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
๋์ , ์ธ๋ถ ์ ๊ทผ ํด๋ผ์ด์ธํธ๋ Server-Client ๋ชจ๋ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋คํธ์ํฌ IO๋ก ํต์ ํ๊ธฐ ๋๋ฌธ์ Latency๊ฐ ๋ฐ์ํ๋ค.
Mixed ๋ชจ๋๋ ๋ค์ 2๊ฐ์ง๋ก ๋๋๋ค.
(1) Client (App) - Server (App) Mode
์์ง ์ฐ๊ฒฐ์ ํด๋ณด์ง ์์๋ค.
(2) Automatic mixed mode
์ด ๊ธ์์ ์ค๋ช ํ๋ ๋ฐฉ์์ด๋ค.
์๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ธฐ์ ํ๋ค.
๊ทธ๋ผ, ์ต์ด ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ ๋์ผ๋ฉด ์๋ฒ๋ ํด์ ๋๋?
๋ง๋ค. ๋์ ๋์์ ์ฐ๊ฒฐ์ค์ธ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ฅผ ์๋ ์ฌ์์ํ๋ค.
In-memory ๋ชจ๋๋ฅผ ์ง์ํ์ง ์๋๋ค.lock.db ํ์ผ๋ก Private IP/Port ๋ฅผ ๊ด๋ฆฌํ๊ฒ๋ ์ค๊ณ ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ฝ ๋น๊ต
| Embedded Mode | Server - Client Mode | Mixed Mode | |
| URL Example | - jdbc:h2:<file-path> - jdbc:h2:mem:<db-name> |
- jdbc:h2:tcp//localhost/~/<db-name> - jdbc:h2:tcp://<server-ip>:<port>/<path>/<db-name> |
- jdbc:h2:<url>;AUTO_SERVER=TRUE - jdbc:h2:<db-relative-file-path>;AUTO_SERVER=TRUE |
| Pros | No Latency | Support remote connect | Fast for server app Support remote connect |
| Cons | Not support remote connect | Network Latency | Network Latency for seocond clients ~ |
When to use?
Q. IDE์์ ๋จ์ Persistence Layer ์ ๋ ํ ์คํธ ์ฝ๋๋ฅผ ๋๋ฆฐ๋ค?
A. Embedded Mode
Q. ๋ก์ปฌ ์ธ ์ธ๋ถ ์ ๋ ฅ์ ์ง์ํด์ผํ๋ค?
A.Server - Client Mode
Q. ๋ก์ปฌํ๊ฒฝ์ด์ง๋ง ํ ์คํธ ์ฝ๋ ์ธ์๋ ์ค์ DB ์ํ๋ฅผ ๋ค์ฌ๋ค๋ณผ ํ์๊ฐ ์๋ค? (ex. Intellij IDEA ์ฐ๊ฒฐ)
A. (Automatic) Mixed Mode
์ค์ต ์์
Intellij IDEA - H2 DB Connect using Automatic Mixed mode
Automatic Mixed Mode ์ ํต์ฌ์ "๊ฐ์ DB์ ๋ชจ๋ ๋์ผํ URL ๋ก ์ ๊ทผํ๋ค" ์ด๋ค.
์ด ๋ ์ฃผ์ํ ์ ์ ๋ฐ๋์ ๋์ `AUTO_SERVER=TRUE` ์ต์ ์ ์ง์ ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์์์ ํฌํธ๋ฅผ ์ง์ ํ๋ฉด Automatic Mixed Mode ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ง ์๋๋ค.
(1) application.yaml ํ์ผ ์ค์
ํ๋จ URL ๋ก ์ ์์ `cafe-kiosk.lock.db` ํ์ผ์ด ํ ๋๋ ํ ๋ฆฌ์ ์์ฑ๋๋ค.
lock.db ํ์ผ์ ์ค๋ก์ง ์๋ฒ๋ก ์ง์ ๋ ํ๋์ ์ปค๋ฅ์ ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ์์์ ํฌํธ๋ฒํธ๋ก ๋์ผํ `${DB-NAME}` ์ผ๋ก ์ ๊ทผํ ๊ฒฝ์ฐ lock ํ์ผ ๋๋ฌธ์ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ๋ค.
jdbc:h2:~/cafe-kiosk;AUTO_SERVER=TRUE
(2) SpringBoot ์คํ
์คํํ spring.datasource.url ์ ๋ช ์ํ ๊ฒฝ๋ก๋ก ๊ฐ๋ณด๋ฉด ${db-name}.lock.db ํ์ผ์ ๋ณผ ์ ์๋ค.


SpringBoot App ์ ๊ตฌ๋์ํค๋ฉด SpringBoot App ์ด ์ต์ด์ ํด๋ผ์ด์ธํธ์ด์ H2 Server ์ ํธ์คํ ์ฃผ์ฒด๊ฐ๋๋ค.
SpringBoot App ๋ด์์ ๋งบ๋ JDBC ์ฐ๊ฒฐ์ `Embedded` ๋ชจ๋๊ฐ ๋์ด ๋คํธ์ํฌ Latency ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
(3) Intellij IDEA - DB ์ฐ๊ฒฐ
Intellij IDEA > Database > Data Sources and Drivers > URL
URL ๋์ `AUTO_SERVER=TRUE` ์ต์ ์ ์ง์ ํ๋ค.
์ด๋ 2๋ฒ์งธ Connection ์ผ๋ก TCP/IP Network latency ๋ฐ์ํ๋ค.

(4) ์ฐ๊ฒฐ ํ์ธ

Conclusion
SpringBoot ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์์ Persistency ์ ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ๊ณ , DB ์ํ๊ฐ์ IDE ๋ก ํ์ธํ๊ณ ์ถ๋ค๋ฉด H2 DB ์ Automatic Mixed Mode ๋ฅผ ํ์ฉํด๋ณด์.
jdbc:h2:~/<db-name>;AUTO_SERVER=TRUE
์ค์ ์ผ๋ก ๋๋ฑ๊ฐ๋ฅํ๋ค.
๐ Reference
Features
Features Feature List H2 in Use Connection Modes Database URL Overview Connecting to an Embedded (Local) Database In-Memory Databases Database Files Encryption Database File Locking Opening a Database Only if it Already Exists Closing a Database Ignore
www.h2database.com
'DataBase' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [DB] Key (Index) ๋ ์ด๋ป๊ฒ ๋์ํ๋? (0) | 2022.05.27 |
|---|---|
| [DB] Connection Pool (0) | 2022.03.30 |
| [Oracle] remote access (0) | 2020.11.23 |