์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- java
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ์ฝํ
- ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ
- Kotlin
- doitandroid
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ฝํ๋ฆฐ
- CS
- join
- ๊ธฐ์ ๋ฉด์
- SQL
- ํผ๊ณต๋จ
- ์๋๋ก์ด๋
- ์ค๋ธ์
- MySQL
- ์นด์นด์ค์ฝํ
- Til
- ์ธํ๋ฐ
- ํผ๊ณต์ฑ๋ฆฐ์ง
- groupby
- ์คํฐ๋
- ํผ๊ณตํ
- ์๋ฃ๊ตฌ์กฐ
- Android
- select
- ์๋ฐ
- ์๋๋ก์ด๋์คํ๋์ค
- ์ ์ฒ๊ธฐ
- ์๊ณ ๋ฆฌ์ฆ
- Today
- Total
Welcome! Everything is fine.
TableNow ๊ฐ๋ฐ ํ๊ณ #1 โ API ์ค๊ณ, ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง, ์์คํ ์ํคํ ์ฒ์ ์ด๊ธฐ ๊ตฌํ ๋ณธ๋ฌธ
TableNow ๊ฐ๋ฐ ํ๊ณ #1 โ API ์ค๊ณ, ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง, ์์คํ ์ํคํ ์ฒ์ ์ด๊ธฐ ๊ตฌํ
๊ฐ๋ฐ๊ณฐ๋ฐ 2025. 4. 10.๐ฝ๏ธ์ต์ข ํ๋ก์ ํธ ์์!
๋๋์ด ์ต์ข ํ๋ก์ ํธ๋ฅผ ์์ํ๋ค. ์ฌ์ค ๋ฒ์จ 2์ฃผ์ฐจ๊ฐ ๋๋ฌ์ง๋ง ์ ์ ์์ด ๋ฌ๋ ค์ค๋ค๋ณด๋ ๋ธ๋ก๊ทธ์ ๊ธฐ๋ก์ ํ์ง ๋ชปํ๋ค.
ํ ์ฃผ๊ฐ ๋๋ ๋๋ง๋ค ๊พธ์คํ ๊ธฐ๋กํ๋ ์ต๊ด์ ๊ฐ์ง์.โ๐ป
์ฐ๋ฆฌ ํ์ ํ ์ด๋ธ๋ง ์๋น์ค๋ฅผ ์ฃผ์ ๋ก ์ ํ๋ค!
- ํ๋ก์ ํธ๋ช : TableNow (ํ ์ด๋ธ๋์ฐ)
- ์ฃผ์ : ์๋น์ ์์ฝํ๊ณ ๋ฐฉ๋ฌธํ ์ ์๋ ์ค์๊ฐ ์์ฝ ๊ด๋ฆฌ ์์คํ
๐ 1 ~ 2์ฃผ์ฐจ ์ผ์
- S.A ์์ฑ ํ ํผ๋๋ฐฑ ๋ฐ๊ธฐ
- ๊ธฐ๋ณธ ๊ธฐ๋ฅ ๊ฐ๋ฐ ์๋ฃ
- ๊ธฐ๋ณธ ๊ธฐ๋ฅ ๊ฐ๋ฐ ํ ์ฝ๋๋ฆฌ๋ทฐ ๋ฐ๊ธฐ
ํต์ฌ ๊ธฐ๋ฅ
์ฐ๋ฆฌ ํ์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค.
์ธ์ฆ/๋ณด์ | Spring Security + JWT Refresh Token ์ ์ฅ ๋ฐ ๊ด๋ฆฌ(Redis) OAuth2.0 ๋ก๊ทธ์ธ ์ฐ๋ |
๊ฒ์/์บ์ฑ | ์ธ๊ธฐ ๊ฒ์์ด ์บ์ฑ(Redis) Elasticsearch |
๋์์ฑ ์ ์ด | Redisson Redis Sorted Set |
MQ | RabbitMQ |
๋๋ ์์ฝ/์ด๋ฒคํธ ๋๋ฉ์ธ์ ๋งก์๊ณ , ๋์์ฑ ์ ์ด๋ ์ฒ์์ด์ด์ ํต์ฌ ๊ธฐ์ ์ ๋ํด ๊ณ ๋ฏผ์ด ๋ง์๋ค.
๊ธฐ์ ์ ์์ฌ๊ฒฐ์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
Redisson (๋ถ์ฐ ๋ฝ)
๐ ๋ชฉ์ : ์์ฝ ๋ฐ ์ด๋ฒคํธ ์์ฒญ ์ ์ค๋ณต ์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ถ์ฐ ๋ฝ ๊ตฌํ
[์ ํ ์ด์ ]
- Redis ๊ธฐ๋ฐ์ผ๋ก ๋น ๋ฅด๊ณ ๊ฐ๋ณ๊ฒ ๋ฝ์ ์ ์ด ๊ฐ๋ฅ
- Redisson์ ๋ค์ํ ๋ฝ ํ์ ์ง์ (Fair, Reentrant ๋ฑ)
- TTL ์ค์ ์ผ๋ก ๋ฐ๋๋ฝ ๋ฐฉ์ง ๊ฐ๋ฅ
- Spring Boot์์ ํตํฉ์ด ์ฌ์
[๋ค๋ฅธ ๊ธฐ์ ๊ณผ์ ๋น๊ต]
- DB ํธ๋์ญ์ ๋ฝ (SELECT ... FOR UPDATE): ๋จ์ผ DB ํ๊ฒฝ์์๋ ๊ฐ๋ฅํ์ง๋ง, ๋ถ์ฐ ํ๊ฒฝ์์๋ ์ฌ์ฉ ๋ถ๊ฐ
- ZooKeeper: ๊ณ ์ ๋ขฐ ๋ฝ์ ์ ๊ณตํ์ง๋ง ์ด์ ๋ณต์ก๋๊ฐ ๋งค์ฐ ๋์
[๊ฒฐ๋ก ]
๋ณต์กํ ๋ฝ ์์คํ
์ ์ฐ๊ธฐ๋ณด๋ค, Redis ๊ธฐ๋ฐ์ ๊ฐ๋จํ๋ฉด์๋ ์์ ์ ์ธ ๋ฝ์ ํ์์ฑ์ ๋๊ปด Redisson์ผ๋ก ๊ฒฐ์ ํ๋ค.
๋ํ ๋ค๋ฅธ ๋๋ฉ์ธ์์๋ Redis๋ฅผ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ์ถ๊ฐ์ ์ธ ๋ฆฌ์คํฌ ์์ด ๋์
์ด ๊ฐ๋ฅํ๋ค.
Redis Sorted Set - ์๊ฐ ๊ธฐ๋ฐ ํธ๋ฆฌ๊ฑฐ ์ฒ๋ฆฌ
๐ ๋ชฉ์ : ๋ฆฌ๋ง์ธ๋ ์๋ฆผ, ์ด๋ฒคํธ ์คํ๊ณผ ๊ฐ์ด ํน์ ์๊ฐ์ ๋ฐ์ํด์ผ ํ๋ ์์ ์ ์ค์ผ์ค๋ง
[์ ํ ์ด์ ]
- Sorted Set์ score์ timestamp๋ฅผ ์ฌ์ฉํด ์๊ฐ์ ์ ๋ ฌ ๊ฐ๋ฅ
- ์ฃผ๊ธฐ์ ์ธ polling์ผ๋ก ์คํ ๋์๋ง ๋น ๋ฅด๊ฒ ์ถ์ถ ๊ฐ๋ฅ
- ๋ฐฐ์น๋ณด๋ค ์ค์๊ฐ์ ๊ฐ๊น๊ณ , ๊ตฌํ๊ณผ ์ด์์ด ๊ฐํธํจ
- Redis ์ธํ๋ผ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ด ๋์ ๋น์ฉ ๊ฑฐ์ ์์
[๋ค๋ฅธ ๊ธฐ์ ๊ณผ์ ๋น๊ต]
- Quartz Scheduler: ์ ๊ธฐ์ ์ธ ์์ ์ ์ ๋ฐํ๊ฒ ๊ด๋ฆฌํด์ผ ํ ๋ ์ฌ์ฉํจ
- RabbitMQ Delayed Queue: ๊ตฌํ ๋ณต์กํ๊ณ ์ ์ฐ์ฑ ๋ฎ์, ์ง์ฐ ์๊ฐ ๊ธฐ๋ฐ(ex. 5๋ถ ๋ค, 10๋ถ ๋ค)์ด๋ผ ํน์ ์๊ฐ ํธ๋ฆฌ๊ฑฐ์๋ ๋ถํธํจ
- ์ผ๋ฐ DB + ๋ฐฐ์น: ์ค์๊ฐ ๋ฐ์์ด ์ด๋ ต๊ณ ๋ฆฌ์์ค ๋ญ๋น๊ฐ ๋ ์ ์์
[๊ฒฐ๋ก ]
์๊ฐ์ score๋ก ์ค์ ํ์ฌ ์ ํํ ์๊ฐ์ ๋ง์ถฐ์ ์์
์ ํธ๋ฆฌ๊ฑฐํ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฆฌ๋ง์ธ๋ ์๋ฆผ, ์ด๋ฒคํธ ์คํ ์๊ฐ ๋๋ฌ ์ ํธ๋ฆฌ๊ฑฐ(๊ฐ๊ฒ ์ํ ๋ณ๊ฒฝ) ์์
์ ์ ํฉํ๋ค.
๋ํ ์ด๋ฒคํธ ์คํ ์ ์ค์๊ฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ Redis๊ฐ ํจ์จ์ ์ด๋ค.
RabbitMQ - ๋น๋๊ธฐ ์ด๋ฒคํธ ์ ํ
๐ ๋ชฉ์ : ์์ฝ ์๋ฃ, ๋ฆฌ๋ง์ธ๋ ์๋ฆผ, ์ด๋ฒคํธ ์คํ ์๋ฆผ์ ๋ค๋ฅธ ๋๋ฉ์ธ์ผ๋ก ์์ ํ๊ฒ ์ ํ
[์ ํ ์ด์ ]
- ๋ฉ์์ง ์ ์ก์ ์ ๋ขฐ์ฑ ๋ณด์ฅ
- ๋น๋๊ธฐ ๋ฉ์์ง ์์คํ ์ผ๋ก ๊ฐ ๋๋ฉ์ธ ๊ฐ ๋์จํ ๊ฒฐํฉ ์ ์ง
- ๋ค์ํ ๋ฉ์์ง ํจํด (Fanout, Topic ๋ฑ)์ ์ ๊ณตํด ์ ์ฐํ ๋ผ์ฐํ ๊ฐ๋ฅ
[๋ค๋ฅธ ๊ธฐ์ ๊ณผ์ ๋น๊ต]
- Kafka: ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ค์๊ฐ, ๊ณ ์ฑ๋ฅ, ๊ณ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํ์ง๋ง ๋ก๊ทธ ๊ธฐ๋ฐ ์คํธ๋ฆฌ๋ฐ์ ์ด์ , ๋ณต์ก์ฑ ๋ฐ ์ค์ ์ด ๊ณผ๋ํจ
- Redis Pub/Sub: ์ค์ ์ด ๊ฐ๋จํ๊ณ ๋ฏธ๋ค์จ์ด๊ฐ ์์ด ๊ฐ๋ณ์ง๋ง ๋ฉ์์ง ์ ์ค ๊ฐ๋ฅ์ฑ์ด ์์
- AWS SQS: ํด๋ผ์ฐ๋ ์ข ์์ ์ด๊ณ ๋น์ฉ์ด ๋ฐ์ํ ์ ์์
[๊ฒฐ๋ก ]
MQ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ฒ์ด ์ฒ์์ด์ง๋ง, ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ ๋ก๊ทธ ์ถ์ , ์ฌ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ํฉ์ ์๋์๋ค.
๋ค๋ง ๋ฆฌ๋ง์ธ๋ ์๋ฆผ๋ฟ ์๋๋ผ ๋น์๋ฆฌ ์๋ฆผ, ์ด๋ฒคํธ ์คํ ์๋ฆผ์ฒ๋ผ ์ ์ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ ์ด๋ฒคํธ๋ค์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์
๋ฉ์์ง์ ์ ํํ ๋์ฐฉ ๋ณด์ฅ์ด ๋ฌด์๋ณด๋ค ์ค์ํ๋ค.
์ด์ ๋ฐ๋ผ Kafka๋ณด๋ค ์๋๋ ๋๋ฆฌ๋๋ผ๋, ์ ํํ ๋ฉ์์ง ์ ๋ฌ๊ณผ ์ ์ฐํ ๋ผ์ฐํ
์ด ๊ฐ๋ฅํ RabbitMQ๋ฅผ ์ ํํ๊ฒ ๋์๋ค.
์์ด์ดํ๋ ์

