๊ฒ์๊ธ ํ ์ด๋ธ ์ค๊ณ
column_name | Type | Description |
---|---|---|
article_id | BIGINT | Primary Key |
title | VARCHAR(100) | ์ ๋ชฉ |
content | VARCHAR(3000) | ๋ด์ฉ |
board_id | BIGINT | ๊ฒ์ํID(Shard Key) |
writer_id | BIGINT | ์์ฑ์ID |
created_at | DATETIME | ์์ฑ์๊ฐ |
modified_at | DATETIME | ์์ ์๊ฐ |
์ฌ๊ธฐ์ Shard Key๋ ๊ฒ์ํ ID
์? ๊ฒ์๊ธ ์๋น์ค๋ ๊ฒ์ํ ๋จ์๋ก ์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ์, ๊ฒ์ํ ๋จ์๋ก ๊ฒ์๊ธ ๋ชฉ๋ก์ด ์กฐํ๋๋ ๊ฒ

primary key ์์ฑ ์๊ณ ๋ฆฌ์ฆ์ Snowflake
์ฌ์ฉ
- ๋ถ์ฐ ์์คํ ์์ ๊ณ ์ ํ 64bit ID๋ฅผ ์์ฑํ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ถ์ฐ ํ๊ฒฝ์์๋ ์ค๋ณต ์์ด ์์ฐจ์ ID๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ท์น
- [1bit][41bits:ํ์์คํฌํ][10bits:๋ ธ๋ID][12bits:์ํ์ค ๋ฒํธ]
- ํ์์คํฌํ : ์์ฐจ์ฑ
- ๋ ธ๋ID + ์ํ์ค ๋ฒํธ : ๊ณ ์ ์ฑ
- ์ ๋ํฌ, ์๊ฐ ๊ธฐ๋ฐ ์์ฐจ์ฑ, ๋ถ์ฐํ๊ฒฝ์์์ ๋์ ์ฑ๋ฅ
DB Shard ๋?
์ํ์ ๋ฐ์ดํฐ ๋ถํ ์ ํตํด ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ฅ์ฑ๊ณผ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๊ธฐ์ ์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๊ฐ์ DB๋ก ๋ถ๋ฆฌํ์ฌ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
๊ฐ ๋ถ๋ฆฌ๋ DB๋ฅผ Shard
๋ผ๊ณ ํ๋ฉฐ, ์ค๋์๋ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ถ๋ง ์ ์ฅ๋๋ค.
์ฌ์ฉ ์ด์
- ๋ฐ์ดํฐ ์ ์ฆ๊ฐ ๋ฌธ์ ํด๊ฒฐ
- ํ์ฅ์ฑ(Scalability)
- ์ฑ๋ฅ ํฅ์
- ๊ฐ์ฉ์ฑ(Availability)
์๋ฆฌ
๋ฐ์ดํฐ๋ฅผ ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋๋์ด ๊ฐ ์ค๋์ ์ ์ฅํ๋ค. ์ค๋ ๊ฐ์๋ ๋ฐ์ดํฐ๊ฐ ์ค๋ณต๋์ง ์์ผ๋ฉฐ, ๋ฐ์ดํฐ์ ๋ถํ ๊ธฐ์ค์ ์ค๊ณ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
- ์ค๋ฉ ํค(Sharding Key)
๋ฐ์ดํฐ๋ฅผ ๋๋๋ ๊ธฐ์ค์ด ๋๋ ํค - ์ค๋ ํ ๋น ๋ฐฉ์
๋ฐ์ดํฐ๋ฅผ ์ด๋ค ์ค๋์ ๋ฐฐ์นํ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ- ๋ฒ์ ๊ธฐ๋ฐ ์ค๋ฉ(Range-based Sharding)
๋ฐ์ดํฐ๋ฅผ ํน์ ๊ฐ ๋ฒ์๋ก ๋๋ - ํด์ ๊ธฐ๋ฐ ์ค๋ฉ(Hash-Based Sharding)
์ค๋ฉ ํค๋ฅผ ํด์ฑํ์ฌ ์ค๋๋ฅผ ์ ํ - ์ง์ญ ๊ธฐ๋ฐ ์ค๋ฉ(Geographic-Based Sharding)
๋ฐ์ดํฐ๋ฅผ ์ง๋ฆฌ์ ์์น์ ๋ฐ๋ผ ๋ถํ
- ๋ฒ์ ๊ธฐ๋ฐ ์ค๋ฉ(Range-based Sharding)
์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ํ์ฅ์ฑ
- ์ฑ๋ฅํฅ์
- ๋ ๋ฆฝ์ ์ฅ์ ์ฒ๋ฆฌ
- ๋ฐ์ดํฐ ๋ถ์ฐ
๋จ์
- ๋ณต์ก์ฑ ์ฆ๊ฐ
- ๋ฐ์ดํฐ ์ด๋ : ์ค๋ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ด๋ํ๊ฑฐ๋ ์ฌ๋ถํ (resharding)ํ ๋ ๋ณต์กํ ์์ ํ์
- ๊ธ๋ก๋ฒ ํธ๋์ญ์ ์ฒ๋ฆฌ ์ด๋ ค์ : ์ค๋๊ฐ ํธ๋์ญ์ (Distrubuted Transactions)์ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ค์
- ์ฟผ๋ฆฌ ์ ํ : ๋ฐ์ดํฐ๊ฐ ๋ถ์ฐ๋๋ฏ๋ก ์ง๊ณ ์ฟผ๋ฆฌ์ ๊ฐ์ ์์ ์ด ์ด๋ ค์ธ ์ ์์
- ๋ฐ์ดํฐ ๋ถ๊ท ํ : ์๋ชป๋ ์ค๋ฉํค ์ฌ์ฉ์ ํน์ ์ค๋์ ๋ฐ์ดํฐ๊ฐ ๋ชฐ๋ฆด ์ ์์
ํํผ์ง 2
์ด๋ฒ์๋ docker์์ ๊ตฌ์ฑํ db ์ฐ๊ฒฐ์์ ๋ฌธ์ ๋ฐ์;;;
์ ์์ ์ผ๋ก ์ํ๊ฑฐ๊ฐ์๋ฐ;;
server:
port: 9000
spring:
application:
name: kuke-board-article-service
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/article
username: root
password: root
jpa:
database-platform: org.hibernate.dialect.MySQLDialect
open-in-view: false
show-sql: true
hibernate:
ddl-auto: none
๊ทผ๋ฐ ๊ณ์ํด์ ์ฐ๊ฒฐ ์คํจ;!

