์ค์ ํ๋ก๋์ ํ๊ฒฝ์ ๋ชฉํ๋ก ์ค๊ณ๋ ์ํฐํ๋ผ์ด์ฆ๊ธ 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 compose up -d --build
# ์น ์ ์: http://localhost:8000
# API ํฌ์ค์ฒดํฌ: http://localhost:8000/_health/- ๋ก์ปฌ(uv):
uv run celery -A conf.celery.app worker -l info - Docker:
docker compose up -d worker
๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ์์ธํ ๋ฌธ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฌธ์๋ ํ๊ตญ์ด์ ์์ด๋ก ์ ๊ณต๋ฉ๋๋ค.
- ๊ณ์ ๊ด๋ฆฌ - ํ์ ๊ฐ์ , ๋ก๊ทธ์ธ, ์์ ๋ก๊ทธ์ธ, ์ด๋ฉ์ผ ์ธ์ฆ ๋ฑ
- ์ฌ์ฉ์ ๊ด๋ฆฌ - ์ฌ์ฉ์ ํ๋กํ ๊ด๋ฆฌ
- ๋๋ฐ์ด์ค ๊ด๋ฆฌ - ๋๋ฐ์ด์ค/ํธ์ ํ ํฐ ๋ฑ๋ก
- ์๋งํฌ ๊ด๋ฆฌ - ์๋งํฌ ์์ฑ ๋ฐ ๊ด๋ฆฌ
- ํผ๋ ๊ด๋ฆฌ - ํผ๋ ๊ด๋ฆฌ
- ์ฝํ ์ธ ๊ด๋ฆฌ - ๊ณต์ง์ฌํญ, ์ด๋ฒคํธ, FAQ ๋ฑ ๊ด๋ฆฌ
- ๊ฒ์ - ์ถ์ ์ฒดํฌ
- Docker ์ค์ ๋ฐ ๋ฐฐํฌ
- ์๋ฒ ๋ฐฐํฌ ๊ฐ์ด๋ (์ค๋น ์ค)
- CI/CD ํ์ดํ๋ผ์ธ (์ค๋น ์ค)
๋ค์ ํ๊ฒฝ์ ์ง์ํฉ๋๋ค. 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.developDEBUG:True/False
- ๋ฐ์ดํฐ๋ฒ ์ด์ค(PostgreSQL; develop/stage/prod ๊ถ์ฅ)
POSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_HOST,POSTGRES_PORTPOSTGRES_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 ์ฐ๋(์ ํ; ์ด์ ์ ์ธ๋ถ ๋น๋ฐ ๊ด๋ฆฌ)
- OpenAPI JSON:
/openapi.json/(๋ก์ปฌ/๊ฐ๋ฐ ํ๊ฒฝ) - Swagger UI:
/swagger/(๋ก์ปฌ/๊ฐ๋ฐ ํ๊ฒฝ) - Redoc:
/redoc/(๋ก์ปฌ/๊ฐ๋ฐ ํ๊ฒฝ) - ํฌ์ค์ฒดํฌ:
/_health/ - API ๋ฒ์ ๋: ๋ชจ๋ API๋
/v1/ํ๋ฆฌํฝ์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ด๋ฆฌ์(๋ก์ปฌ ์ ์ฉ): /admin/
- ๊ด๋ฆฌ ๋ก๊ทธ์ธ์ django-otp ๊ธฐ๋ฐ 2FA๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ก์ปฌ ์ต์ด ๋ก๊ทธ์ธ ์ ๋ฐ๊ธ๋ URL๋ก OTP๋ฅผ ์ค์ ํฉ๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค
- ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ (TDD)
- ์ง์์ ํตํฉ ๋ฐ ๋ฐฐํฌ (CI/CD)
- ์ฝ๋ ํ์ง ๊ด๋ฆฌ (linting, formatting)
- ๊น ๋ธ๋์น ์ ๋ต (์์ฒด ๋ธ๋์น ์ ๋ต)
# ๋ชจ๋ ํ
์คํธ ์คํ
uv run python manage.py test
# ํน์ ์ฑ ํ
์คํธ
uv run python manage.py test apps.accountsrc/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
ํ๋ก์ ํธ์๋ 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๋ก ๊ฒฐ๊ณผ ๋ฆฌํฌํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ์ด ์ ์ฅ์๋ฅผ Forkํฉ๋๋ค
- Feature ๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค (
git checkout -b feature/amazing-feature) - ๋ณ๊ฒฝ์ฌํญ์ ์ปค๋ฐํฉ๋๋ค (
git commit -m 'Add some amazing feature') - ๋ธ๋์น์ ํธ์ํฉ๋๋ค (
git push origin feature/amazing-feature) - Pull Request๋ฅผ ์์ฑํฉ๋๋ค
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฆ ๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
- ํ๋ก์ ํธ ๊ด๋ฆฌ์: JAKE
- ์ด์ ํธ๋์ปค: GitHub Issues