API ์ค๊ณ
๋ ธ์ ์ผ๋ก ํ์๋ค๊ณผ ์์ฑํ API ๋ช ์ธ์๋ค. ๋ถ๋ฅ, ๋ด๋น์, ์งํ์ฌํญ, ๋ฉ์๋, ๊ธฐ๋ฅ, URI, ์๋ต/์์ฒญ ํค๋ ๋ฐ ๋ฐ๋, ์ํ ์ฝ๋ ๋ฑ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. RESTfulํ API๋ฅผ ์ค๊ณํ๊ณ ์ ํ๋ค.

๋ฐ์ดํฐ ๋ชจ๋ธ๋ง
์ด๊ธฐ ERD๋ ๋ฆฌ๋ทฐ, ๋๊ธ, ์ข์์, ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฑ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ด ๋ง์๋ค. ํ์ง๋ง ๋น์ฆ๋์ค์ ์ผ๋ก ๋ค๊ฐ๊ฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค๋ ๊ธฐ์ ์ ์ธ ๋์ ์ ํ๋ ๊ฒ์ ์ด์ ์ ๋ง์ถ๊ธฐ๋ก ํ๋ค. ๋ฐ๋ผ์ ํ ์ด๋ธ ์๋ฅผ ์ค์ด๊ณ ๊ฐ์ ํต์ฌ์ ์ธ 1 ~ 2๊ฐ์ ๋๋ฉ์ธ๋ง ๋งก์ ์งํํ๋ค.

