ํ์ฌ DB๊ฐ ์ธํ ๋์ง ์์ ์ํฉ์์ ๊ธํ๊ฒ ํ๋ก ํธ์๋์์ ์ฐ๋ ํ ์คํธ๋ฅผ ์ํด ์์ ํ์๊ฐ์ ๋ก์ง์ ํ์ธํ ์ผ์ด ์๊ฒผ๋ค
์ด๋ฅผ ์ํด ์ค์ ๋ก ์ฌ์ฉํ DB๊ฐ ์ธํ ๋๊ธฐ ์ ๊น์ง H2 DB๋ฅผ ์์๋ก ์ ํํ์๊ณ , ๊ด๋ จ ๋ด์ฉ ํ์ต ๋ฐ ์ค์ ์ฌ์ฉ์ ๋ํ ๊ธฐ๋ก์ ๋จ๊ธฐ๋ ค๊ณ ํ๋ค
H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋?
H2๋ JAVA๋ก ์์ฑ๋ ์คํ ์์ค RDBMS์
- ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค : ์ธ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋์์ ์๋ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ฏ๋ก ๋น ๋ฅธ ์ฑ๋ฅ์ ์ ๊ณตํจ
(์ด ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ ์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง) - ํ์ผ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค : ๋ฐ์ดํฐ๋ฅผ ํ์ผ๋ก ์ ์ฅํ ์ ๋ ์๊ธฐ์ ์๊ตฌ์ ์ธ ์ ์ฅ์ด ๊ฐ๋ฅํจ
- JDBC ์ง์ : JDBC API๋ฅผ ํตํด ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ฝ๊ฒ ํตํฉ๋ ์ ์์
- ์น ์ฝ์ : ์น ๊ธฐ๋ฐ GUI ์ฝ์ ์ ๊ณตํด์ค
(๊ด๋ฆฌ ์ฉ์ด)
๊ต์ฅํ ์๊ณ ๊ฐ๋ณ๊ธฐ ๋๋ฌธ์ ์ ๊ณต๋๋ ๊ธฐ๋ฅ์ ์ ํ์ ์ด์ง๋ง ์๋๊ฐ ๋น ๋ฅด๊ณ ๋ณ๋์ ํ๋ก๊ทธ๋จ ์์ด ์น๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ DB ์ฝ์์ ์ฌ์ฉํ ์ ์์
=> ํ์ฌ ๋ฐฑ์๋ ์๋ฒ๋ฅผ AWS์์ ๋ฐฐํฌ ํ ํ๋ก ํธ์๋์ ๊ฐ๋จํ api ์ฐ๋ ํ ์คํธ๋ง ์งํํ๋ฉด ๋๊ธฐ์ prod ํ๊ฒฝ์์ ์ฌ์ฉํ DB ์ธํ ์ด ๋ง๋ฌด๋ฆฌ ๋๊ธฐ ์ ๊น์ง H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์๋ก ํ ์คํธ๋ฅผ ์งํํ๋๊ฒ ์ข๋ค๊ณ ํ๋จํจ
(์ถํ prod์์ ์ฌ์ฉํ๊ฒ๋ DB๋ RDB๋ผ๋ ์ ๋ ํจ๊ป ๊ณ ๋ ค)
์ฌ์ค ๋ ์์ธํ ๋ค์ด๊ฐ๋ฉด ์ฌ๋ฌ ๋ชจ๋๋ค์ด ์กด์ฌํจ
Server Mode
H2๋ฅผ ๋
๋ฆฝ์ ์ธ DB ์๋ฒ๋ก ์คํํ๋ ๋ฐฉ์์
(๊ทธ๋ฅ ์ฌํ DBMS์ ๋์ผํ๊ฒ DB์์ง ์ค์นํ๊ณ ์์ง์ ๊ตฌ๋ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์๊ฐ)
=> H2 ํ๋ก์ธ์ค๊ฐ ๋ณ๋๋ก ์คํ๋๋ฉฐ, ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ๋์์ ์ ๊ทผํ ์ ์์
- H2๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ์ฌ๋ฌ ํด๋ผ์ด์ธํธ์ ์๋น์คํจ
- TCP ๋๋ WebSocket์ ํตํด ์ฐ๊ฒฐ ๊ฐ๋ฅ
- ์ ํ๋ฆฌ์ผ์ด์
์ด ์ข
๋ฃ๋์ด๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋จ
- ์ฌ๋ฌ ์ธ์คํด์ค์์ ๊ฐ์ DB๋ฅผ ๊ณต์ ํ ์ ์์
In-memory Mode
H2๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ด์์๋ง ์คํ๋๋ ๋ฐฉ์์
(์ ํ๋ฆฌ์ผ์ด์
์ DB ์์ง์ด ๋ด์ฅ๋จ)
- ๋น ๋ฅธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋
- ๋ฐ์ดํฐ๊ฐ ๋์คํฌ์ ์ ์ฅ๋์ง ์๊ธฐ์ ํ๋ฐ์ฑ
- ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ๋๋ฉด DB๋ ์ฌ๋ผ์ง
Embedded Mode
H2๊ฐ ์ ํ๋ฆฌ์ผ์ด์
๋ด๋ถ์ ๋ด์ฅ๋์ด, ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ํจ๊ป ์คํ๋๋ ๋ฐฉ์์
(์ ํ๋ฆฌ์ผ์ด์
์ DB ์์ง์ด ๋ด์ฅ๋จ)
=> ๋ณ๋์ DB ์๋ฒ๋ฅผ ์คํํ ํ์ ์์ด ํ์ผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋จ
- ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋ ๋๋ง DB๊ฐ ํ์ฑํ๋จ
- ํ์ผ ๊ธฐ๋ฐ ์ ์ฅ์ด ๊ฐ๋ฅํ์ฌ ๋ฐ์ดํฐ ์ ์ง๊ฐ ๊ฐ๋ฅ
- ๋คํธ์ํฌ ์ฐ๊ฒฐ ํ์ X
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๋ฉด DB๋ ํจ๊ป ์ข ๋ฃ
ํ์ฌ ์ํฉ์์๋?
ํ์ฌ๋ AWS EC2์ ์๋ฒ ๋ฐฐํฌ ํ ํ๋ก ํธ์๋์ API ์ฐ๋ ํ ์คํธ๋ฅผ ํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ฏ๋ก
In-memory Mode๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ ์ ํ์ด๋ผ๊ณ ์๊ฐํจ
=> ๋ฐ์ดํฐ๊ฐ ๋ ์๊ฐ์ง๋ง ์ค์ prod ํ๊ฒฝ์ด ์๋ ๋จ์ ํ ์คํธ์ด๋ฉฐ ๋น ๋ฅด๊ณ ๊ฐํธํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๊ณ ํ๋จ
H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค(In-memory mode) ์ฌ์ฉํด๋ณด๊ธฐ
๋ก์ปฌ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํด๋ณด์์
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
runtimeOnly("com.h2database:h2")
์ฐ์ build.gradle.kts ์ ์ ์์กด์ฑ์ ์ถ๊ฐํด์ค
=> Spring Data JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด๋ถ์์ ์ด๋ฏธ JDBC ๋๋ผ์ด๋ฒ์ DataSource ๊ด๋ จ ์ค์ ์ ์๋์ผ๋ก ํฌํจํ๊ธฐ์ JDBC ์์กด์ฑ์ด ๋ฐ๋ก ํ์ํ์ง ์์
spring:
datasource:
url: 'jdbc:h2:mem:test' # test๋ผ๋ ์ด๋ฆ์ H2 ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
driver-class-name: org.h2.Driver # H2 ๋๋ผ์ด๋ฒ ํด๋์ค ์ด๋ฆ
username: test
password: qwer1234
h2:
console:
enabled: true # H2 ์ฝ์ ํ์ฑํ
path: /h2-console # H2 ์ฝ์ ๊ฒฝ๋ก
settings:
web-allow-others: true # AWS์ ๋ฐฐํฌ ํ H2 ์ฝ์ ํ์ธ์ ์ํด ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์ค์
application.yaml ์์ ์์ ๊ฐ์ด ์ค์ ํด์ค
import jakarta.persistence.*
@Entity
@Table(name = "users")
data class User(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0,
@Column(nullable = false, unique = true)
val username: String,
@Column(nullable = false)
val password: String,
@Column(nullable = false)
val email: String
)
์ด๋ฐ์์ผ๋ก ๊ฐ๋จํ๊ฒ User ์ํฐํฐ ํด๋์ค๋ ์ถ๊ฐํด์ค
์ด์ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ํ๊ณ http://localhost:8080/h2-console๋ก ์ ์ํ๋ฉด
๋ค์๊ณผ ๊ฐ์ H2 Console ํ๋ฉด์ ๋ณผ ์ ์์
JDBC URL ํ์ธํด์ฃผ๊ณ User Name๊ณผ Password ๋ถ๋ถ์ application.yaml์์ ์ค์ ํ test / qwer1234๋ฅผ ๊ฐ๊ฐ ๋ฃ์ด์ฃผ๋ฉด
Connect์ ์ฑ๊ณตํ ์ ์์
๋ก์ปฌ์์ ์งํํ๋ฏ๋ก postman์ ์ด์ฉํ์ฌ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์ ๊ฐ๋จํ ํ์๊ฐ์ ํ ์คํธ api๋ฅผ ์ด๋ณด๋ฉด
์ ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์
์์์ ๋งํ In-memory์ ํน์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ๋ค๊ฐ ๋ค์ H2 Console์ ํ์ธํด๋ณด๋ฉด
๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ ๊ฒ์ ํ์ธํ ์ ์์
'๐ซ Backend > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
NginX๋ฅผ ํตํด Spring Boot ์๋ฒ์ HTTPS ์ ์ฉํ๊ธฐ (0) | 2025.03.24 |
---|---|
Spring Boot์์ Supabase ์ฌ์ฉํ๊ธฐ (Kotlin) (0) | 2025.02.25 |
JPA ํบ์๋ณด๊ธฐ (0) | 2025.02.16 |
[Spring Boot] Docker๋ฅผ ์ด์ฉํด EC2์ ๋ฐฐํฌํด๋ณด๊ธฐ (4) | 2024.08.27 |
[Spring Boot] Custom Exception ์ค์ (0) | 2024.08.19 |