๋ณ๋ณ์ง ๋คํด๋ดค๋ค....
uri ๋ณ๊ฒฝ๋ถํฐ docker container ์ฌ์์ ๋ฑ๋ฑ ๊ทผ๋ฐ ํน์...... ๋ด pc์ mysql ์๋๋ฐ... ๊ฑ๋ 3306 ์ธ๋ฐ;;;
ํ์ธ ๊ฒฐ๊ณผ

์ญ์๋ 2๊ฐ๊ฐ ๋์๊ฐ๋์ค...
์ด๋ฏธ ๋ด ๋ ธํธ๋ถ mysql์ด 127.0.0.1:3306์ ์ฌ์ฉ์ค์ด์๋ ๊ฒ!
๊ทธ๋์ docker์ mysql์ 3307:3306 ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๋ค์ ์์ฑํด์ฃผ๋ ์ ์ ๋์!
ํํผ์ง 3
test๋ฅผ ์ํด์ RestClient๋ฅผ ์ด์ฉํ๋๋ฐ ๊ณ์ http://localhost:9000/v1/articles๋ฅผ ๋ชป์ฐพ๋๋ค๊ณ ๋์๋ค...

์๊ณ ๋ณด๋ Spring Boot Application์ ์คํํ๋ฉด์ ํ ์คํธ ์ฝ๋๋ฅผ ๋๋ ค์ผํ์.... ใ ใ ใ ใ
'์คํ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ๋๊ท๋ชจ์์คํ ์ค๊ณ (3) (0) | 2025.03.15 |
---|---|
Kafka ? ์นดํ์นด๊ฐ ๋ญ๋ฐ.... (0) | 2025.03.15 |
์คํ๋ง ๋๊ท๋ชจ์์คํ ์ค๊ณ ๊ฐ์ (1) (0) | 2025.01.11 |
SimpleJdbcInsert ์ฌ์ฉ ์, ์๋ ์ปฌ๋ผ ๋ฌธ์ ๋ฐ์ (0) | 2024.04.11 |
QueryDSL ์ด๋? (0) | 2023.05.18 |
๊ฒ์๊ธ ํ ์ด๋ธ ์ค๊ณ
column_name | Type | Description |
---|---|---|
article_id | BIGINT | Primary Key |
title | VARCHAR(100) | ์ ๋ชฉ |
content | VARCHAR(3000) | ๋ด์ฉ |
board_id | BIGINT | ๊ฒ์ํID(Shard Key) |
writer_id | BIGINT | ์์ฑ์ID |
created_at | DATETIME | ์์ฑ์๊ฐ |
modified_at | DATETIME | ์์ ์๊ฐ |
์ฌ๊ธฐ์ Shard Key๋ ๊ฒ์ํ ID
์? ๊ฒ์๊ธ ์๋น์ค๋ ๊ฒ์ํ ๋จ์๋ก ์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ์, ๊ฒ์ํ ๋จ์๋ก ๊ฒ์๊ธ ๋ชฉ๋ก์ด ์กฐํ๋๋ ๊ฒ