์๋ง ๊ธฐ์ ๊ณ ๋ํ๊ฐ ์งํ๋๋ฉด ์ข ๋ ์์ ๋ ๊ฒ์ด๋ค.
์ํคํ ์ฒ ์ค๊ณ
์ฐ๋ฆฌ ํ์ ๋ฌด์ค๋จ ๋ฐฐํฌ ๋ฐฉ์์ ์ํ๋๋ฐ, ํ์ค์ ์ธ ์ํฉ์ ๋ง์ถฐ EC2 1๋์ ์ปจํ ์ด๋ 2๊ฐ๋ฅผ ๋์ฐ๊ณ ๊ทธ ์๋จ์ Nginx์ ๊ฐ์ ์น์๋ฒ๋ฅผ ๋๋ ๋ฐฉํฅ์ผ๋ก ์ ํ๋ค. Blue-Green ๋ฐฉ์์ผ๋ก ์งํํ๊ณ ์ ํ๋ค.

ํ๋ก์ ํธ ๊ตฌ์กฐ
table-now
โโโ .github
โ โโโ ISSUE_TEMPLATE
โ โโโ feature-request-issue-template.md
โ โโโ PULL_REQUEST_TEMPLATE.md
โโโ src
โ โโโ main
โ โ โโโ java
โ โ โ โโโ org.example.tablenow
โ โ โ โโโ domain
โ โ โ โ โโโ auth
โ โ โ โ โโโ category
โ โ โ โ โโโ event
โ โ โ โ โโโ image
โ โ โ โ โโโ notification
โ โ โ โ โโโ payment
โ โ โ โ โโโ reservation
โ โ โ โ โโโ store
โ โ โ โ โโโ user
โ โ โ โ โโโ waitlist
โ โ โ โโโ global
โ โ โ โ โโโ annotation
โ โ โ โ โโโ config
โ โ โ โ โโโ dto
โ โ โ โ โโโ entity
โ โ โ โ โโโ exception
โ โ โ โ โโโ filter
โ โ โ โ โโโ security
โ โ โ โ โโโ util
โ โ โ โโโ TableNowApplication.java
โ โ โโโ resources
โ โ โโโ application.yml
โ โ โโโ application-local.yml
โ โ โโโ application-test.yml
โ โโโ test
โโโ Dockerfile
โโโ docker-compose.yml
โโโ .env
โโโ .env.local
โโโ .env.test
โโโ .gitignore
โโโ .gitattributes
โโโ build.gradle
โโโ gradlew
โโโ gradlew.bat
โโโ settings.gradle
๐ค ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ๋ ์ด๋ป๊ฒ ํ ๊น?
์ฐ๋ฆฌ๋ ํ๊ฒฝ๋ง๋ค ๋ค๋ฅธ ์ค์ ์ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด,
Spring Boot์ application.yml ๊ณ์ธต ๊ตฌ์กฐ์ .env ํ์ผ์ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ ํํ๋ค.
- application.yml : ๊ณตํต ์ค์
- application-local.yml : ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
- application-test.yml : ํ ์คํธ ํ๊ฒฝ ์ค์
์ด ์ค์ ํ์ผ๋ค๊ณผ ์ฐ๋๋๋ .env, .env.local, .env.test ํ์ผ์ ๊ฐ๊ฐ ๋ง๋ค์ด
DB ์ ์ ์ ๋ณด, Redis ์ค์ , AWS ์๊ฒฉ ์ฆ๋ช
๋ฑ ์ธ๋ถ ๋
ธ์ถ๋๋ฉด ์ ๋๋ ๋ฏผ๊ฐํ ๊ฐ์ ์ฌ๊ธฐ์ ๋ฐ๋ก ๋ถ๋ฆฌํด ๊ด๋ฆฌํ๊ณ ์๋ค.
์๋ฅผ ๋ค์ด .env.local์๋ ์๋์ ๊ฐ์ ๊ฐ๋ค์ด ๋ค์ด๊ฐ๋ค.

