Skip to content

kim-seokjin/SOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

39 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ†˜ SOS: Save Our Special day ๐Ÿงฉ

"์†Œ์ค‘ํ•œ ๋‚ ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์‹œ๊ฐ„ ํผ์ฆ ๋ ˆ์ด์Šค" โฑ๏ธ๐Ÿƒโ€โ™‚๏ธ

License: MIT Docker Compose React FastAPI


1. ๐Ÿš€ ์†Œ๊ฐœ (Introduction)

SOS: Save Our Special day๋Š” ์ œํ•œ ์‹œ๊ฐ„ ๋‚ด์— ์กฐ๊ฐ๋‚œ ํผ์ฆ์„ ๋งž์ถ”๊ณ , ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ธฐ๋ก์„ ๊ฒจ๋ฃจ๋Š” ๊ฒฝ์Ÿํ˜• ํผ์ฆ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. ๐ŸŽฎ

๋ณธ ์„œ๋น„์Šค๋Š” ์™„์ „ํ•œ **๋…๋ฆฝ ๊ตฌ๋™ํ˜• ์„œ๋น„์Šค(Self-Contained Service)**๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(PostgreSQL), ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๊ณ ์† ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ(Redis)๊ฐ€ ํ•˜๋‚˜์˜ Docker Compose๋กœ ๋ฌถ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ“ฆ ๋”ฐ๋ผ์„œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ•์ด๋‚˜ ๋ฒˆ๊ฑฐ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ์„ค์น˜ ์—†์ด, ๋ช…๋ น์–ด ํ•œ ์ค„๋งŒ์œผ๋กœ ๋กœ์ปฌ์ด๋‚˜ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์ฆ‰์‹œ ๋ฐฐํฌ ๋ฐ ๋…๋ฆฝ ๊ตฌ๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ž„ ์†Œ๊ฐœ ๋ฐ๋ชจ ํ”Œ๋ ˆ์ด ๊ฐ€์ด๋“œ ๋ฐ๋ชจ


2. โœจ ์ฃผ์š” ๊ธฐ๋Šฅ (Key Features)

  • ๐Ÿ† ์‹ค์‹œ๊ฐ„ ๊ธ€๋กœ๋ฒŒ ์ˆœ์œ„ํ‘œ: ํผ์ฆ์„ ์™„๋ฃŒํ•˜๋Š” ์ฆ‰์‹œ ๋‚ด ๊ธฐ๋ก์ด ๊ธ€๋กœ๋ฒŒ ์ˆœ์œ„ํ‘œ์— ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜๋˜์–ด ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋“ค๊ณผ ์‹ค์‹œ๊ฐ„ ๊ฒฝ์Ÿ์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • โฑ๏ธ ๊ธด์žฅ๊ฐ ๋„˜์น˜๋Š” ์‹œ๊ฐ„ ์ œํ•œ ๋ฐ ๐Ÿ’ก ์Šค๋งˆํŠธ ํžŒํŠธ: 60์ดˆ์˜ ์ œํ•œ ์‹œ๊ฐ„ ๋™์•ˆ ํผ์ฆ์„ ๋งž์ถ”๋Š” ๊ธด์žฅ๊ฐ ์†์— ์–ด๋ ค์šธ ๋•Œ๋Š” ๊ฒŒ์ž„๋‹น ๋‹จ ํ•œ ๋ฒˆ 10์ดˆ๊ฐ„ ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ํžŒํŠธ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๐Ÿ”’ 1๋“ฑ๋งŒ์„ ์œ„ํ•œ ๋น„๋ฐ€ ๋ฉ”์‹œ์ง€: 1๋“ฑ์„ ์ฐจ์ง€ํ•œ ๋‹จ ํ•œ ๋ช…์—๊ฒŒ๋งŒ ์ˆจ๊ฒจ์ง„ ํŠน๋ณ„ํ•œ ๋น„๋ฐ€ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ณต๊ฐœ๋ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ“… ๊ฐœ์ธ ๋„์ „ ์ด๋ ฅ ๋ฐ ์ตœ๊ณ  ๊ธฐ๋ก ๊ด€๋ฆฌ: ๋‚ด๊ฐ€ ๋„์ „ํ•œ ๋ชจ๋“  ๊ฒŒ์ž„ ๊ธฐ๋ก(ํด๋ฆฌ์–ด ์‹œ๊ฐ„, ๋‚ ์งœ)๊ณผ ๊ฐœ์ธ ์ตœ๊ณ  ๊ธฐ๋ก ๋Œ€๋น„ ํ˜„์žฌ ์„ฑ๊ณผ๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ›ก๏ธ ๋ถ€์ •ํ–‰์œ„ ์‹ค์‹œ๊ฐ„ ๊ฐ์ง€ ๋ฐ ๋ฐฉ์ง€: ๋น„์ •์ƒ์ ์ธ ๋งคํฌ๋กœ๋‚˜ ์‹œ๊ฐ์  ์กฐ์ž‘ ์‹œ๋„๋ฅผ ๋ฐฑ์—”๋“œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋กœ ์‹ค์‹œ๊ฐ„ ๊ฐ์ง€ํ•˜์—ฌ ๊นจ๋—ํ•œ ๋žญํ‚น ์‹œ์Šคํ…œ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๐ŸŽจ ๋ชฐ์ž…๊ฐ ๋†’์€ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์• ๋‹ˆ๋ฉ”์ด์…˜: ํผ์ฆ ์กฐ์ž‘ ์‹œ์˜ ๋ฐ˜์‘ํ˜• ํ”ผ๋“œ๋ฐฑ๊ณผ ํ•จ๊ป˜ ์™„๋ฃŒ ์‹œ ๋น›๋‚˜๋Š” ๊ธ€๋กœ์šฐ ํšจ๊ณผ ๋ฐ ํญ์ฃฝ ์ถ•ํ•˜ ์—ฐ์ถœ๋กœ ๋›ฐ์–ด๋‚œ ์‹œ๊ฐ์  ๋ชฐ์ž…๊ฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰

3. โš™๏ธ ์„ค์น˜ ๋ฐ ์‹คํ–‰ (Getting Started)

๐Ÿ“‹ ์˜์กด์„ฑ ์š”๊ฑด (Prerequisites)

ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๐Ÿณ Docker & Docker Compose (์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ ์‹คํ–‰ ์‹œ ๊ถŒ์žฅ)
  • ๐ŸŸข Node.js v20 ์ด์ƒ & npm (๋กœ์ปฌ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์‹œ ํ•„์š”)
  • ๐Ÿ Python 3.11 ์ด์ƒ (๋กœ์ปฌ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ์‹œ ํ•„์š”)

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

์‹คํ–‰ ์ „ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ณต๋œ .env.example ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์—ฌ ์ž‘์„ฑํ•˜์„ธ์š”.

cp .env.example .env

Important

๊ฒŒ์ž„์šฉ ํผ์ฆ ์ด๋ฏธ์ง€ ์กฐ๊ฐ์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์„œ๋น™ํ•˜๊ธฐ ์œ„ํ•ด AWS S3 ์„ค์ •(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, S3_BUCKET_NAME)์ด ๋ฐ˜๋“œ์‹œ ๊ธฐ์žฌ๋˜์–ด์•ผ ๊ฒŒ์ž„ ์ •์ƒ ๊ตฌ๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. โ˜๏ธ


๐Ÿณ ๋ฐฉ๋ฒ• A. Docker Compose๋กœ ์ผ๊ด„ ์‹คํ–‰ (๊ถŒ์žฅ)

๋ณ„๋„์˜ ์˜์กด์„ฑ ์„ค์น˜ ์—†์ด ์ „์ฒด ์Šคํƒ(Frontend, Backend, PostgreSQL, Redis)์„ ์ผ๊ด„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์„œ๋น„์Šค ๋นŒ๋“œ ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ๐Ÿš€
    docker compose up --build -d
  2. ๊ตฌ๋™ ํ™•์ธ ๐Ÿ”—

๐Ÿ’ป ๋ฐฉ๋ฒ• B. ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ณ„ ์‹คํ–‰

