๐์ฝ๊ธฐ ์ฌ์ด ์ฝ๋ ์์ฑํ๊ธฐ
- ์ถ์ฝ์ ์ด๊ฑฐ๋ ํจ์ถ์ ์ธ ๋ณ์๋ช ์ ํผํ๋ค.
# bad
bal_s_d
# good
balance_sheet_decrease
์งง๊ฒ ์์ผ๋ก์จ ๋ช ์ด ์ ๋ ํ์ ์๊ฐ์ ์๋ ์ ์์์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ฒฐ๊ตญ ๊ทธ๋ฐ ๊ฒ๋ค์ ๋ช ์๊ฐ ๋๋ ๋ฉฐ์น ์ ํ๋นํ๊ฒ ๋๋ ๊ธฐ์ ์ ๋ถ์ฑ๋ก ์ฌ๋ฌ๋ถ์๊ฒ ๋ค๊ฐ์ฌ ๊ฒ์ด๋ค. ๊ทธ๋ฐ ๊ธฐ์ ์ ๋ถ์ฑ๋ฅผ ๋ฏธ๋ฆฌ ๋ง์ ์ ์๋ค๋ฉด ํ์์น๋ ๋ฐ ๋ช ์ด ์ ๋ ์๊ฐ์ ๋ ์จ์ ๋ณ์๋ช ์ ๊ธธ๊ฒ ํ์ด ์ฐ๋ ํธ์ด ์ถฉ๋ถํ ๊ฐ์น ์๋ ์ผ์ผ ๊ฒ์ด๋ค.
- ํจ์ ์ธ์์ ์ด๋ฆ๋ค์ ๊ผญ ์จ์ค๋ค.
- ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋ฌธ์ํํ๋ค.
- ์ฝ๋์ ์ฃผ์์ ๊ผญ ๋ฌ๋๋ก ํ๋ค.
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์ ๋๋ ๋ฉ์๋ ์์์ ๋ฐ๋ณต๋๋ ์ฝ๋๋ค์ ๋ฆฌํฉํฐ๋ง์ ํด๋๋ค.
- ํจ์์ ๋ฉ์๋๋ ๊ฐ๋ฅํ ํ ์์ ํฌ๊ธฐ๋ฅผ ์ ์งํ๋ค. ์ด๋ฆผ์ก์ ์คํฌ๋กค ์์ด ์ฝ์ ์ ์๋ ๊ธธ์ด๊ฐ ์ ํฉํ๋ค.
PEP 8
ํ์ด์ฌ ๊ณต์ ์คํ์ผ ๊ฐ์ด๋ (PEP 8) ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์์ฑํ์
- ๋ค์ฌ์ฐ๊ธฐ์๋ ์คํ์ด์ค๋ฅผ ๋ค ์นธ ์ด์ฉํ๋ค.
- ์ต์์ ํจ์์ ํด๋์ค ์ ์ธ ์ฌ์ด๋ฅผ ๊ตฌ๋ถ ์ง๊ธฐ ์ํด ๋ ์ค์ ๋์ด๋ค.
- ํด๋์ค ์์์ ๋ฉ์๋๋ค์ ๋๋๊ธฐ ์ํด ํ ์ค์ ๋์ด๋ค
PEP 8 ๊ฐ์ด๋๋ฅผ ์์งํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๋๋ค๋ฉด ํ์์ ๋์์ ์๋์ผ๋ก ์ด ๊ฐ์ด๋๋ฅผ ํ์ธํด ์ฃผ๋ ์ฝ๋ ํธ์ง๊ธฐ์ฉ ํ๋ฌ๊ทธ์ธ์ ์ฐพ์์ ์ด์ฉํ์
import
PEP 8์ ์ํฌํธ(import)๋ฅผ ํ ๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ๊ทธ๋ฃน์ ์ง์ ๊ฒ์ ์ ์ํ๊ณ ์๋ค.
- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ import
- ์ฐ๊ด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ import
- ๋ก์ปฌ ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ ๋ import
# ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ import
from __future__ import absolute_import
from math import sqrt
from os.path import abspath
# ์ฝ์ด ์ฅ๊ณ import
from django.db import models
from django.utils.translation import ugettext_lazy as _
# ์๋ ํํฐ ์ฑ ์ํฌํธ
from django_extensions.db.models import TimeStampedModel
# ํ๋ก์ ํธ ์ฑ ์ํฌํธ
from splits.models import BananaSplit
import ๋ฌธ์ ์์ฒ๋ผ ์ฃผ์์ ๋ฌ ํ์๋ ์๋ค. ์์ ์ ์ฃผ์๋ค์ ์์ ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํ ๊ฒ์ผ ๋ฟ์ด๋ค.
- ์ฅ๊ณ ํ๋ก์ ํธ์์์ import ์์
- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ import
- ์ฝ์ด ์ฅ๊ณ import
- ์ฅ๊ณ ์ ๋ฌด๊ดํ ์ธ๋ถ ์ฑ(์๋ ํํฐ ์ฑ) import
- ํ๋ก์ ํธ ์ฑ import
๐ ๋ช ์์ ์ฑ๊ฒฉ์ ์๋ ์ํฌํธ ์ด์ฉํ๊ธฐ
์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฝ๋๋ค์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ด๋์ํค๊ฑฐ๋ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ฒ์ ์ ๋๋๋ ๋ฑ์ ์ฌ๊ตฌ์ฑ์ ์์ฝ๊ฒ ํ ์ ์๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ ์ผ์ด๋ค.
ํ์ด์ฌ์์๋ ๋ช ์์ ์ฑ๊ฒฉ์ ์๋ ์ํฌํธ(explicit relative import)๋ฅผ ํตํด ๋ชจ๋์ ํจํค์ง๋ฅผ ํ๋ ์ฝ๋ฉํ๊ฑฐ๋ ๊ตฌ์กฐ์ ์ผ๋ก ์ข ์๋ ๋ชจ๋์ ์ด๋ ต๊ฒ ๋ถ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ๋ค์ ํผํด ๊ฐ ์ ์๋ค. ์ฅ๊ณ ๋ํ ํ์ด์ฌ์ ํ ํจํค์ง์ด๋ฏ๋ก ๋น์ฐํ ๋ช ์์ ์ฑ๊ฒฉ์ ์๋ ์ํฌํธ์ ํํ์ ๋ณผ ์ ์๋ค.
๋ช ์์ ์ฑ๊ฒฉ์ ์๋ ์ํฌํธ๋ฅผ ์ข ๋ ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์๋ฅผ ๋ค์ด๋ณด๊ฒ ๋ค.
์ผ๋ง๋ ๋ง์ ์์ด์คํฌ๋ฆผ์ ๋จน์๋์ง(์ํ์ฝ, ์๊ฐ์ฝ, ์ผ์ดํฌ์ฝ ๋ฑ ๋ค์ํ ์ฝ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค) ๊ธฐ๋กํ๋ ์ฅ๊ณ ์ฑ์ ๋ง๋ค์๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ทธ ์ค ํ ๋ถ๋ถ์ ์ธ์ฉํด ๋ณด๊ฒ ๋ค.
๋ถํํ๋ ๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ํ๋ ์ฝ๋ฉ๋ ์ํฌํธ ๋ฌธ์ ํฌํจํ๊ณ ์๋ค. ๋ฌผ๋ก ์ด๋ ๊ทธ๋ค์ง ๊ถํ๊ณ ์ถ์ ๋ฐฉ๋ฒ์ ์๋๋ค.
# cones/views.py
from django.views.generic import CreateView
# ์ ๋ ๋ฐ๋ผ ํ์ง ๋ง์์ค ๐
๐ปโโ๏ธ
# 'cones' ํจํค์ง์ ํ๋ ์ฝ๋ฉ๋
# ์๋ฌต์ ์๋ ์ํฌํธ๊ฐ ์ด์ฉ๋์๋ค.
from cones.models import WaffleCone
from cones.forms import WaffleConeForm
from core.views import FoodMixin
class WaffleConeCreateView(FoodMixin, CreateView):
model = WaffleCone
form_class = WaffleConeForm
๋ฌผ๋ก โconeโ ์ฑ ์์ฒด๋ ์์ด์คํฌ๋ฆผ ํ๋ก์ ํธ์์ ๋ฌธ์ ์์ด ์ ์๋ํ๋ค. ํ์ง๋ง ํ๋ ์ฝ๋ฉ๋ ์ํฌํธ ๋ฌธ๋ค์ ์ด์์ฑ ๋ฉด์์๋ ์ฌ์ฌ์ฉ์ฑ ๋ฉด์์ ๋ฌธ์ ๊ฐ ๋๋ค.
ํ๋ ์ฝ๋ฉ๋ ์ํฌํธ ๊ตฌ๋ฌธ์ ํฌํจํ๊ณ ์๋ ์ข์ง ์์ ์์ ๋ฅผ ๋ช ์์ ์ฑ๊ฒฉ์ ์ํ ์ํฌํธ๋ฅผ ์ด์ฉํ ์์ ๋ก ๋ฐ๊ฟ ๋ณด์.
# cones/views.py
from django.views.generic import CreateView
# 'cones' ํจํค์ง ๋ช
์์ ์๋ ์ํฌํธ
from .models import WaffleCone
from .forms import WaffleConeForm
# 'core' ํจํค์ง์์ ์ ๋ ์ํฌํธ
from core.views import FoodMixin
class WaffleConeCreateView(FoodMixin, CreateView):
model = WaffleCone
form_class = WaffleConeForm
์ํฌํธ ํ์ ๊ณผ ์ฉ๋
- ์ ๋ import
from core.views import FoodMixin
์ธ๋ถ์์ ์ํฌํธํด์ ํ์ฌ ์ฑ์์ ์ด์ฉํ ๋ ์ฌ์ฉํ๋ค.
- ๋ช ์์ ์๋ import
from .models import WaffleCone
๋ค๋ฅธ ๋ชจ๋์์ ์ํฌํธํด์ ํ์ฌ ์ฑ์์ ์ด์ฉํ ๋ ์ฌ์ฉํ๋ค.
- ์๋ฌต์ ์๋ import
from models import WaffleCone
์ข ์ข ๋ค๋ฅธ ๋ชจ๋์์ ์ํฌํธํด์ ํ์ฌ ์ฑ์์ ์ด์ฉํ ๋ ์ฐ์ง๋ง ์ข์ ๋ฐฉ๋ฒ์ ์๋๋ค.
๐ import * ๋ ํผํ์
good ๐
from django import forms
from django.db import models
bad ๐
# ์ ๋ ๋ฐ๋ผ ํ์ง ๋ง์์ค ๐
๐ปโโ๏ธ
from django.forms import *
from django.db.models import *
import *
๋ฅผ ์ฐ์ง ๋ง์์ผ ํ๋ ์ด์ ๋ ๋ค๋ฅธ ํ์ด์ฌ ๋ชจ๋์ ์ด๋ฆ๊ณต๊ฐ๋ค์ด ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์์
ํ๋ ๋ชจ๋์ ์ด๋ฆ๊ณต๊ฐ์ ์ถ๊ฐ๋ก ๋ก๋ฉ๋๊ฑฐ๋ ๊ธฐ์กด ๊ฒ ์์ ๋ฎ์ฌ ๋ก๋ฉ๋๋ ์ผ์ ๋ง๊ธฐ ์ํด์๋ค. ์ด๋ด ๊ฒฝ์ฐ ์ ํ ์์์น ๋ชปํ ์ํฉ์ด ๋ฐ์ํ๊ฑฐ๋ ์ฌ๊ฐํ ๊ฒฝ์ฐ ํฐ ์ฌ์์ด ์ผ๊ธฐ๋๊ธฐ๋ ํ๋ค. โ ๏ธ
import *
๊ตฌ๋ฌธ์ ๋ง์น ์์ด์คํฌ๋ฆผ ๊ฐ๊ฒ์ ์์ด์คํฌ๋ฆผ ์ฝ ํ๋๋ฅผ ์ฌ๋ฌ ์์ ์๋ฅธํ ๊ฐ์ง ๋ง ์ ๋ถ๋ฅผ ๋ฌด๋ฃ๋ก ๋ง๋ณด๊ฒ ํด๋ฌ๋ผ๋ ์ผ์น ์๋ ์๋๊ณผ ๊ฐ๋ค๊ณ ๋ณผ ์ ์๋ค. ํ ๋๊ฐ ์ ๋์ ๋ชจ๋๋ง ์ด์ฉํ๊ธฐ ์ํด ์ ๋ถ ์ํฌํธํ ํ์๋ ์๋ค.
์ฆ๊ฒจ ์ผ์๋๋ฐ ์ฐ์ง ๋ง์์ผ๊ฒ ์ด... !
๐ Django ์ฝ๋ฉ ์คํ์ผ
์ด ๋ด์ฉ์ ๊ณต์ ํ์ค์์๋ ๋ ผ์๋์ง ์์๋๋ผ๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ง์ฃผ์น๋ Django ์ปค๋ฎค๋ํฐ์ ์ฌ๋ฌ ์ฝ๋์์ ์ผ๋ฐ์ ์ผ๋ก ํต์ฉ๋๋ ์ฌํญ๋ค์ด๋ค.
URL ํจํด ์ด๋ฆ์๋ ๋์(-) ๋์ ๋ฐ์ค(_)์ ์ด์ฉํ๋ค.
์ฌ๊ธฐ์ ๋งํ๋ URL์ ์น ๋ธ๋ผ์ฐ์ ์์ ์ฐ๋ฆฌ๊ฐ ์ฐ๋ ์ง์ง URL ์ฃผ์(
regex='^add-topping/$'
)๊ฐ ์๋๋ผ url()์ ์ธ์๋ก ์ฐ์ด๋ ์ด๋ฆ์ ๋งํ๋ ๊ฒ์ด๋ค.bad ๐
patterns = [ url(regex='^add/$', view=views.add_topping, name='add-topping'), ]
good ๐
patterns = [ url(regex='^add/$', view=views.add_topping, name='add_topping'), ]
ํ ํ๋ฆฟ ๋ธ๋ก ์ด๋ฆ์ ๋์ ๋์ ๋ฐ์ค์ ์ฌ์ฉํ๋ค.
๐ ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ์ด๋ ํ ์คํธ ํธ์ง๊ธฐ์ ์ข ์๋๋ ์คํ์ผ์ ์ฝ๋ฉ์ ์ง์ํ๋ค.
์์์ ์ฌ์ฉํ๋ ์ฝ๋ฉ ์คํ์ผ์ ๋ฐ๋ฅด์ง ์๋๋ผ๋ ์ผ๋จ ์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ์ ์ ํ ํ ์ผ๊ด์ฑ ์๊ฒ ๋ฐ๋ฅด๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ค. ์ฌ๋ฌ ์คํ์ผ์ด ์์ฌ ์๋ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๊ฐ ์ค์ํ ํ๋ฅ ์ด ๋ ๋์์ง ๋ฟ ์๋๋ผ ๊ฐ๋ฐ์ด ๋๋์ง๊ณ ์ ์ง ๋ณด์์ ์๋นํ ์ ๋ฅผ ๋จน๊ฒ ๋๋ค.
<์ฐธ๊ณ ์์ >
- Two Scoops of Django
'Python > ๐ฆ Django' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Django] ํน์ ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋์ง ํ์ธํด์ผํ ๋ get์ ์จ์ผํ ๊น filter๋ฅผ ์จ์ผํ ๊น? (0) | 2024.03.08 |
---|---|
[Django] DRF ์๋ ํ๋ฆ (0) | 2023.11.23 |
[Django] Django Custom Command (0) | 2023.09.04 |
[Django] JWT๋ก ๋ก๊ทธ์์์ ๊ตฌํํด๋ณด์ (0) | 2023.09.04 |
[Django] QuerySet ์ดํดํ๊ธฐ - Lazy Loading, Caching, Eager Loading (0) | 2023.09.04 |