์ด๋ ๊ฒ ํ๋ฉด ๋ฏผ๊ฐํ ์ ๋ณด๋ Git์ ์ฌ๋ผ๊ฐ์ง ์๊ณ ,
๊ฐ ํ๊ฒฝ๋ณ๋ก .env๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฐ๋ก ์ค์ ์ด ์ ์ฉ๋์ด ํจ์ฌ ์์ ํ๊ณ ํธํ๋ค.
๐ก EnvFile ํ๋ฌ๊ทธ์ธ ํจ๊ป ์ฌ์ฉํ๊ธฐ
EnvFile ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด Run/Debug Configuration์ .env ํ์ผ์ ์ฝ๊ฒ ์ฐ๋ํ ์ ์๋ค.

์๋์ฒ๋ผ Run ์ค์ ์์ "Enable EnvFile" ์ต์ ์ ์ฒดํฌํ๊ณ ์ํ๋ .env ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ฃผ๋ฉด, ์คํ ์ ํด๋น ํ๊ฒฝ๋ณ์๋ค์ด ์๋์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ๋๋ค.

๊ธฐ๋ฅ ๊ตฌํ
2์ฃผ์ฐจ๋ ๊ธฐ์ ๊ณ ๋ํ๋ฅผ ์ํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๊ณ , ๊ฐ์ ๋ฐ์ ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ฆฌํฉํ ๋ง์ ์งํํ๋ค.
- ์์ฝ ์์ฑ, ์กฐํ, ์์ , ์ทจ์, ์ฒ๋ฆฌ ๊ธฐ๋ฅ ๊ตฌํ
- ์ด๋ฒคํธ ๋ฑ๋ก, ์กฐํ, ์์ , ์ญ์ , ์ ์ฒญ(์ฐธ์ฌ) ๊ธฐ๋ฅ ๊ตฌํ
๊ตฌํํ ๋ถ๋ถ์ ์ผ์ผ์ด ์ ๊ธฐ์ ์์ด ๋ง๊ณ ๊ธฐ๋ณธ์ ์ธ ์ฝ๋๋ง ์์ด์ ๋ด๊ฐ ์ ๊ฒฝ ์ด ๋ถ๋ถ, ๋ฆฌํฉํ ๋ง ํ ๋ถ๋ถ, ๊ณ ๋ฏผํ๋ ์ ๋ฑ์ ๊ฐ๋จํ ์ ์ด๋ณธ๋ค.
๊ฒ์ฆ ์ฑ ์ ๋ถ๋ฆฌ
์์ฝ ๊ธฐ๋ฅ์์๋ ์์ฝ ๊ฐ๋ฅ ์ฌ๋ถ, ์ค๋ณต ์ฌ๋ถ, ๋งค์ฅ ์ํ ๋ฑ์ ๋ค์ํ ์กฐ๊ฑด์ ๊ฒ์ฆํด์ผ ํ๋ค. ์กฐ๊ฑด์ด ๋ณต์กํด์ง์๋ก ์ฝ๋๊ฐ ๋น๋ํด์ง ์ ์๊ธฐ ๋๋ฌธ์, ๊ฒ์ฆ ์ฑ ์์ ๋ฉ์๋ ๋จ์๋ก ๋ถ๋ฆฌํ์ฌ ํด๋ฆฐ ์ฝ๋ ์์น(๋จ์ผ ์ฑ ์, ๊ฐ๋ ์ฑ, ์ ์ง๋ณด์์ฑ)์ ๊ณ ๋ คํด ์ค๊ณํ๋ค. ์ด ๋ถ๋ถ์ ํํฐ๋๊ป์๋ ์ ๊ตฌ์ฑํ๋ค๊ณ ๊ธ์ ์ ์ธ ํผ๋๋ฐฑ์ ์ฃผ์ จ๋ค.
์๋๋ ์ค์ ๋ก ๋ถ๋ฆฌํ ๊ฒ์ฆ ๋ฉ์๋๋ค์ด๋ค.

