Skip to content

lee-lou2/django-boilerplate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

19 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Django Enterprise Boilerplate

ํ•œ๊ตญ์–ด | English

Python Django DRF Celery License

์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์„ ๋ชฉํ‘œ๋กœ ์„ค๊ณ„๋œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ Django ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์ž…๋‹ˆ๋‹ค. ๊ฐ•๋ ฅํ•œ ์ธ์ฆ/๋ณด์•ˆ, API ๋ฒ„์ €๋‹, ์บ์‹ฑ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ, ๋ฌธ์„œํ™”, ๊ด€์ธก์„ฑ๊นŒ์ง€ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜์—ฌ ๋ฐ”๋กœ ์ œํ’ˆ ๊ฐœ๋ฐœ์— ์ฐฉ์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒŸ ์ฃผ์š” ๊ธฐ๋Šฅ

์‚ฌ์šฉ์ž ๊ด€๋ฆฌ

  • ํšŒ์›๊ฐ€์ž…, ์ด๋ฉ”์ผ ์ธ์ฆ, ๋กœ๊ทธ์ธ (JWT)
  • ์†Œ์…œ ๋กœ๊ทธ์ธ (Google)
  • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๊ด€๋ฆฌ
  • ๊ถŒํ•œ ๋ฐ ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด
  • ๋ฉ€ํ‹ฐ ๋””๋ฐ”์ด์Šค ๊ด€๋ฆฌ

์ปจํ…์ธ  ๊ด€๋ฆฌ

  • ํ”ผ๋“œ ๊ด€๋ฆฌ
  • ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜ ๊ตฌ๋…
  • ํ”ผ๋“œ ๋ฐ ๋Œ“๊ธ€ ์ข‹์•„์š”, ์‹ ๊ณ 
  • ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ๊ด€๋ฆฌ

์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜

  • ์ด๋ฉ”์ผ ๋ฐœ์†ก ์‹œ์Šคํ…œ
  • ํ‘ธ์‹œ ์•Œ๋ฆผ
  • 1:1 ๋ฌธ์˜
  • FAQ ๋ฐ ๊ณต์ง€์‚ฌํ•ญ

๊ฒŒ์ž„ ๊ธฐ๋Šฅ

  • ์ถœ์„ ์ฒดํฌ

์œ ํ‹ธ๋ฆฌํ‹ฐ

  • ์ˆ๋งํฌ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ
  • ํ†ต๊ณ„ ๋ฐ ๋ถ„์„
  • ์–ด๋“œ๋ฏผ ๋Œ€์‹œ๋ณด๋“œ
  • API ๋ฒ„์ „ ๊ด€๋ฆฌ

์ธํ”„๋ผ

  • ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ (Celery)
  • ๊ฒ€์ƒ‰ ์ตœ์ ํ™” (Elasticsearch)
  • ์บ์‹œ ๊ด€๋ฆฌ (Redis, Memcached)
  • ๋ฏธ๋””์–ด ์ €์žฅ์†Œ (AWS S3)
  • ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง (Sentry, ๊ตฌ์กฐํ™” ๋กœ๊ทธ)

๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

์š”๊ตฌ์‚ฌํ•ญ

  • Python 3.11+
  • Django 5.1+
  • Redis (๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ docker-compose๋กœ ์ž๋™ ์ œ๊ณต)
  • PostgreSQL (๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ docker-compose๋กœ ์ž๋™ ์ œ๊ณต)

์„ค์น˜

# ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/lee-lou2/django-boilerplate.git
cd django-boilerplate

# uv ์„ค์น˜ (๋ฏธ์„ค์น˜ ์‹œ)
# macOS (Homebrew ๊ถŒ์žฅ):
#   brew install uv
# ๊ธฐํƒ€ ํ™˜๊ฒฝ: https://docs.astral.sh/uv/getting-started/ ์ฐธ๊ณ 

# ์˜์กด์„ฑ ๋™๊ธฐํ™” (์ž๋™์œผ๋กœ .venv ์ƒ์„ฑ)
uv sync

# ์†Œ์Šค ํด๋”๋กœ ์ด๋™
cd src

# logs ํด๋” ์ƒ์„ฑ
mkdir -p logs

# ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
cp .env.example .env
# .env ํŒŒ์ผ ํŽธ์ง‘ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์ด๋ฉ”์ผ, S3 ๋“ฑ ์„ค์ •

# ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰
uv run python manage.py migrate

# ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ (์„ ํƒ)
uv run python manage.py createsuperuser

# ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
uv run python manage.py runserver

Docker๋กœ ์‹คํ–‰

# ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹คํ–‰
docker compose up -d --build

# ์›น ์ ‘์†: http://localhost:8000
# API ํ—ฌ์Šค์ฒดํฌ: http://localhost:8000/_health/

Celery ์‹คํ–‰

  • ๋กœ์ปฌ(uv): uv run celery -A conf.celery.app worker -l info
  • Docker: docker compose up -d worker

๐Ÿ“š ๋ฌธ์„œ

๊ฐ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ƒ์„ธํ•œ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๋Š” ํ•œ๊ตญ์–ด์™€ ์˜์–ด๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์•ฑ

๋ณด์•ˆ

์„ค์ • ๋ฐ ๋ฐฐํฌ

๐Ÿ”ง ํ™˜๊ฒฝ ๊ตฌ์„ฑ

๋‹ค์Œ ํ™˜๊ฒฝ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. DJANGO_SETTINGS_MODULE๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ๋กœ์ปฌ: conf.settings.local
  • ๊ฐœ๋ฐœ: conf.settings.develop
  • ์Šคํ…Œ์ด์ง€: conf.settings.stage
  • ์šด์˜: conf.settings.prod

์ฃผ์š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (.env):

  • ํ•„์ˆ˜
    • SECRET_KEY: Django ์‹œํฌ๋ฆฟ ํ‚ค
    • DJANGO_SETTINGS_MODULE: ์˜ˆ) conf.settings.local ๋˜๋Š” conf.settings.develop
    • DEBUG: True/False
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(PostgreSQL; develop/stage/prod ๊ถŒ์žฅ)
    • POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_HOST, POSTGRES_PORT
    • POSTGRES_REPLICA_HOST, POSTGRES_REPLICA_PORT (์„ ํƒ)
  • ์ด๋ฉ”์ผ
    • EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD, DEFAULT_FROM_EMAIL
  • Sentry
    • SENTRY_DSN
  • AWS/์Šคํ† ๋ฆฌ์ง€(์„ ํƒ)
    • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION_NAME
  • ํšŒ์›๊ฐ€์ž…/ํŒจ์Šค์›Œ๋“œ ๊ด€๋ จ URL
    • SIGNUP_CONFIRM_URL, RESET_PASSWORD_URL, SIGNUP_COMPLETED_URL

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

