Skip to content

antziku/TradeVortex

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

7 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

TradeVortex ๐Ÿ“ˆ

AI ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ๊ธˆ์œต ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ํˆฌ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋žซํผ

๋ถ€ํŠธ์บ ํ”„ 4๊ฐœ์›”์ฐจ์— ์ œ์ž‘ํ•œ ํ’€์Šคํƒ ๊ธˆ์œต ํŠธ๋ ˆ์ด๋”ฉ ํ”Œ๋žซํผ
์‹ค์‹œ๊ฐ„ ์ฃผ์‹ ์ฐจํŠธ, AI ํˆฌ์ž ์–ด์‹œ์Šคํ„ดํŠธ, ๋‰ด์Šค ๋ถ„์„, ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ ์ œ๊ณต

Tech Stack Tech Stack Tech Stack Powered by Crawl4AI


๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

  • ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„: 2025.01.20 ~ 2025.02.05 (์•ฝ 2์ฃผ)
  • ํŒ€ ๊ตฌ์„ฑ: Team EOD (Error Overflow Delay)
  • ๊ฐœ๋ฐœ ์ธ์›: ํŒ€ ํ”„๋กœ์ ํŠธ
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ: Docker Compose ๊ธฐ๋ฐ˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค

โœจ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

๐Ÿ“Š ์‹ค์‹œ๊ฐ„ ๊ธˆ์œต ๋ฐ์ดํ„ฐ

  • ์‹ค์‹œ๊ฐ„ ์ฐจํŠธ: Highcharts ๊ธฐ๋ฐ˜ ๊ตญ๋‚ด์™ธ ์ฃผ์‹ ์‹œ๊ฐํ™”
  • WebSocket ์ŠคํŠธ๋ฆฌ๋ฐ: ์‹ค์‹œ๊ฐ„ ์ฃผ๊ฐ€ ์—…๋ฐ์ดํŠธ
  • ์ฃผ๊ฐ€ ์˜ˆ์ธก: scikit-learn, PyTorch ๊ธฐ๋ฐ˜ ML ๋ชจ๋ธ
  • ๊ธฐ์ˆ ์  ์ง€ํ‘œ: ์ด๋™ํ‰๊ท ์„ , RSI, MACD ๋“ฑ

๐Ÿค– AI ํˆฌ์ž ์–ด์‹œ์Šคํ„ดํŠธ

  • CrewAI ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ: ์—ฌ๋Ÿฌ AI ์—์ด์ „ํŠธ๊ฐ€ ํ˜‘์—…ํ•˜์—ฌ ๋ถ„์„
  • ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…: WebSocket ๊ธฐ๋ฐ˜ ์ฆ‰๊ฐ ์‘๋‹ต
  • ๊ฐ์„ฑ ๋ถ„์„: transformers, KoNLPy๋กœ ๋‰ด์Šค ๊ฐ์„ฑ ๋ถ„์„
  • ๋งž์ถค ์ถ”์ฒœ: ์‚ฌ์šฉ์ž ํฌํŠธํด๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ ์ข…๋ชฉ ์ถ”์ฒœ
  • ๋กœ์ปฌ LLM ์ง€์›: ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ Ollama ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    (Ollama ์‹คํ–‰ โ†’ ๋ชจ๋ธ pull โ†’ backend .env ์„ค์ • ํ›„ docker ์žฌ์‹œ์ž‘)

๐Ÿ“ฐ ๋‰ด์Šค ํฌ๋กค๋ง & ๋ถ„์„

  • ์ž๋™ ํฌ๋กค๋ง: Celery๋กœ ์ฃผ๊ธฐ์  ๋‰ด์Šค ์ˆ˜์ง‘ (crawl4ai)
  • ์›Œ๋“œํด๋ผ์šฐ๋“œ: ํ‚ค์›Œ๋“œ ์‹œ๊ฐํ™”
  • ๊ฐ์„ฑ ๋ถ„์„: ๊ธ์ •/๋ถ€์ • ๋‰ด์Šค ์ž๋™ ๋ถ„๋ฅ˜
  • ์ข…๋ชฉ ํƒœ๊น…: ๊ด€๋ จ ์ข…๋ชฉ ์ž๋™ ์—ฐ๊ฒฐ

๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ

  • ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…: Django Channels (WebSocket)
  • ๊ฒŒ์‹œํŒ: ์ž์œ ๊ฒŒ์‹œํŒ, ํ† ๋ก ๋ฐฉ, ์ข…๋ชฉ ํ† ๋ก 
  • ์†Œ์…œ ๊ธฐ๋Šฅ: ๋Œ“๊ธ€, ์ข‹์•„์š”, ํŒ”๋กœ์šฐ

๐Ÿ‘ค ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ

  • JWT ์ธ์ฆ: Access/Refresh Token
  • ์†Œ์…œ ๋กœ๊ทธ์ธ: ๋„ค์ด๋ฒ„, ๊ตฌ๊ธ€, ์นด์นด์˜ค
  • ์ด๋ฉ”์ผ ์ธ์ฆ: ํšŒ์›๊ฐ€์ž… ์‹œ ์ด๋ฉ”์ผ ํ™•์ธ
  • ํ”„๋กœํ•„: ํฌํŠธํด๋ฆฌ์˜ค ๊ด€๋ฆฌ

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

Frontend

React 18 + Vite
โ”œโ”€โ”€ UI: Material-UI, Ant Design, Tailwind CSS
โ”œโ”€โ”€ State: Redux Toolkit
โ”œโ”€โ”€ Charts: Highcharts, Plotly, D3.js
โ”œโ”€โ”€ Animation: Framer Motion, GSAP
โ””โ”€โ”€ Real-time: WebSocket

Backend

Django 5.1 + DRF
โ”œโ”€โ”€ Real-time: Django Channels (WebSocket)
โ”œโ”€โ”€ Task Queue: Celery + Redis
โ”œโ”€โ”€ Database: PostgreSQL
โ”œโ”€โ”€ Auth: JWT, django-allauth
โ””โ”€โ”€ Server: Gunicorn + Uvicorn

AI/ML

โ”œโ”€โ”€ LLM: OpenAI GPT, Google Gemini, Ollama (Local)
โ”œโ”€โ”€ Framework: PyTorch, scikit-learn, transformers
โ”œโ”€โ”€ NLP: KoNLPy
โ”œโ”€โ”€ Agent: CrewAI
โ””โ”€โ”€ Data: finance-datareader

Infrastructure

Docker Compose
โ”œโ”€โ”€ Web: Nginx
โ”œโ”€โ”€ Cache: Redis
โ”œโ”€โ”€ DB: PostgreSQL
โ””โ”€โ”€ Admin: pgAdmin, RedisInsight

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

tradevortex/
โ”œโ”€โ”€ frontend/                 # React ํ”„๋ก ํŠธ์—”๋“œ
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ components/      # ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”œโ”€โ”€ pages/           # ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”œโ”€โ”€ redux/           # Redux ์ƒํƒœ ๊ด€๋ฆฌ
โ”‚   โ”‚   โ””โ”€โ”€ api/             # API ํ˜ธ์ถœ
โ”‚   โ””โ”€โ”€ package.json
โ”‚
โ”œโ”€โ”€ backend/                  # Django ๋ฐฑ์—”๋“œ
โ”‚   โ”œโ”€โ”€ TradeVortex/         # ํ”„๋กœ์ ํŠธ ์„ค์ •
โ”‚   โ”œโ”€โ”€ accounts/            # ์‚ฌ์šฉ์ž ์ธ์ฆ
โ”‚   โ”œโ”€โ”€ financedata/         # ๊ธˆ์œต ๋ฐ์ดํ„ฐ
โ”‚   โ”œโ”€โ”€ newspage/            # ๋‰ด์Šค ํฌ๋กค๋ง
โ”‚   โ”œโ”€โ”€ aiassist/            # AI ์–ด์‹œ์Šคํ„ดํŠธ
โ”‚   โ”œโ”€โ”€ graphs/              # ์‹ค์‹œ๊ฐ„ ์ฐจํŠธ
โ”‚   โ”œโ”€โ”€ board/               # ๊ฒŒ์‹œํŒ
โ”‚   โ”œโ”€โ”€ toron/               # ํ† ๋ก ๋ฐฉ
โ”‚   โ”œโ”€โ”€ realtimechat/        # ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…
โ”‚   โ””โ”€โ”€ requirements.txt
โ”‚
โ”œโ”€โ”€ docker-compose.yml        # ์„œ๋น„์Šค ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜
โ”œโ”€โ”€ nginx.conf               # Nginx ์„ค์ •
โ””โ”€โ”€ README.md

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

  • Docker & Docker Compose
  • Git