์ด๋ ๊ฒ ๋ถ๋ฆฌํ ๊ฒ์ฆ ๋ก์ง์ ๋ฉ์๋ ๋ด์์ ๋ค์๊ณผ ๊ฐ์ด ์์ฝ ์์ฑ ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๋ช ํํ ์ํํ๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค.

๋๋ฉ์ธ์ด ์ฑ ์์ง๋ ์์ฝ ๋ณ๊ฒฝ ๋ก์ง
์์ฝ ์ํ ๋ณ๊ฒฝ ๋ก์ง์ ๋จ์ํ ์๋น์ค ๋ ์ด์ด์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ, ์์ฝ ๋๋ฉ์ธ ์์ฒด๊ฐ ๊ทธ ์ฑ
์์ ๊ฐ์ง๋๋ก ๊ตฌ์ฑํ๋ค.
์๋ฅผ ๋ค์ด tryCancel() ๋ฉ์๋๋ ๋จ์ํ setter๊ฐ ์๋๋ผ, ์์ฝ์ด ์ทจ์ ๊ฐ๋ฅํ ์ํ์ธ์ง ์์ฒด ๊ฒ์ฆ์ ํฌํจํ ๋ช
ํํ ๋๋ฉ์ธ ํ์๋ก ์ ์๋์ด ์๋ค.
๋ํ ๋ฉ์๋ ๋ค์ด๋ฐ๋ tryCancel, updateStatus์ฒ๋ผ ์๋๋ฅผ ์ ๋๋ฌ๋ด๋ ์ด๋ฆ์ผ๋ก ๊ตฌ์ฑํ์ฌ ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋๋ ๋๋ฉ์ธ ํ๋ฆ์ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ํ๋ค.