django-boilerplate/
โ”œโ”€โ”€ src/                       # ์†Œ์Šค ํด๋”
โ”‚   โ”œโ”€โ”€ apps/                  # ์•ฑ ๋ชจ๋“ˆ
โ”‚   โ”‚   โ”œโ”€โ”€ account/           # ๊ณ„์ • ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”œโ”€โ”€ agreement/         # ์•ฝ๊ด€ ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”œโ”€โ”€ benefit/           # ํ˜œํƒ ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”œโ”€โ”€ cms/               # ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”œโ”€โ”€ device/            # ๋””๋ฐ”์ด์Šค ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”œโ”€โ”€ feed/              # ํ”ผ๋“œ ์‹œ์Šคํ…œ
โ”‚   โ”‚   โ”œโ”€โ”€ file/              # ํŒŒ์ผ ๊ด€๋ฆฌ
โ”‚   โ”‚   โ”œโ”€โ”€ game/              # ๊ฒŒ์ž„
โ”‚   โ”‚   โ”œโ”€โ”€ short_url/         # ์ˆ๋งํฌ ๊ด€๋ฆฌ
โ”‚   โ”‚   โ””โ”€โ”€ user/              # ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ base/                  # ๊ณตํ†ต ๋ชจ๋“ˆ
โ”‚   โ”‚   โ”œโ”€โ”€ enums              # ์—ด๊ฑฐํ˜•
โ”‚   โ”‚   โ”œโ”€โ”€ utils              # ๊ณตํ†ต ์œ ํ‹ธ
โ”‚   โ”‚   โ””โ”€โ”€ fields             # ํ•„๋“œ ํด๋ž˜์Šค
โ”‚   โ”œโ”€โ”€ conf/                  # ํ”„๋กœ์ ํŠธ ์„ค์ •
โ”‚   โ”‚   โ”œโ”€โ”€ settings/          # ํ™˜๊ฒฝ๋ณ„ ์„ค์ •
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ base.py        # ๊ธฐ๋ณธ ์„ค์ •
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ local.py       # ๋กœ์ปฌ ํ™˜๊ฒฝ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ develop.py     # ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ stage.py       # ์Šคํ…Œ์ด์ง€ ํ™˜๊ฒฝ
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ prod.py        # ์šด์˜ ํ™˜๊ฒฝ
โ”‚   โ”‚   โ”œโ”€โ”€ urls/              # URL ์„ค์ •
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ admin.py       # ๊ด€๋ฆฌ์ž URL ์„ค์ •
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ api.py         # API URL ์„ค์ •
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ url.py         # URL Shortener ์„ค์ •
โ”‚   โ”‚   โ”œโ”€โ”€ authentications.py # ์ธ์ฆ ์„ค์ •
โ”‚   โ”‚   โ”œโ”€โ”€ caches.py          # ์บ์‹œ ์„ค์ •
โ”‚   โ”‚   โ”œโ”€โ”€ celery.py          # Celery ์„ค์ •
โ”‚   โ”‚   โ”œโ”€โ”€ exceptions.py      # ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
โ”‚   โ”‚   โ”œโ”€โ”€ filters.py         # ํ•„ํ„ฐ ์„ค์ •
โ”‚   โ”‚   โ”œโ”€โ”€ hosts.py           # ํ˜ธ์ŠคํŠธ ์„ค์ •
โ”‚   โ”‚   โ”œโ”€โ”€ routers.py         # ๋ผ์šฐํ„ฐ ์„ค์ •
โ”‚   โ”‚   โ”œโ”€โ”€ schedules.py       # ์Šค์ผ€์ค„๋Ÿฌ ์„ค์ •
โ”‚   โ”‚   โ”œโ”€โ”€ utils.py           # ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
โ”‚   โ”‚   โ””โ”€โ”€ wsgi.py            # WSGI ์„ค์ •
โ”‚   โ”œโ”€โ”€ static/                # ์ •์  ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ templates/             # ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ .env.example           # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์˜ˆ์ œ
โ”‚   โ”œโ”€โ”€ Makefile               # ๋ช…๋ น์–ด ํŒŒ์ผ
โ”‚   โ””โ”€โ”€ manage.py              # Django ๊ด€๋ฆฌ ๋ช…๋ น์–ด
โ”œโ”€โ”€ docs/                      # ๋ฌธ์„œ
โ”‚   โ”œโ”€โ”€ files/                 # ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ ko/                    # ํ•œ๊ตญ์–ด ๋ฌธ์„œ
โ”‚   โ””โ”€โ”€ en/                    # ์˜์–ด ๋ฌธ์„œ
โ”œโ”€โ”€ docker-compose.yml         # Docker Compose ์„ค์ •
โ”œโ”€โ”€ Dockerfile                 # Docker ์ด๋ฏธ์ง€ ์„ค์ •
โ”œโ”€โ”€ pyproject.toml             # ํ”„๋กœ์ ํŠธ ์„ค์ • ๋ฐ ์˜์กด์„ฑ ๊ด€๋ฆฌ (uv)
โ”œโ”€โ”€ uv.lock                    # ์˜์กด์„ฑ ์ž ๊ธˆ ํŒŒ์ผ
โ””โ”€โ”€ README.md                  # ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๐Ÿงฉ ์•ฑ ๊ตฌ์กฐ

๊ฐ ์•ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

