๐Ÿ“ Django ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ์ด๋ ‡๊ฒŒ ์งœ๋ฉด ํ˜‘์—…์ด ํŽธํ•ด์ง„๋‹ค (์‹ค๋ฌด ์˜ˆ์ œ ํฌํ•จ)

Django ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ์ด๋ ‡๊ฒŒ ์งœ๋ฉด ํ˜‘์—…์ด ํŽธํ•ด์ง„๋‹ค

๐Ÿ“ Django ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ์ด๋ ‡๊ฒŒ ์งœ๋ฉด ํ˜‘์—…์ด ํŽธํ•ด์ง„๋‹ค (์‹ค๋ฌด ์˜ˆ์ œ ํฌํ•จ)


๐Ÿ“Œ ์„œ๋ก : ๊ตฌ์กฐ๊ฐ€ ์—‰๋ง์ด๋ฉด ํ˜‘์—…๋„ ์—‰๋ง์ž…๋‹ˆ๋‹ค

Django๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ–ˆ์„ ๋• ๋‹ค ๊ดœ์ฐฎ์•˜์Šต๋‹ˆ๋‹ค [1].

views.py, models.py, settings.py ์•ˆ์—์„œ ์ž‘์€ ๊ธฐ๋Šฅ๋“ค์„ ์ฐจ๊ณก์ฐจ๊ณก ์Œ“์•„๊ฐ”์ฃ  [1].

ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ํŒ€์›์ด ๋Š˜์–ด๋‚˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์„œ๋กœ ๊ผฌ์ด๊ณ  ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1].

๋ฌด์–ธ๊ฐ€ ๋ฐ”๊ฟ€ ๋•Œ๋งˆ๋‹ค ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๊ฐ€ ํ„ฐ์ง€๊ณ , ๋ฆฌ๋ทฐ ์‹œ๊ฐ„์€ ๊ธธ์–ด์ง€๊ณ … [1]

๊ทธ ์›์ธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ”๋กœ “์ •๋ฆฌ๋˜์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ”์ž…๋‹ˆ๋‹ค [1].

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•  ๋•Œ ์“ฐ๋ฉด ์ข‹์€ Django ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์‹ค๋ฌด ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค [1].


๐Ÿงฑ ๊ธฐ๋ณธ Django ๊ตฌ์กฐ์˜ ๋ฌธ์ œ์ 

๊ธฐ๋ณธ Django ๊ตฌ์กฐ๋Š” ์ž‘๊ณ  ๋‹จ์ˆœํ•œ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜์ง€๋งŒ, ํ˜‘์—… ํ™˜๊ฒฝ์—์„  ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [2].

์˜ˆ๋ฅผ ๋“ค์–ด users/views.py, users/models.py์— ๋ชจ๋“  ๋กœ์ง์ด ๋ชฐ๋ ค ์žˆ์œผ๋ฉด [2]

  • git ์ถฉ๋Œ ๋ฐœ์ƒ๋ฅ  ↑ [2]
  • ๊ธฐ๋Šฅ ๋ถ„๋ฆฌ ์–ด๋ ค์›€ [2]
  • ๊ณตํ†ต ๋กœ์ง ์žฌ์‚ฌ์šฉ ์–ด๋ ค์›€ [2]
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์–ด๋ ค์›€ [2]

๊ฒฐ๊ตญ ํ˜‘์—… ์ƒ์‚ฐ์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค์–ด์ง‘๋‹ˆ๋‹ค [2].


๐Ÿ”„ ํ˜‘์—…์— ์ ํ•ฉํ•œ Django ๊ตฌ์กฐ๋ž€?

๋‹ค์Œ ์š”์†Œ๋“ค์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2]:

  • ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋œ ๊ตฌ์กฐ (views, services, usecases ๋“ฑ) [2]
  • ์„ค์ • ํŒŒ์ผ ๋ถ„๋ฆฌ (dev/prod/base) [2]
  • ๊ณตํ†ต ๋กœ์ง/์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ถ„๋ฆฌ [2]
  • ์—ญํ•  ๊ธฐ๋ฐ˜์˜ ๋ชจ๋“ˆ ์„ค๊ณ„ (DB → ์„œ๋น„์Šค → API ํ๋ฆ„) [2]

๐Ÿ“ ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์“ฐ๋Š” Django ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ


myproject/
├── apps/
│   ├── users/
│   │   ├── models/
│   │   ├── services/
│   │   ├── views/
│   │   ├── urls.py
│   │   └── serializers.py
│   └── posts/
│       ├── models/
│       ├── views/
│       └── ...
├── config/
│   ├── settings/
│   │   ├── base.py
│   │   ├── dev.py
│   │   └── prod.py
│   └── urls.py
├── utils/
│   ├── logger.py
│   └── common.py
└── manage.py
    

๐Ÿ“Œ ํ•ต์‹ฌ ํฌ์ธํŠธ

  • apps/ ํด๋”๋ฅผ ๋งŒ๋“ค์–ด ์•ฑ๋“ค์„ ์ •๋ฆฌ [3]
  • ๊ฐ ์•ฑ ์•ˆ์—์„œ ๋„๋ฉ”์ธ ๊ธฐ์ค€์œผ๋กœ services, models, views ๋“ฑ ์—ญํ• ๋ณ„ ๋ถ„๋ฆฌ [3]
  • config/settings ์•ˆ์— base/dev/prod ์„ค์ • ํŒŒ์ผ์„ ๋‚˜๋ˆ  ํ™˜๊ฒฝ๋ณ„ ์„ค์ •์„ ๊ตฌ๋ถ„ [3]
  • ๊ณตํ†ต ์œ ํ‹ธ์€ utils/ ํด๋”์— ๋”ฐ๋กœ ๊ด€๋ฆฌ [3]

๐Ÿง  ์‹ค๋ฌด ํŒ: ํ˜‘์—… ์‹œ ์ฃผ์˜ํ•  ์ 

✅ 1. ์ฝ”๋“œ ๊ตฌ์กฐ ๊ทœ์น™ ๋ช…์‹œ

  • README.md๋‚˜ CONTRIBUTING.md์— ํด๋” ๊ตฌ์กฐ ์„ค๋ช… [4]
  • ์–ด๋””์— ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์•ผ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ! [4]

✅ 2. ํƒ€์ž… ํžŒํŠธ ์ ๊ทน ์‚ฌ์šฉ

  • Python 3.10+์—์„œ๋Š” ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ž… ํžŒํŠธ ํ•„์ˆ˜ [4]
  • mypy, pyright๋กœ ์ •์  ๋ถ„์„ ์ถ”๊ฐ€ [4]

✅ 3. ๋ฆฐํ„ฐ & ํฌ๋งทํ„ฐ ์‚ฌ์šฉ

  • black, isort, flake8์„ Git hook ๋˜๋Š” CI์— ์—ฐ๋™ [4]
  • ์ผ๊ด€๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ๋กœ ๋ฆฌ๋ทฐ ์‹œ๊ฐ„ ์ ˆ์•ฝ [4]

✅ 4. ํ…Œ์ŠคํŠธ ์ž๋™ํ™”

  • pytest, factory_boy ๋“ฑ์œผ๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ [4]
  • GitHub Actions๋กœ ํ‘ธ์‹œ ์‹œ ์ž๋™ ํ…Œ์ŠคํŠธ ์‹คํ–‰ [4]

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ: ๊ตฌ์กฐ๊ฐ€ ํŒ€ ์ƒ์‚ฐ์„ฑ์„ ๋ฐ”๊พผ๋‹ค

ํ˜‘์—…์— ๊ฐ•ํ•œ Django ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋Š” [4]

  • ✔️ ์ฝ”๋“œ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง€๊ณ  [4]
  • ✔️ ๋ฆฌ๋ทฐ ํšจ์œจ์ด ์˜ฌ๋ผ๊ฐ€๋ฉฐ [4]
  • ✔️ ์ƒˆ๋กœ ๋“ค์–ด์˜จ ๊ฐœ๋ฐœ์ž๋„ ๋น ๋ฅด๊ฒŒ ์ ์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4].

๋‹น์žฅ ์ง€๊ธˆ ๊ตฌ์กฐ๊ฐ€ ์–ด์ง€๋Ÿฝ๋‹ค๊ณ  ๋А๊ปด์ง„๋‹ค๋ฉด, ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•ด์„œ ๋ฆฌํŒฉํ† ๋ง์„ ์‹œ์ž‘ํ•ด๋ณด์„ธ์š”! [4]


๐Ÿ‘‰ ๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์œ„ ๊ตฌ์กฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค ๋ ˆ์ด์–ด์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ„๋ฆฌ์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค [5].

๊ถ๊ธˆํ•œ ์ ์ด๋‚˜ ์š”์ฒญํ•˜๊ณ  ์‹ถ์€ ์ฃผ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ์ด๋ฉ”์ผ๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”! [5]


๋Œ“๊ธ€