์๋น์ค ๋ ์ด์ด์์๋ ๋จ์ํ ํด๋น ๋๋ฉ์ธ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ตฌ์กฐ๋ก, ์ฑ ์์ด ์์ฐ์ค๋ฝ๊ฒ ๋๋๋ค.

์๋น์ค ๋ก์ง์์ ์ง์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋์ , ๋๋ฉ์ธ ๊ฐ์ฒด์๊ฒ ๊ทธ ์ฑ ์์ ์์ํจ์ผ๋ก์จ ๋น์ฆ๋์ค ๋ก์ง์ ๋์ฑ ๋ช ํํ๊ณ ๊ฒฌ๊ณ ํ๊ฒ ๊ด๋ฆฌํ ์ ์์๋ค. ๋ฌผ๋ก ์ด๋ฐ ๋ฐฉ์์ด ๋ชจ๋ ์ํฉ์ ์ ๋ต์ ์๋์ง๋ง, ์ํฉ์ ๋ฐ๋ผ ์ ํ๋จํด์ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
์์ฝ ์๊ฐ ๊ฒ์ฆ ๋ฆฌํฉํ ๋ง
์ด๊ธฐ์๋ ์์ฝ ์๊ฐ์ ์ ํจ์ฑ์ ์๋น์ค๋จ์์ ๋ฉ์๋๋ก ์ง์ ๊ฒ์ฆํ๋ค.
์๋์ ๊ฐ์ด validateReservedAtHalfHour() ๋ฉ์๋๋ฅผ ํตํด ์ ์(00๋ถ) ๋๋ 30๋ถ ๋จ์๊ฐ ์๋ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๋ฐฉ์์ด์๋ค.