app_name/
โ”œโ”€โ”€ v1/                        # API ๋ฒ„์ „ 1
โ”‚   โ”œโ”€โ”€ filters.py             # ํ•„ํ„ฐ์…‹ ํด๋ž˜์Šค
โ”‚   โ”œโ”€โ”€ serializers.py         # ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €
โ”‚   โ”œโ”€โ”€ views.py               # ๋ทฐ ํ•จ์ˆ˜/ํด๋ž˜์Šค
โ”‚   โ”œโ”€โ”€ urls.py                # URL ํŒจํ„ด
โ”‚   โ”œโ”€โ”€ utils.py               # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
โ”‚   โ”œโ”€โ”€ tasks.py               # ๋น„๋™๊ธฐ ์ž‘์—…
โ”‚   โ””โ”€โ”€ tests.py               # ํ…Œ์ŠคํŠธ
โ”œโ”€โ”€ migrations/                # DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
โ”œโ”€โ”€ management/                # ๊ด€๋ฆฌ ๋ช…๋ น์–ด
โ”‚   โ””โ”€โ”€ commands/              # ์‚ฌ์šฉ์ž ์ •์˜ ๋ช…๋ น์–ด
โ”œโ”€โ”€ admin.py                   # ๊ด€๋ฆฌ์ž ์ธํ„ฐํŽ˜์ด์Šค
โ”œโ”€โ”€ apps.py                    # ์•ฑ ์„ค์ •
โ”œโ”€โ”€ models.py                  # ๋ฐ์ดํ„ฐ ๋ชจ๋ธ
โ””โ”€โ”€ signals.py                 # ์‹œ๊ทธ๋„ ์ฒ˜๋ฆฌ

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

๋ฐฑ์—”๋“œ

  • Django 5.1+: ์›น ํ”„๋ ˆ์ž„์›Œํฌ
  • Django REST Framework 3.15+: API ๊ฐœ๋ฐœ
  • Celery 5.2+: ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ
  • Sentry: ์˜ค๋ฅ˜/ํŠธ๋ ˆ์ด์‹ฑ ๋ชจ๋‹ˆํ„ฐ๋ง
  • JWT: ์ธ์ฆ

์ธํ”„๋ผ

  • Docker: ์ปจํ…Œ์ด๋„ˆํ™”
  • Nginx: ์›น ์„œ๋ฒ„
  • AWS S3: ํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€
  • GitHub Actions: CI/CD
  • AWS: ํด๋ผ์šฐ๋“œ ํ˜ธ์ŠคํŒ…

์šด์˜/์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ

  • drf-spectacular: OpenAPI/Swagger ๋ฌธ์„œํ™”
  • django-hosts: ์„œ๋ธŒ๋„๋ฉ”์ธ/ํ˜ธ์ŠคํŠธ ๋ถ„๋ฆฌ
  • django-otp: 2FA(๊ด€๋ฆฌ์ž)
  • debug-toolbar: ๋กœ์ปฌ ๋””๋ฒ„๊น…
  • WhiteNoise: ์ •์  ํŒŒ์ผ ์„œ๋น™

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

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ์ตœ์ ํ™”
  • Redis ์บ์‹ฑ ์ „๋žต
  • Celery๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ
  • ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฒญํฌ ์—…๋กœ๋“œ
  • ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ฐ ํ•„ํ„ฐ๋ง ์ตœ์ ํ™”
  • ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ถ„๋ฆฌ(DB ๋ผ์šฐํ„ฐ, replica ์„ค์ •)

๐Ÿ”’ ๋ณด์•ˆ

  • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ
  • ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๊ด€๋ฆฌ
  • CSRF/XSS ๋ณดํ˜ธ
  • API ์š”์ฒญ ์ œํ•œ
  • ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”
  • OAuth2 ๋ณด์•ˆ ์„ค์ •
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•œ ๋ฏผ๊ฐ ์ •๋ณด ๊ด€๋ฆฌ
  • 2๋‹จ๊ณ„ ์ธ์ฆ(django-otp, ๊ด€๋ฆฌ ์‚ฌ์ดํŠธ)
  • AWS SSM Parameter Store ์—ฐ๋™(์„ ํƒ; ์šด์˜ ์‹œ ์™ธ๋ถ€ ๋น„๋ฐ€ ๊ด€๋ฆฌ)