๊ฐœ๋ฐœ ์‹œ ์ฝ”๋“œ ํ•ซ ๋ฆฌ๋กœ๋“œ(Hot Reload)๋ฅผ ํ™œ์šฉํ•˜๋ ค๋ฉด ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ๋กœ์ปฌ์—์„œ ์ง์ ‘ ๊ตฌ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ๐Ÿ ๋ฐฑ์—”๋“œ (FastAPI) ์‹คํ–‰

  1. ๋ฐฑ์—”๋“œ ํด๋”๋กœ ์ด๋™ ํ›„ ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํŒจํ‚ค์ง€ ์„ค์น˜:
    cd backend
    python -m venv venv
    source venv/bin/activate  # Windows: venv\Scripts\activate
    pip install -r requirements.txt
  2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค€๋น„ ๋ฐ FastAPI ์„œ๋ฒ„ ๊ตฌ๋™:
    # (์„ ํƒ) .env์—์„œ SQLite๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด DATABASE_URL="sqlite+aiosqlite:///./data/sos.db"๋กœ ์„ค์ •
    # Redis๊ฐ€ ๋กœ์ปฌ(localhost:6379)์— ๊ธฐ๋™ ์ค‘์ด์–ด์•ผ ์‹ค์‹œ๊ฐ„ ๋žญํ‚น์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload

2. โš›๏ธ ํ”„๋ก ํŠธ์—”๋“œ (Vite + React) ์‹คํ–‰

  1. ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜:
    npm install
  2. ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๊ตฌ๋™:
    npm run dev
    ๊ตฌ๋™ ์™„๋ฃŒ ์‹œ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:5173์„ ํ†ตํ•ด ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ’ป

4. โ˜๏ธ AWS ์ถ”์ฒœ ๊ตฌ์„ฑ (Recommended AWS Deployment)

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ˆ˜๋งŽ์€ ์‚ฌ์šฉ์ž์˜ ์‹ค์‹œ๊ฐ„ ์ ‘์† ๋ฐ ๋™์‹œ ํผ์ฆ ์ด๋ฒคํŠธ๋ฅผ ์œ ์—ฐํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ AWS ์ถ”์ฒœ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ๐Ÿ› ๏ธ

graph TD
    User([์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €]) <--> |Route 53| CloudFront[AWS CloudFront]
    CloudFront --> |์ •์  ์—์…‹ ์„œ๋น™| S3_Static[S3 Static Bucket]
    CloudFront --> |API & WebSocket ์š”์ฒญ| ALB[Application Load Balancer]
    ALB --> |HTTPS / WSS| ECS[ECS Fargate: App Container Task]
    ECS --> |๋น„๋™๊ธฐ ํŠธ๋ž˜ํ”ฝ & ์ˆœ์œ„ ์บ์‹ฑ| Cache[Amazon ElastiCache Redis]
    ECS --> |์˜์† ์‚ฌ์šฉ์ž ๋ฐ ๊ธฐ๋ก ์ €์žฅ| RDS[(Amazon RDS PostgreSQL)]
    ECS <--> |ํผ์ฆ ์ด๋ฏธ์ง€ ์„œ๋น™ & Presigned URL| S3_Assets[S3 Game Assets Bucket]
Loading

1. AWS S3 ๋ฒ„ํ‚ท ์„ค์ • (Game Assets) ๐Ÿชฃ

ํผ์ฆ๋กœ ์กฐ๊ฐ๋‚ผ ์›๋ณธ ๊ณ ํ™”์งˆ ์ด๋ฏธ์ง€๋ฅผ ์„œ๋น™ํ•˜๊ธฐ ์œ„ํ•ด AWS S3 ๋ฒ„ํ‚ท์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด๋ฏธ์ง€ ์กฐ๊ฐ์„ Canvas์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ€๊ณตํ•˜๊ณ  CORS ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„ํ‚ท์— CORS(Cross-Origin Resource Sharing) ๊ทœ์น™์„ ํ•„์ˆ˜ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

S3 ๋ฒ„ํ‚ท CORS ๊ตฌ์„ฑ ์˜ˆ์‹œ JSON: ๐Ÿ“„

[
  {
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["GET", "HEAD"],
    "AllowedOrigins": ["*"],
    "ExposeHeaders": ["ETag", "Content-Type"],
    "MaxAgeSeconds": 3000
  }
]