ํ์ง๋ง ํํฐ๋์ผ๋ก๋ถํฐ "์์ฒญ DTO์ ๋จ์ผ ํ๋ ์ ํจ์ฑ์ ์ปจํธ๋กค๋ฌ ๋จ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ ์ ํ๋ค" ๋ ํผ๋๋ฐฑ์ ๋ฐ๊ณ , ํด๋น ๊ฒ์ฆ ์ฑ ์์ ์์ฒญ ๊ฐ์ฒด ์ชฝ์ผ๋ก ์ด๋ํ๋ค. ์ด์ ๋ฐ๋ผ ๋ค๋ฅธ ํ์ ๋ถ์ด ํ์ ๋ฐฉ์์ ๋ฐ๋ผ ์ปค์คํ ์ด๋ ธํ ์ด์ @HalfHourOnly๋ฅผ ์ด์ฉํด ์ปจํธ๋กค๋ฌ ์ง์ ์์ ์์ ์ ๋ ฅ๊ฐ์ ํ์์ ๊ฒ์ฆํ ์ ์๋๋ก ๋ฆฌํฉํ ๋งํ๋ค.

๊ฒ์ฆ ๋ก์ง์ ์ปจํธ๋กค๋ฌ ๋จ์ผ๋ก ์ด๋์ํด์ผ๋ก์จ ์๋น์ค ๋จ์ ์ฑ ์์ ๋ช ํํ ํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง ํ๋ฆ์ ๋ ๊น๋ํ๊ฒ ์ ์งํ ์ ์์๋ค.

DB Lock ๊ตฌํ
์ฒ์์๋ ์ ๋ง ๊ธฐ๋ณธ ๊ธฐ๋ฅ๋ง ๊ตฌํํ ํ Redisson์ ์ ์ฉํ๋ ค๊ณ ํ๋๋ฐ, ๋ง์ ์งํํ๋ ค๋ ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ฌ์ ๋ฒ ์ด์ค ๋ผ์ธ์ผ๋ก ํ๊ธฐ์๋ ๋ถ์คํ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๊ณ ๋ฏผํ๋ค๊ฐ ํํฐ๋๊ป ์ง๋ฌธํ๋ "ํ์ฌ ์ํฉ๊ณผ Redisson ๋ฝ ์ ์ฉ์ ๋น๊ตํ๋ ๊ฒ์ ํฌ๊ฒ ์๋ฏธ๊ฐ ์๋ค" ๋ผ๊ณ ํ์ จ๋ค. ๋ฐ๋ผ์ ์ถํ ๋น๊ต๋ฅผ ํ๋ค๋ฉด DB ๋ฝ vs Redisson ๋ถ์ฐ ๋ฝ์ ํด๋ณด๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ฐ์ ์ DB ๋ฝ์ ๋จผ์ ์ ์ฉํด๋ณด๊ธฐ๋ก ํ๊ณ , JMeter๋ ์ตํ ๊ฒธ v1๊ณผ v2๋ฅผ ๋๋ ์งํํ๋ค.
- v1 : ๋ณ๋์ ๋ฝ ์์ด ๊ธฐ๋ณธ ๋ก์ง ๊ตฌํ
- v2 : Pessimistic Lock(DB ๋ฝ)์ ์ ์ฉํด ์ค๋ณต ์ฐธ์ฌ ๋ฐฉ์ง ๋ฐ ์ ํฉ์ฑ ํ๋ณด
์ฝ๋ ์์ฒด๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ๋์ผํ๋ค. v2์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋น๊ด์ ๋ฝ์ด ์ ์ฉ๋ findByIdForUpdate() ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ์จ๋ค.

์ ์์ด 10๋ช ์ธ ์ด๋ฒคํธ์ 200๋ช ์ด ๋์์ ์ด๋ฒคํธ๋ฅผ ์ ์ฒญํ๋ค๊ณ ๊ฐ์ ํ๊ณ ํ ์คํธ ํด๋ณด๋, ๊ทธ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์๋ค.