primary key ์์ฑ ์๊ณ ๋ฆฌ์ฆ์ Snowflake
์ฌ์ฉ
- ๋ถ์ฐ ์์คํ ์์ ๊ณ ์ ํ 64bit ID๋ฅผ ์์ฑํ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ถ์ฐ ํ๊ฒฝ์์๋ ์ค๋ณต ์์ด ์์ฐจ์ ID๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ท์น
- [1bit][41bits:ํ์์คํฌํ][10bits:๋ ธ๋ID][12bits:์ํ์ค ๋ฒํธ]
- ํ์์คํฌํ : ์์ฐจ์ฑ
- ๋ ธ๋ID + ์ํ์ค ๋ฒํธ : ๊ณ ์ ์ฑ
- ์ ๋ํฌ, ์๊ฐ ๊ธฐ๋ฐ ์์ฐจ์ฑ, ๋ถ์ฐํ๊ฒฝ์์์ ๋์ ์ฑ๋ฅ
DB Shard ๋?
์ํ์ ๋ฐ์ดํฐ ๋ถํ ์ ํตํด ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ฅ์ฑ๊ณผ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๊ธฐ์ ์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๊ฐ์ DB๋ก ๋ถ๋ฆฌํ์ฌ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
๊ฐ ๋ถ๋ฆฌ๋ DB๋ฅผ Shard
๋ผ๊ณ ํ๋ฉฐ, ์ค๋์๋ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ถ๋ง ์ ์ฅ๋๋ค.
์ฌ์ฉ ์ด์
- ๋ฐ์ดํฐ ์ ์ฆ๊ฐ ๋ฌธ์ ํด๊ฒฐ
- ํ์ฅ์ฑ(Scalability)
- ์ฑ๋ฅ ํฅ์
- ๊ฐ์ฉ์ฑ(Availability)
์๋ฆฌ
๋ฐ์ดํฐ๋ฅผ ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋๋์ด ๊ฐ ์ค๋์ ์ ์ฅํ๋ค. ์ค๋ ๊ฐ์๋ ๋ฐ์ดํฐ๊ฐ ์ค๋ณต๋์ง ์์ผ๋ฉฐ, ๋ฐ์ดํฐ์ ๋ถํ ๊ธฐ์ค์ ์ค๊ณ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
- ์ค๋ฉ ํค(Sharding Key)
๋ฐ์ดํฐ๋ฅผ ๋๋๋ ๊ธฐ์ค์ด ๋๋ ํค - ์ค๋ ํ ๋น ๋ฐฉ์
๋ฐ์ดํฐ๋ฅผ ์ด๋ค ์ค๋์ ๋ฐฐ์นํ ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ- ๋ฒ์ ๊ธฐ๋ฐ ์ค๋ฉ(Range-based Sharding)
๋ฐ์ดํฐ๋ฅผ ํน์ ๊ฐ ๋ฒ์๋ก ๋๋ - ํด์ ๊ธฐ๋ฐ ์ค๋ฉ(Hash-Based Sharding)
์ค๋ฉ ํค๋ฅผ ํด์ฑํ์ฌ ์ค๋๋ฅผ ์ ํ - ์ง์ญ ๊ธฐ๋ฐ ์ค๋ฉ(Geographic-Based Sharding)
๋ฐ์ดํฐ๋ฅผ ์ง๋ฆฌ์ ์์น์ ๋ฐ๋ผ ๋ถํ
- ๋ฒ์ ๊ธฐ๋ฐ ์ค๋ฉ(Range-based Sharding)
์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ํ์ฅ์ฑ
- ์ฑ๋ฅํฅ์
- ๋ ๋ฆฝ์ ์ฅ์ ์ฒ๋ฆฌ
- ๋ฐ์ดํฐ ๋ถ์ฐ
๋จ์
- ๋ณต์ก์ฑ ์ฆ๊ฐ
- ๋ฐ์ดํฐ ์ด๋ : ์ค๋ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ด๋ํ๊ฑฐ๋ ์ฌ๋ถํ (resharding)ํ ๋ ๋ณต์กํ ์์ ํ์
- ๊ธ๋ก๋ฒ ํธ๋์ญ์ ์ฒ๋ฆฌ ์ด๋ ค์ : ์ค๋๊ฐ ํธ๋์ญ์ (Distrubuted Transactions)์ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ค์
- ์ฟผ๋ฆฌ ์ ํ : ๋ฐ์ดํฐ๊ฐ ๋ถ์ฐ๋๋ฏ๋ก ์ง๊ณ ์ฟผ๋ฆฌ์ ๊ฐ์ ์์ ์ด ์ด๋ ค์ธ ์ ์์
- ๋ฐ์ดํฐ ๋ถ๊ท ํ : ์๋ชป๋ ์ค๋ฉํค ์ฌ์ฉ์ ํน์ ์ค๋์ ๋ฐ์ดํฐ๊ฐ ๋ชฐ๋ฆด ์ ์์
ํํผ์ง 2
์ด๋ฒ์๋ docker์์ ๊ตฌ์ฑํ db ์ฐ๊ฒฐ์์ ๋ฌธ์ ๋ฐ์;;;
์ ์์ ์ผ๋ก ์ํ๊ฑฐ๊ฐ์๋ฐ;;
server:
port: 9000
spring:
application:
name: kuke-board-article-service
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/article
username: root
password: root
jpa:
database-platform: org.hibernate.dialect.MySQLDialect
open-in-view: false
show-sql: true
hibernate:
ddl-auto: none
๊ทผ๋ฐ ๊ณ์ํด์ ์ฐ๊ฒฐ ์คํจ;!

๋ณ๋ณ์ง ๋คํด๋ดค๋ค....
uri ๋ณ๊ฒฝ๋ถํฐ docker container ์ฌ์์ ๋ฑ๋ฑ ๊ทผ๋ฐ ํน์...... ๋ด pc์ mysql ์๋๋ฐ... ๊ฑ๋ 3306 ์ธ๋ฐ;;;
ํ์ธ ๊ฒฐ๊ณผ

์ญ์๋ 2๊ฐ๊ฐ ๋์๊ฐ๋์ค...
์ด๋ฏธ ๋ด ๋ ธํธ๋ถ mysql์ด 127.0.0.1:3306์ ์ฌ์ฉ์ค์ด์๋ ๊ฒ!
๊ทธ๋์ docker์ mysql์ 3307:3306 ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๋ค์ ์์ฑํด์ฃผ๋ ์ ์ ๋์!
ํํผ์ง 3
test๋ฅผ ์ํด์ RestClient๋ฅผ ์ด์ฉํ๋๋ฐ ๊ณ์ http://localhost:9000/v1/articles๋ฅผ ๋ชป์ฐพ๋๋ค๊ณ ๋์๋ค...

์๊ณ ๋ณด๋ Spring Boot Application์ ์คํํ๋ฉด์ ํ ์คํธ ์ฝ๋๋ฅผ ๋๋ ค์ผํ์.... ใ ใ ใ ใ
'์คํ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ๋๊ท๋ชจ์์คํ ์ค๊ณ (3) (0) | 2025.03.15 |
---|---|
Kafka ? ์นดํ์นด๊ฐ ๋ญ๋ฐ.... (0) | 2025.03.15 |
์คํ๋ง ๋๊ท๋ชจ์์คํ ์ค๊ณ ๊ฐ์ (1) (0) | 2025.01.11 |
SimpleJdbcInsert ์ฌ์ฉ ์, ์๋ ์ปฌ๋ผ ๋ฌธ์ ๋ฐ์ (0) | 2024.04.11 |
QueryDSL ์ด๋? (0) | 2023.05.18 |