2025 ํ๋ก๊ทธ๋๋จธ์ค ๋ฐฑ์๋ ๋ฐ๋ธ์ฝ์ค 4๊ธฐ 5ํ์ฐจ 9ํ ์๊ณ ๋ฅด๋ฐฑ๊ตฌ์ ํ๋ก์ ํธ์ ๋๋ค.
| Name | GitHub | Role |
|---|---|---|
| ์ดํ์ | 2hwayoung | ํ ๋ฆฌ๋ฉ, ํ๋ก์ ํธ ๊ด๋ฆฌ, Upbit WebSocket ์ฐ๋, ํธ๊ฐ ์ ๋ณด ์กฐํ, ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ, GitHub Action CI |
| ๊นํ์ฐ | xaxeon | ๊ธ๋ก๋ฒ ์์ธ ์ฒ๋ฆฌ, ๋ง์ผ ๋ชฉ๋ก ์กฐํ ๋ฐ ์ฝ์ธ ๋์๋ณด๋, ๋ถ๋งํฌ ์ถ๊ฐ/์ญ์ , ์์ ๋ก๊ทธ์ธ |
| ์ด์น๋ฏผ | min429 | ์น์์ผ ํด๋ผ์ด์ธํธ(ํ๋ก ํธ), ํ์ฌ๊ฐ ์กฐํ, ํธ์ ์๋ฆผ, Swagger ์ปค์คํ , GitHub Action CD |
| ์ฅ๋ฌด์ | wkdan | ์ฌ์ฉ์ ์ธ์ฆ, ์บ๋ค ์ฐจํธ ์กฐํ, ์ฑํ ๊ธฐ๋ฅ, ๊ด๋ จ ๋ด์ค ๊ธฐ๋ฅ, ๊ด๋ฆฌ์ ๊ถํ ๋ฐ Security ์ค์ |
๐ก ์ค์๊ฐ ์ฝ์ธ ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ๋ถ๋งํฌ ๋์๋ณด๋ ์๋น์ค
์ด์ ์ฌ์ดํธ: https://coing-ashen.vercel.app
์ด ํ๋ก์ ํธ์ ๋ชฉํ๋ ์ค์๊ฐ ์ฝ์ธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ๊ฐ์ธํ๋ ํฌ์ ์ธ์ฌ์ดํธ๋ฅผ ์ ๊ณตํ๋ ์น ์๋น์ค ์ฝ์(Coing)์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค. ์ ๋นํธ OpenAPI ๋ฐ WebSocket์ ํ์ฉํด ๋ค์ํ ์ํธํํ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์์งํ๊ณ , ์ฌ์ฉ์๊ฐ ๊ด์ฌ ์๋ ์ฝ์ธ์ ๋ถ๋งํฌํ์ฌ ๊ฐ์ธํ๋ ๋์๋ณด๋๋ฅผ ๊ตฌ์ฑํ ์ ์๋๋ก ํ์ฌ ํฌ์์๋ค์ ํธ์์ฑ๊ณผ ํจ์จ์ ์ธ ์์ฌ๊ฒฐ์ ์ ๋๋ ๊ฒ์ด ๋ชฉ์ ์ ๋๋ค.
๋จ์ํ ์์ธ ์ ๊ณต์ด ์๋, ํธ๊ฐ, ์ฒด๊ฒฐ, ์บ๋ค, ๊ธฐ์ ์ ์งํ ๋ฑ์ ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ํฌ์ ์ธ์ฌ์ดํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ธฐ์กด์ CryptoQuant, CoinMarketCap, Coin360 ๋ฑ ๋ค์ํ ์๋น์ค๋ฅผ ๋ฒค์น๋งํนํ์ผ๋ฉฐ, ์๊ฐํ + ๊ฐ์ธํ + ์ค์๊ฐ์ฑ์ ์ค์ ์ ๋์์ต๋๋ค.
ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฌ์ฉ์ ์ธ์ฆ
- ์ด๋ฉ์ผ ์ธ์ฆ ๊ธฐ๋ฐ ํ์๊ฐ์ , ๋ก๊ทธ์ธ/๋ก๊ทธ์์
- ์ฝ์ธ ๋์๋ณด๋
- ์ ์ฒด ์ฝ์ธ ๋ชฉ๋ก ์กฐํ
- ์ข ๋ชฉ/๋ง์ผ ๋จ์ ์์ธ, ์ฒด๊ฒฐ, ํธ๊ฐ, ๋ค์ํ ์บ๋ค ์ฐจํธ(์ด/๋ถ/์ผ/์ฃผ/์/๋ ๋จ์)
- ๊ธฐ์ ์ ์งํ ์ถ๊ฐ(Spread, Imbalance, Liquidity Depth ๋ฑ)
- ๋ถ๋งํฌ ๊ธฐ๋ฅ
- ๊ด์ฌ ์๋ ์ฝ์ธ ๋ถ๋งํฌ ๋ฑ๋ก/์ญ์
- ๋ถ๋งํฌํ ์ข ๋ชฉ/๋ง์ผ ๋จ์ ํ์ฌ๊ฐ, ์ฒด๊ฒฐ๊ฐ ๋ฐ ํธ๊ฐ ์ ๋ณด ์กฐํ
- ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- WebSocket ๊ธฐ๋ฐ ์์ธ/์ฒด๊ฒฐ/ํธ๊ฐ ์ค์๊ฐ ์ ๋ฐ์ดํธ
- REST API ๊ธฐ๋ฐ ์บ๋ค ๋ฐ์ดํฐ ์ ๊ณต(์ต์ 1์ด ๊ฐ๊ฒฉ Polling)
2์ฐจ MVP์์๋ ๊ธฐ์กด Java ๊ธฐ๋ฐ ๋ฐฑ์๋ ์ฝ๋๋ฅผ ์ ๋ฉด์ ์ผ๋ก Kotlin์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ฌ ์ ์ง๋ณด์์ฑ๊ณผ ์์ฐ์ฑ์ ํฅ์์์ผฐ์ต๋๋ค.
- Kotlin DSL ๊ธฐ๋ฐ Gradle ๋น๋ ํ๊ฒฝ ๊ตฌ์ฑ
- data class, sealed class, extension, coroutines ๋ฑ Kotlin ํนํ ๋ฌธ๋ฒ ๋์
- Mockito ๋์ mockito-kotlin์ ํ์ฉํ Kotlin ์นํ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถ
- WebSocket/REST API ํ๋ฆ, ์๋น์ค/๋๋ฉ์ธ ๊ณ์ธต์ Kotlin์ค๋ฝ๊ฒ ๋ฆฌํฉํ ๋ง
์ถ๊ฐ์ ์ผ๋ก ๊ตฌํ๋ ๊ธฐ๋ฅ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ธ์ฆ/๊ด๋ฆฌ ๊ธฐ๋ฅ
- ์์ ๋ก๊ทธ์ธ (์นด์นด์ค ์ฐ๋)
- ๊ด๋ฆฌ์ ๊ธฐ๋ฅ: ์ฑํ ์ ๊ณ ๊ด๋ฆฌ
- ํฌ์ ์ธ์ฌ์ดํธ ๊ธฐ๋ฅ
- ํน์ ์กฐ๊ฑด(์: ๊ฐ๊ฒฉ ๊ธ๋ฑ๋ฝ, ๊ฑฐ๋๋ ๊ธ์ฆ ๋ฑ) ์ค์ ์ ํธ์ ์๋ฆผ ์ ์ก
- Naver ๊ฒ์ API ๊ธฐ๋ฐ ์ค์๊ฐ ๋ด์ค ์ฐ๋ (์ฝ์ธ ํค์๋ ๊ธฐ๋ฐ)
- ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ
- WebSocket ๊ธฐ๋ฐ ์ข ๋ชฉ ๋จ์ ์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ
์ ์ฒด ์์ฒญ ํ๋ฆ ๋ฐ ๋ฐฐํฌ ์๋ํ ํ์ดํ๋ผ์ธ์ ๋์ํํ ๊ตฌ์ฑ๋์ ๋๋ค.
์๋น์ค๋ ํ๋ก ํธ์๋(Next.js)์ ๋ฐฑ์๋(Spring Boot with Kotlin)๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ๊ฐ Vercel๊ณผ AWS EC2 + Docker ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐํฌ๋ฉ๋๋ค.
-
Frontend: Vercel์ ํตํด ์๋ ๋ฐฐํฌ
-
Backend: GitHub Actions โ Docker ์ด๋ฏธ์ง ์์ฑ โ ECR ์ ๋ก๋ โ EC2์์ Pull ๋ฐ ์คํ
-
Database: Amazon RDS (MySQL)
-
Infra Tooling: Doppler(ํ๊ฒฝ ๋ณ์), Nginx(Proxy), Docker Compose, GitHub Actions
- GitHub Push
- main ๋ธ๋์น์ ํธ์ ์ ์๋์ผ๋ก ์ํฌํ๋ก์ฐ ์คํ
- ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ
- Doppler CLI๋ก .env ํ์ผ ์๋ ๋ค์ด๋ก๋
- ํ๋ก ํธ์๋
- schema ๋ณํ, ํ์ ์์ฑ โ Vercel์ ์๋ ๋ฐฐํฌ
- ๋ฐฑ์๋
- ํ ์คํธ โ Docker ์ด๋ฏธ์ง ๋น๋ โ ECR์ Push โ EC2์์ Pull ํ ์ปจํ ์ด๋ ์คํ
๐ ์์ธํ ์๋ํ ๋ฐ ๋ฐฐํฌ ํ๋ก์ธ์ค๋ ์๋ GitHub Wiki์์ ํ์ธํ ์ ์์ต๋๋ค ๐ ๋ฐฐํฌ ๋ฐ ์๋ํ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
1๏ธโฃ Clone the Repository
git clone https://github.com/2hwayoung/coing.git2๏ธโฃ Environment Variables (.env) Setup โ Using Doppler (Recommended)
Doppler๋ .env ํ๊ฒฝ ๋ณ์ ํ์ผ์ ์์ ํ๊ฒ ๊ด๋ฆฌํด์ฃผ๋ ๋๊ตฌ์ ๋๋ค.
# Install Doppler CLI
brew install dopplerhq/cli/doppler
# Login & Setup
doppler login
doppler setup
# Run with environment loaded
npm run doppler3๏ธโฃ Run Database (MySQL via Docker Compose)
# Start MySQL container with Docker Compose
docker-compose up -d
# Monitor logs (logs are mapped locally)
tail -f ./mysql_logs/general.log
# Stop Containers
docker-compose down
4๏ธโฃ Run Backend (Spring Boot + Kotlin)
cd backend
./gradlew bootRun-
Port: 8080
-
Swagger Docs: http://localhost:8080/swagger-ui/index.html
5๏ธโฃ Run Frontend (Next.js)
cd frontend
npm install # Install dependencies (only needed once)
npm run dev # Start development server
# Use OpenAPI to generate TypeScript types for the backend API
npm run codegen # Generate openapi typeScript definitions
npm run codegen:watch # Watch for API changes and regenerate types automatically
- Access: http://localhost:3000
์์ธํ ์์คํ ์ํคํ ์ฒ, API ๋ช ์ธ์, ERD ๋ฐ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ฑ์ ์ํค๋ฅผ ์ฐธ๊ณ ํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
- ๐ APIโWebsocket ๋ช ์ธ์
- ๐ ERD ๋ฌธ์
- ๐ ๏ธ๊ธฐ์ ์คํ ๋ฌธ์
- ๐ ๏ธ TroubleShootings
- ๐ ADR