์„ค์น˜ ๋ฐ ์‹คํ–‰

# 1. ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/yourusername/tradevortex.git
cd tradevortex

# 2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • (์•„๋ž˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„น์…˜ ์ฐธ๊ณ )
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env
# .env ํŒŒ์ผ ์ˆ˜์ • ํ•„์š”

# 3. Docker Compose ์‹คํ–‰
docker-compose up -d

# 4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
docker-compose exec django python manage.py migrate

# 5. ์Šˆํผ์œ ์ € ์ƒ์„ฑ (์„ ํƒ)
docker-compose exec django python manage.py createsuperuser

์„œ๋น„์Šค ์ ‘์†


๐Ÿ”‘ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

Backend (.env)

# Django
SECRET_KEY=your-secret-key-here
DEBUG=False
ALLOWED_HOSTS=localhost,127.0.0.1

# Database
DATABASE_URL=postgresql://postgres:postgres@postgres:5432/tradevortex

# Redis
CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/0

# ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋กœ์ปฌ LLM(Ollama)์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์•„๋ž˜ ์˜ต์…˜์„ ์„ค์ •

# Local LLM (optional)
OLLAMA_BASE_URL=http://host.docker.internal:11434
OLLAMA_MODEL=qwen3:4b-instruct-2507-q4_K_M

# AI APIs
OPENAI_API_KEY=your-openai-key
GEMINI_API_KEY=your-gemini-key

# Social Login
NAVER_CLIENT_ID=your-naver-client-id
NAVER_CLIENT_SECRET=your-naver-secret
GOOGLE_CLIENT_ID=your-google-client-id

# Email
EMAIL_HOST_USER=your-email@gmail.com
EMAIL_HOST_PASSWORD=your-app-password

Frontend (.env)

VITE_API_URL=http://localhost:8000
VITE_WS_URL=ws://localhost:8000
VITE_GOOGLE_CLIENT_ID=your-google-client-id
VITE_NAVER_CLIENT_ID=your-naver-client-id
VITE_KAKAO_JAVASCRIPT_KEY=your-kakao-key

๐Ÿ“Š ์ฃผ์š” API ์—”๋“œํฌ์ธํŠธ

์ธ์ฆ

POST   /api/accounts/signup/          # ํšŒ์›๊ฐ€์ž…
POST   /api/accounts/login/           # ๋กœ๊ทธ์ธ
POST   /api/accounts/logout/          # ๋กœ๊ทธ์•„์›ƒ
POST   /api/accounts/token/refresh/   # ํ† ํฐ ๊ฐฑ์‹ 

๊ธˆ์œต ๋ฐ์ดํ„ฐ

GET    /api/financedata/stocks/       # ์ฃผ์‹ ๋ชฉ๋ก
GET    /api/financedata/chart/{symbol}/  # ์ฐจํŠธ ๋ฐ์ดํ„ฐ
GET    /api/financedata/predict/{symbol}/  # ์ฃผ๊ฐ€ ์˜ˆ์ธก

๋‰ด์Šค

GET    /api/news/                     # ๋‰ด์Šค ๋ชฉ๋ก
GET    /api/news/{id}/                # ๋‰ด์Šค ์ƒ์„ธ
GET    /api/news/wordcloud/           # ์›Œ๋“œํด๋ผ์šฐ๋“œ

AI ์–ด์‹œ์Šคํ„ดํŠธ

POST   /api/aiassist/chat/            # AI ์ฑ„ํŒ…
GET    /api/aiassist/recommend/       # ์ข…๋ชฉ ์ถ”์ฒœ

WebSocket

ws://localhost:8000/ws/stock/{symbol}/     # ์‹ค์‹œ๊ฐ„ ์ฃผ๊ฐ€
ws://localhost:8000/ws/chat/{room}/        # ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…

๐Ÿ’ก ์ฃผ์š” ๊ตฌํ˜„ ๋‚ด์šฉ

1. ์‹ค์‹œ๊ฐ„ ์ฐจํŠธ (WebSocket)

# backend/graphs/consumers.py
class StockConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.symbol = self.scope['url_route']['kwargs']['symbol']
        await self.channel_layer.group_add(f"stock_{self.symbol}", self.channel_name)
        await self.accept()
        
    async def stock_update(self, event):
        await self.send(text_data=json.dumps(event['data']))

2. AI ์–ด์‹œ์Šคํ„ดํŠธ (CrewAI)

# backend/aiassist/crew.py
analyst = Agent(
    role='Financial Analyst',
    goal='Analyze stock data and provide investment insights',
    tools=[stock_analysis_tool, news_sentiment_tool]
)

researcher = Agent(
    role='Market Researcher',
    goal='Research market trends and news',
    tools=[news_crawler_tool, market_data_tool]
)

crew = Crew(agents=[analyst, researcher], tasks=[...])

3. ๋‰ด์Šค ํฌ๋กค๋ง (Celery)

# backend/newspage/tasks.py
@shared_task
def crawl_financial_news():
    crawler = NewsCrawler()
    articles = crawler.fetch_latest()
    for article in articles:
        sentiment = analyze_sentiment(article.content)
        article.sentiment_score = sentiment
        article.save()

๐ŸŽจ ์ฃผ์š” ๊ธฐ๋Šฅ ์‹œ์—ฐ

์‹ค์‹œ๊ฐ„ ์ฐจํŠธ

  • WebSocket์œผ๋กœ 1์ดˆ๋งˆ๋‹ค ์ฃผ๊ฐ€ ์—…๋ฐ์ดํŠธ
  • Highcharts๋กœ ์บ”๋“ค์Šคํ‹ฑ, ๋ผ์ธ ์ฐจํŠธ ์ง€์›
  • ๊ธฐ์ˆ ์  ์ง€ํ‘œ ์˜ค๋ฒ„๋ ˆ์ด

AI ์ฑ„ํŒ…

  • ์ž์—ฐ์–ด๋กœ ์ข…๋ชฉ ์งˆ๋ฌธ
  • ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ๊ฐ€ ํ˜‘์—…ํ•˜์—ฌ ๋ถ„์„
  • ์‹ค์‹œ๊ฐ„ ์‘๋‹ต ์ŠคํŠธ๋ฆฌ๋ฐ

๋‰ด์Šค ๋ถ„์„

  • 10๋ถ„๋งˆ๋‹ค ์ž๋™ ํฌ๋กค๋ง
  • ๊ฐ์„ฑ ๋ถ„์„์œผ๋กœ ๊ธ์ •/๋ถ€์ • ๋ถ„๋ฅ˜
  • ์›Œ๋“œํด๋ผ์šฐ๋“œ๋กœ ํŠธ๋ Œ๋“œ ํŒŒ์•…

๐Ÿ› ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

Docker ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์˜ค๋ฅ˜

docker-compose down -v
docker-compose up --build

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์˜ค๋ฅ˜

docker-compose exec django python manage.py migrate --run-syncdb

Redis ์—ฐ๊ฒฐ ์˜ค๋ฅ˜

docker-compose restart redis celery

ํฌํŠธ ์ถฉ๋Œ

# docker-compose.yml์—์„œ ํฌํŠธ ๋ณ€๊ฒฝ
ports:
  - "3001:3000"  # 3000 ๋Œ€์‹  3001 ์‚ฌ์šฉ

๐Ÿ“ˆ ์„ฑ๋Šฅ ์ตœ์ ํ™”

  • Redis ์บ์‹ฑ: API ์‘๋‹ต ์†๋„ 50% ๊ฐœ์„ 
  • Celery ๋น„๋™๊ธฐ: ๋ฌด๊ฑฐ์šด ์ž‘์—… ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ฒ˜๋ฆฌ
  • WebSocket: HTTP ํด๋ง ๋Œ€๋น„ 90% ํŠธ๋ž˜ํ”ฝ ๊ฐ์†Œ
  • DB ์ธ๋ฑ์‹ฑ: ์ฟผ๋ฆฌ ์†๋„ 3๋ฐฐ ํ–ฅ์ƒ

๐Ÿ”’ ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

โš ๏ธ ์ฃผ์˜: ์ด ํ”„๋กœ์ ํŠธ๋Š” ํ•™์Šต/ํฌํŠธํด๋ฆฌ์˜ค ๋ชฉ์ ์ž…๋‹ˆ๋‹ค.
ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ ์•„๋ž˜ ์‚ฌํ•ญ์„ ๋ฐ˜๋“œ์‹œ ์ˆ˜์ •ํ•˜์„ธ์š”.

  • SECRET_KEY ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌ
  • DEBUG=False ์„ค์ •
  • ALLOWED_HOSTS ์ œํ•œ
  • CORS_ALLOW_ALL_ORIGINS=False
  • HTTPS ์ ์šฉ
  • API ํ‚ค ์žฌ๋ฐœ๊ธ‰
  • .env ํŒŒ์ผ .gitignore ์ถ”๊ฐ€

๐Ÿ“š ๋ฐฐ์šด ์ 

๊ธฐ์ˆ ์  ์„ฑ์žฅ

  • Django Channels๋กœ WebSocket ๊ตฌํ˜„
  • Celery๋กœ ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ
  • Docker Compose๋กœ ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ
  • CrewAI๋กœ ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ ๊ตฌ์ถ•
  • JWT ์ธ์ฆ ๊ตฌํ˜„

์–ด๋ ค์› ๋˜ ์ 

  • WebSocket ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง
  • Celery ํƒœ์Šคํฌ ์Šค์ผ€์ค„๋ง ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง
  • CORS/CSRF ์„ค์ •
  • Docker ๋„คํŠธ์›Œํฌ ์„ค์ •

๊ฐœ์„ ํ•˜๊ณ  ์‹ถ์€ ์ 

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
  • ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๊ฐ•ํ™”
  • ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”

๐Ÿšง ํ–ฅํ›„ ๊ณ„ํš

  • AWS ๋ฐฐํฌ (EC2, RDS, S3)
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (pytest, Jest)
  • ๋ชจ๋ฐ”์ผ ๋ฐ˜์‘ํ˜• ๊ฐœ์„ 
  • ์•Œ๋ฆผ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • ํฌํŠธํด๋ฆฌ์˜ค ๋ฐฑํ…Œ์ŠคํŒ… ๊ธฐ๋Šฅ

๐Ÿค ๊ธฐ์—ฌ

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

๐Ÿ“ ๋ผ์ด์„ ์Šค

This project is licensed under the MIT License.


๐Ÿ‘ฅ ํŒ€์›

Team EOD (Error Overflow Delay)

  • ๋ถ€ํŠธ์บ ํ”„ 4๊ฐœ์›”์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ
  • ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„: ์•ฝ 2์ฃผ

๐Ÿ“ž ๋ฌธ์˜

ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ๋ฌธ์˜: fakeprice@naver.com

GitHub: antziku


๐Ÿ™ ๊ฐ์‚ฌ์˜ ๋ง

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋ถ€ํŠธ์บ ํ”„์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ถ€์กฑํ•œ ์ ์ด ๋งŽ์ง€๋งŒ, ๊ณ„์† ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.


โญ ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด Star๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”!


๐Ÿ“– ์ฐธ๊ณ  ์ž๋ฃŒ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published