CoinFlow๋ ๋จ์ผ ์ธ์คํด์ค ํ๊ฒฝ์์ ์ง์ ๊ฐ ์ฃผ๋ฌธ ์์ฑ, ๊ฐ๊ฒฉ-์๊ฐ ์ฐ์ ๋งค์นญ, ์ฒด๊ฒฐ, ์ง๊ฐ ์ ์ฐ, ์์ฅ ๊ธฐ๋ก๊น์ง ๊ฒ์ฆํ๋ ์ํธํํ ๊ฑฐ๋์ ์ฝ์ด ๋ฐฑ์๋ MVP์ ๋๋ค.
์ด ํ๋ก์ ํธ๋ ์ค์๊ฐ ์์ธ๋ ๋ถ์ฐ ์ธํ๋ผ๋ณด๋ค ์ฃผ๋ฌธ๊ณผ ์์ฐ ์ ํฉ์ฑ์ ์ฐ์ ํฉ๋๋ค. ์ฃผ๋ฌธ์ด ์ฒด๊ฒฐ๋ ๋ orders, trades, wallets, wallet_ledgers, domain_events๊ฐ ์ผ๊ด๋๊ฒ ๊ธฐ๋ก๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- ํ์๊ฐ์ , ๋ก๊ทธ์ธ, JWT access token ์ธ์ฆ
- ์ฌ์ฉ์๋ณ ์ง๊ฐ ์๋ ์์ฑ ๋ฐ ๋ฐ์ดํฐ ๋ถ๋ฆฌ
- ์ง์ ๊ฐ
BUY/SELL์ฃผ๋ฌธ ์์ฑ - ์ฃผ๋ฌธ ์ทจ์
- ๊ฐ๊ฒฉ ์ฐ์ , ์๊ฐ ์ฐ์ ๋งค์นญ
- ๋ถ๋ถ ์ฒด๊ฒฐ, ์์ ์ฒด๊ฒฐ
- BUY ์ฃผ๋ฌธ quote asset ์ ๊ธ, SELL ์ฃผ๋ฌธ base asset ์ ๊ธ
- ์ฒด๊ฒฐ ์ buyer/seller ์ง๊ฐ ์ ์ฐ
- append-only ์ง๊ฐ ์์ฅ ๊ธฐ๋ก
- ์์ฅ, ์ค๋๋ถ, ์ต๊ทผ ์ฒด๊ฒฐ, ์ฌ์ฉ์ fill, ์ง๊ฐ, ์์ฅ ์กฐํ
- ์๋ฒ ์์ ์ DB์ ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ์ผ๋ก ์ธ๋ฉ๋ชจ๋ฆฌ ์ค๋๋ถ ์ด๊ธฐํ
- ์ฃผ๋ฌธ/์ฒด๊ฒฐ/์ ์ฐ ๋๋ฉ์ธ ์ด๋ฒคํธ ๋ก๊ทธ ์ ์ฅ
- ์ ๊ธ/์ถ๊ธ
- ์์ฅ๊ฐ ์ฃผ๋ฌธ
- IOC/FOK/GTT, post-only, iceberg ์ฃผ๋ฌธ
- ์์๋ฃ
- refresh token, OAuth/social login, role/permission
- Kafka ๊ธฐ๋ฐ ์ด๋ฒคํธ ๋ฐํ
- WebSocket ์ค์๊ฐ ์ฒด๊ฒฐ/ํธ๊ฐ push
- Redis, MQ, ์๋ฒ ๋ถ๋ฆฌ
- replay, redrive, reconciliation
- ๊ด๋ฆฌ์ ํ์ด์ง
์ผ๋ถ ๋ก์ปฌ ๊ฐ๋ฐ ํธ์๋ฅผ ์ํ API์ ์ธํ๋ผ ๊ธฐ๋ฐ์ ์กด์ฌํ์ง๋ง, ์ด์ ๊ธฐ๋ฅ ๋ฒ์์ ๊ตฌ๋ถํฉ๋๋ค. ์๋ฅผ ๋ค์ด dev/test ์
๊ธ ๋ณด์กฐ API๋ prod ํ๋กํ์์ ์ ์ธ๋๋ฉฐ, Kafka ์ปจํ
์ด๋๋ ๋ก์ปฌ ์ธํ๋ผ ๊ธฐ๋ฐ์ผ ๋ฟ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์๋ spring-kafka producer/consumer๊ฐ ์ฐ๊ฒฐ๋์ด ์์ง ์์ต๋๋ค.
Phase 1 ์๋ฃ ์ดํ ๋ฆฌ๋ทฐ ๊ณผ์ ์์ zero-quote ์ฒด๊ฒฐ ๋ฐฉ์ง, dust maker ์๋ ์ทจ์, ์ค๋๋ถ ์ฌ๋น๋ ๊ฐ์ ์ ํฉ์ฑ ๋ณด๊ฐ์ด ์ถ๊ฐ๋์์ต๋๋ค.
| ์ฃผ์ | ์ค๊ณ |
|---|---|
| Source of truth | DB์ ์ฃผ๋ฌธ, ์ฒด๊ฒฐ, ์ง๊ฐ, ์์ฅ์ ๊ธฐ์ค ์ํ๋ก ๋ก๋๋ค. |
| ์ธ๋ฉ๋ชจ๋ฆฌ ์ค๋๋ถ | ๋งค์นญ ํ๋ณด ์กฐํ์ ํธ๊ฐ ์กฐํ๋ฅผ ์ํ ํ์ ์ํ์ ๋๋ค. |
| ์ค๋๋ถ ๋ฐ์ | DB commit ์ดํ์๋ง ์ธ๋ฉ๋ชจ๋ฆฌ ์ค๋๋ถ์ ๋ณ๊ฒฝํฉ๋๋ค. |
| ์์ฐจ ์ฒ๋ฆฌ | ๊ฐ์ ์์ฅ์ ์ฃผ๋ฌธ ์์ฑ/์ทจ์๋ market๋ณ ReentrantLock์ผ๋ก ์ง๋ ฌํํฉ๋๋ค. |
| DB ๋์์ฑ | sequence, wallet, maker order ๊ฐฑ์ ์ pessimistic lock์ ์ฌ์ฉํฉ๋๋ค. |
| ์ง๊ฐ ๋ชจ๋ธ | available_balance์ locked_balance๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. |
| ์์ฅ | ๋ชจ๋ ์ง๊ฐ ๋ณ๊ฒฝ์ wallet_ledgers์ append-only๋ก ๊ธฐ๋กํฉ๋๋ค. |
| ์ด๋ฒคํธ | domain_events๋ฅผ ๋ด๋ถ ์ด๋ฒคํธ ๋ก๊ทธ๋ก ์ ์ฅํ๊ณ , ์ดํ Outbox ํ์ฅ ๊ฒฝ๊ณ๋ฅผ ๋จ๊น๋๋ค. |
- Java 21
- Spring Boot 3.5
- Spring Web MVC
- Spring Security + OAuth2 Resource Server + JWT
- Spring Data JPA
- MySQL 8
- Flyway
- JUnit 5, AssertJ
- Testcontainers MySQL
- Actuator, Micrometer, Prometheus registry
- Docker Compose
docker compose up -d mysqldocker-compose.yml์๋ Kafka ์ปจํ
์ด๋๋ ํฌํจ๋์ด ์์ง๋ง, ํ์ฌ MVP ์ ํ๋ฆฌ์ผ์ด์
์คํ์๋ MySQL๋ง ํ์ํฉ๋๋ค.
./gradlew bootRun๊ธฐ๋ณธ DB ์ ์ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
spring.datasource.url=jdbc:mysql://localhost:3306/coinflow?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
spring.datasource.username=coinflow
spring.datasource.password=coinflow๋ค๋ฅธ ํฌํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉด ํ์ผ์ ์์ ํ์ง ์๊ณ ํ๊ฒฝ ๋ณ์๋ก ์ฃผ์ ํฉ๋๋ค.
DB_URL='jdbc:mysql://localhost:3307/coinflow?serverTimezone=Asia/Seoul&characterEncoding=UTF-8' ./gradlew bootRun์ ํ๋ฆฌ์ผ์ด์ ์คํ ํ Swagger UI์์ API๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
http://localhost:8080/swagger-ui/index.html
์ ์ฒด ํ ์คํธ๋ ๋ค์ ๋ช ๋ น์ผ๋ก ์คํํฉ๋๋ค.
./gradlew testํตํฉ ํ ์คํธ๋ Testcontainers ๊ธฐ๋ฐ MySQL์ ์ฌ์ฉํด decimal, foreign key, transaction ๊ฒฝ๊ณ์ ํต์ฌ ์ ํฉ์ฑ ์๋๋ฆฌ์ค๋ฅผ ์ค์ MySQL์ ๊ฐ๊น๊ฒ ๊ฒ์ฆํฉ๋๋ค. ๋์์ฑ ํ ์คํธ์ ๋ถํ ํ ์คํธ๋ ๋ค์ ๋จ๊ณ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
์ฃผ์ ๊ฒ์ฆ ๋ฒ์:
- ํ์๊ฐ์ , ๋ก๊ทธ์ธ, JWT ์ธ์ฆ
- BUY/SELL ์ฃผ๋ฌธ ์์ฐ ์ ๊ธ
- ๊ฐ๊ฒฉ ์ฐ์ ๋งค์นญ
- ๋ถ๋ถ ์ฒด๊ฒฐ, ์์ ์ฒด๊ฒฐ
- BUY taker ๊ฐ๊ฒฉ ์ฐจ์ด ํ๋ถ
- SELL taker ์ ์ฐ
- ๋ถ๋ถ ์ฒด๊ฒฐ ํ ์ทจ์
- ์๊ธฐ ์ฒด๊ฒฐ ๊ฑฐ์
- ์์ฅ ๊ธฐ๋ก
- ์ค๋๋ถ ์กฐํ
- ๋๋ฉ์ธ ์ด๋ฒคํธ ์ ์ฅ
- ์ง๊ฐ ์๊ณ ์์ ๋ฐฉ์ง
| ๋ฌธ์ | ์ค๋ช |
|---|---|
| PRD | MVP ์ ํ ๋ฒ์, ํฌํจ/์ ์ธ ๊ธฐ์ค, ์ฑ๊ณต ๊ธฐ์ค |
| Plan | MVP ๊ตฌํ ์์์ ์ค๊ณ ์์น |
| API | REST API ๊ณ์ฝ๊ณผ ์๋ฌ ์ฝ๋ |
| ERD | ํ ์ด๋ธ ๊ตฌ์กฐ์ ๊ด๊ณ |
| Test Plan | ํต์ฌ ํตํฉ ํ ์คํธ ์๋๋ฆฌ์ค |
| Order Flow | ์ฃผ๋ฌธ ์์ฑ๋ถํฐ ์ฒด๊ฒฐ/์ ์ฐ/์ค๋๋ถ ๋ฐ์๊น์ง์ ๋ด๋ถ ํ๋ฆ |
| Issues | Phase 1 ์ดํ ์ฝ๋ ๋ฆฌ๋ทฐ ์ด์์ ๋ณด๊ฐ ๋ด์ฉ |
| Reference | ์ค๊ณ ํ๋จ ๊ทผ๊ฑฐ์ ์ธ๋ถ ๊ฑฐ๋์ API ๋ ํผ๋ฐ์ค |
ํ์ฌ ๊ตฌํ ์๋ฃ ๋ฒ์๋ Phase 1 MVP์ ๋๋ค. ๋ค์ ๋จ๊ณ์์๋ ์ด๋ฒคํธ ๋ฐํ๊ณผ ์ค์๊ฐ ์ ํ๋ฅผ ๋ณ๋ ์ด์๋ก ํ์ฅํฉ๋๋ค.
- OutboxPublisher ๊ตฌํ
domain_events.published=false์ด๋ฒคํธ Kafka ๋ฐํ- Kafka ๋ฐํ ์ฑ๊ณต/์คํจ ์ํ์ ์ฌ์๋ ํ์ ๊ด๋ฆฌ
- Kafka Consumer ๊ธฐ๋ฐ WebSocket ์ฒด๊ฒฐ/์ค๋๋ถ broadcast
- ์ ์ฐ Batch์ ๋ถํ ํ ์คํธ ์ถ๊ฐ
Kafka, WebSocket, Batch ์ ์ฐ์ ์์ง ๊ตฌํ ์๋ฃ ๊ธฐ๋ฅ์ผ๋ก ํ๊ธฐํ์ง ์์ต๋๋ค.