์ ๋ฆฌํด๋ณด๋ฉด, No Lock ๋ฒ์ ์ ์๋ต ์๋๋ ๋น ๋ฅด์ง๋ง ์ด๊ณผ ์ ์ฒญ์ด ๋ฐ์ํด ์ ํฉ์ฑ์ด ๊นจ์ก๋ค.
๋ฐ๋ฉด, DB Lock์ ์ ์ฉํ ๋ฒ์ ์ ์๋ต ์๊ฐ๊ณผ ์ฒ๋ฆฌ๋์ ๊ฐ์ํ์ง๋ง, ์ ํํ 10๋ช ๋ง ์ ์ฒญ๋๋ฉฐ ์ ํฉ์ฑ์ ๋ณด์ฅํ ์ ์์๋ค.
Redisson ๊ธฐ๋ฐ ๋ถ์ฐ ๋ฝ(v3) ์ ์ฉ ์์๋ ์ด ๋ ๊ฐ์ง ์์๋ฅผ ๋ชจ๋ ๊ฐ์ ํ๋ ๋ฐฉํฅ์ผ๋ก ๊ณ ๋ํ๋ฅผ ์งํํ ์์ ์ด๋ค.
ํญ๋ชฉ | No Lock | DB Lock |
์์ฒญ ์ | 200 | 200 |
ํ๊ท ์๋ต ์๊ฐ | 53ms ๐ข | 415ms ๐ด |
์ต๋ ์๋ต ์๊ฐ | 199ms | 753ms |
์๋ฌ์จ | 90.50% | 95.00% |
Throughput | 507.6/sec ๐ข | 233.9/sec |
์ ์ก/์์ KB/sec | 208.22 / 109.06 | 94.20 / 50.26 |
ํ ์คํธ
ํ์ฌ๋ DB ๋ฝ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฒคํธ ์ ์ฒญ API์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ ์์ผ๋ฉฐ, JMeter๋ฅผ ํ์ฉํด ์ ํฉ์ฑ ์ค์ฌ์ ํ
์คํธ๋ฅผ ์ํํ๋ค.
๋จ์ผ ์์ฒญ ๊ธฐ์ค์ API๋ Postman์ผ๋ก ์ถฉ๋ถํ์ง๋ง, ์ด๋ฒคํธ์ ๊ฐ์ด ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ์ ๊ทผํ ์ ์๋ ๊ธฐ๋ฅ์ ๋ํด์๋
๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์์์น ๋ชปํ ์ถฉ๋์ด ์๋์ง ์ค์ ์ ์ผ๋ก ๊ฒ์ฆํ๋ค.
์ดํ Redisson ์ ์ฉ ์, ๋์ผํ ์๋๋ฆฌ์ค๋ก ์ฑ๋ฅ ๋ฐ ์์ ์ฑ ํ
์คํธ๋ฅผ ์งํํด๋ณผ ์์ ์ด๋ค.
Postman
- ์ฃผ์ ์ฉ๋: REST API ๊ธฐ๋ณธ ๊ธฐ๋ฅ ํ ์คํธ ๋ฐ ๋น ๋ฅธ ๊ฒ์ฆ
- ํ์ฉ ๋ด์ฉ
- ์ธ์ฆ, ํ์๊ฐ์ , ์์ฝ, ์ด๋ฒคํธ ๋ฑ API์ ์ ์ ์๋ต/์๋ฌ ์๋ต ํ์ธ
- ๋ค์ํ ์์ฒญ ์๋๋ฆฌ์ค๋ฅผ ํ๊ฒฝ ๋ณ์ ์ค์ ์ ํตํด ๋ฐ๋ณต ์คํ
- ํ์ ๊ฐ ๊ณต์ ๋ฅผ ์ํด ํ ์คํธ ์ปฌ๋ ์ ๊ตฌ์ฑ ๋ฐ ๋ฌธ์ํ
JMeter
- ์ฃผ์ ์ฉ๋: ์ด๋ฒคํธ ์ ์ฒญ API ๋ฑ ๋์์ฑ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ ๊ตฌ๊ฐ์ ์ ํฉ์ฑ ํ ์คํธ, ์ฑ๋ฅ ํ ์คํธ
- ํ์ฉ ๋ด์ฉ
- ํ์ฌ๋ DB ๋ฝ(Pessimistic Lock)์ ์ ์ฉํ ์ํ
- ์ด๋ฒคํธ ์ ์ฒญ ์ ์ค๋ณต ์ฐธ์ฌ๋ ์ด๊ณผ ์ ์ฒญ์ด ๋ฐ์ํ์ง ์๋์ง ํ์ธ
- ๋ค์ํ ์ค๋ ๋ ์๋ก ์๋ฎฌ๋ ์ด์ ํ๋ฉฐ ์ ํฉ์ฑ ์ ์ง ์ฌ๋ถ ์ฒดํฌ
- ์ฑ๋ฅ๋ณด๋ค ๋ฐ์ดํฐ ์ถฉ๋ ๋ฐฉ์ง ๋ฐ ๋์ ์์ฒญ ์ ์์ ์ฑ ํ์ธ์ด ๋ชฉ์
- ํฅํ Redisson ๋ถ์ฐ ๋ฝ ์ ํ ์ ๋น๊ต ํ ์คํธ๋ฅผ ์ํ ๊ธฐ๋ฐ ๋ง๋ จ