๐Ÿ“‘ API ๋ฌธ์„œ ๋ฐ ์—”๋“œํฌ์ธํŠธ

  • OpenAPI JSON: /openapi.json/ (๋กœ์ปฌ/๊ฐœ๋ฐœ ํ™˜๊ฒฝ)
  • Swagger UI: /swagger/ (๋กœ์ปฌ/๊ฐœ๋ฐœ ํ™˜๊ฒฝ)
  • Redoc: /redoc/ (๋กœ์ปฌ/๊ฐœ๋ฐœ ํ™˜๊ฒฝ)
  • ํ—ฌ์Šค์ฒดํฌ: /_health/
  • API ๋ฒ„์ €๋‹: ๋ชจ๋“  API๋Š” /v1/ ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ฆฌ์ž(๋กœ์ปฌ ์ „์šฉ): /admin/

  • ๊ด€๋ฆฌ ๋กœ๊ทธ์ธ์€ django-otp ๊ธฐ๋ฐ˜ 2FA๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ตœ์ดˆ ๋กœ๊ทธ์ธ ์‹œ ๋ฐœ๊ธ‰๋œ URL๋กœ OTP๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋ผ์ธ

  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค
  • ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ (TDD)
  • ์ง€์†์  ํ†ตํ•ฉ ๋ฐ ๋ฐฐํฌ (CI/CD)
  • ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ (linting, formatting)
  • ๊นƒ ๋ธŒ๋žœ์น˜ ์ „๋žต (์ž์ฒด ๋ธŒ๋žœ์น˜ ์ „๋žต)

๐Ÿ“ธ ์Šคํฌ๋ฆฐ์ƒท

์–ด๋“œ๋ฏผ ํŽ˜์ด์ง€

backoffice_login.png backoffice_dashboard.png

๐Ÿงช ํ…Œ์ŠคํŠธ

# ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰
uv run python manage.py test

# ํŠน์ • ์•ฑ ํ…Œ์ŠคํŠธ
uv run python manage.py test apps.account

๐Ÿงฐ Makefile ์‚ฌ์šฉ๋ฒ•

src/Makefile์— ์œ ์šฉํ•œ ํƒ€๊นƒ๋“ค์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐœ๋ฐœ ์„œ๋ฒ„: make dev
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ: make test
  • ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ(ํ—ค๋“œ๋ฆฌ์Šค Locust): make load-test

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ํ›„ src/locust_report.html ๋ฆฌํฌํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๐Ÿงฑ ์•ฑ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์Šค์บํด๋”ฉ

apps/common์— ํ…œํ”Œ๋ฆฟ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด, ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ํ‘œ์ค€ํ™”๋œ ์•ฑ ๊ตฌ์กฐ๋ฅผ ์ฆ‰์‹œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

uv run python src/manage.py startapp my_app
  • ์ƒ์„ฑ ์œ„์น˜: src/apps/my_app
  • ํ…œํ”Œ๋ฆฟ ๊ฒฝ๋กœ: apps/common/management/app_template

โš™๏ธ Locust๋กœ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

ํ”„๋กœ์ ํŠธ์—๋Š” tests/locust/locustfile.py๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# Makefile์„ ์ด์šฉํ•œ ์‹คํ–‰(๊ถŒ์žฅ)
make load-test

# ๋˜๋Š” ์ง์ ‘ ์‹คํ–‰
uv run python -m locust -f src/tests/locust/locustfile.py \
  --headless -u 10 -r 5 -t 30s \
  --host=http://127.0.0.1:8000 \
  --html=locust_report.html

์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด src/locust_report.html๋กœ ๊ฒฐ๊ณผ ๋ฆฌํฌํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

  1. ์ด ์ €์žฅ์†Œ๋ฅผ Forkํ•ฉ๋‹ˆ๋‹ค
  2. Feature ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (git checkout -b feature/amazing-feature)
  3. ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค (git commit -m 'Add some amazing feature')
  4. ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค (git push origin feature/amazing-feature)
  5. Pull Request๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค

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

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๐Ÿ“ฎ ์—ฐ๋ฝ์ฒ˜

  • ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž: JAKE
  • ์ด์Šˆ ํŠธ๋ž˜์ปค: GitHub Issues

Contributors

Languages