2. ํ”„๋กœ๋•์…˜ ์ธํ”„๋ผ ์ถ”์ฒœ ์‚ฌ์–‘ ๐Ÿ—๏ธ

  • ์ปดํ“จํŒ… (ECS Fargate):
    • API ์„œ๋ฒ„์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐ WebSocket ์—ฐ๊ฒฐ ์œ ์ง€๋ฅผ ์œ„ํ•ด ์˜คํ† ์Šค์ผ€์ผ๋ง์ด ์ ์šฉ๋œ Amazon ECS(Fargate) ๊ตฌ์„ฑ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
    • ALB(Application Load Balancer)์—์„œ WebSocket ์—ฐ๊ฒฐ ์œ ์ง€๋ฅผ ์œ„ํ•ด ์„ธ์…˜ ์Šคํ‹ฐํ‚ค๋‹ˆ์Šค(Sticky Sessions) ๋˜๋Š” ์ตœ์†Œ 300์ดˆ ์ด์ƒ์˜ ์œ ํœด ์ œํ•œ ์‹œ๊ฐ„ ์„ค์ •์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (RDS PostgreSQL):
    • ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ๋ฐ ์ƒ์„ธ ์ด๋ ฅ ์ €์žฅ์„ ์œ„ํ•ด db.t4g.micro ๋˜๋Š” db.t4g.small ํด๋ž˜์Šค์˜ PostgreSQL์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์šฉ ๋Œ€๋น„ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ ์† ์บ์‹ฑ & ๋žญํ‚น (ElastiCache for Redis):
    • ๊ธ€๋กœ๋ฒŒ ์ˆœ์œ„ํ‘œ์˜ ์ดˆ๊ณ ์† ์กฐํšŒ ๋ฐ ๋žญํ‚น ๊ฐฑ์‹ (Zset ์—ฐ์‚ฐ)์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œ ์‚ฌ์–‘์˜ Amazon ElastiCache Serverless(Redis) ๋˜๋Š” cache.t4g.micro ๋…ธ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

5. ๐Ÿ—บ๏ธ ๋กœ๋“œ๋งต (Roadmap)

  • ๐ŸŒŸ ๋‹ค์–‘ํ•œ ๋‚œ์ด๋„ ๋ชจ๋“œ ์ง€์›: ๊ธฐ์กด 4x4 ๊ณ ์ • ํผ์ฆ์—์„œ 3x3(์‰ฌ์›€), 5x5(์–ด๋ ค์›€) ๋“ฑ ์‚ฌ์šฉ์ž ์„ ํƒ ๋‚œ์ด๋„ ์ถ”๊ฐ€
  • ๐Ÿ”‘ ์†Œ์…œ ๋กœ๊ทธ์ธ ๋‹ค๊ฐํ™”: Google, Apple, Kakao ๋“ฑ ๊ฐ„ํŽธ ์†Œ์…œ ๊ณ„์ • ๊ฐ€์ž… ๊ธฐ๋Šฅ ์—ฐ๋™
  • ๐Ÿ“ธ ์‚ฌ์šฉ์ž ์ปค์Šคํ…€ ์ด๋ฏธ์ง€ ํผ์ฆ: ๋ณธ์ธ์ด ์ง์ ‘ ์˜ฌ๋ฆฐ ์‚ฌ์ง„์œผ๋กœ ํผ์ฆ๋ฐฉ์„ ์ƒ์„ฑํ•ด ์นœ๊ตฌ๋“ค๊ณผ ๊ธฐ๋ก ๊ฒฝ์Ÿ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ธ ๋งž์ถคํ˜• ํผ์ฆ ๋ชจ๋“œ
  • ๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ ํ„ฐ์น˜ ๊ฐ๋„ ๋ฐ ์ œ์Šค์ฒ˜ ์ตœ์ ํ™”: ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ์˜ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์Šฌ๋ผ์ด๋”ฉ ์กฐ์ž‘๊ฐ ๊ฐœ์„  ๋ฐ ํ–…ํ‹ฑ ์ง„๋™ ํ”ผ๋“œ๋ฐฑ ์ ์šฉ
  • ๐ŸŒ ๋‹ค๊ตญ์–ด ์ง€์›(i18n): ๊ธ€๋กœ๋ฒŒ ๋ ˆ์ด์„œ๋“ค์„ ์œ„ํ•œ ์˜์–ด, ์ผ์–ด ๋“ฑ ๋ฒˆ์—ญ ๋ฆฌ์†Œ์Šค ๋ฒˆ๋“ค๋ง

6. ๐Ÿ“„ ๋ผ์ด์„ ์Šค (License)

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” MIT License์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”„๋กœ์ ํŠธ ๋‚ด LICENSE ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋ฉด ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

About

SOS : Save Our Special day

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors