๐ ์ด ํฌ์คํ ์์๋ Django ํ๋ก์ ํธ๋ฅผ ์ํ ์ด๊ธฐ ์ธํ ์ ๋ํด ์ ๋ฆฌํ์์ต๋๋ค.
๐ฅ ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํ๋ก์ ํธ ๊ตฌ์ฑ
๐ฅ Django์ MySQL ์ฐ๊ฒฐ ์ค๋น
๐ฅ settgins.py ์ค์
๐ฅ git & .gitignore ์ค์
โ๏ธ item2์์ ํ๋ก์ ํธ๋ฅผ ์ํ ์๋ก์ด ๊ฐ์ํ๊ฒฝ์ ์์ฑํ๊ณ , ํ์ฑํ ์ํจ๋ค.
$ conda create -n [๊ฐ์ํ๊ฒฝ๋ช ] python=3.8 ๐ ๊ฐ์ํ๊ฒฝ ์์ฑ
$ conda env list ๐ ์์ฑํ ๊ฐ์ํ๊ฒฝ ๋ฆฌ์คํธ ํ์ธ
$ conda activate [๊ฐ์ํ๊ฒฝ๋ช ] ๐ ๊ฐ์ํ๊ฒฝ ํ์ฑํ
โ๏ธ ๊ฐ์ํ๊ฒฝ์ด ํ์ฑํ๋ ์ํ์์ Django๋ฅผ ์ค์นํ๊ณ , Project๋ฅผ ๋ง๋ ๋ค.
$ pip install django ๐ django ์ต์ ๋ฒ์ ์ค์น
$ pip freeze ๐ ์ค์น๋ ํ๋ก๊ทธ๋จ ํ์ธ
$ django-admin startproject [ํ๋ก์ ํธ๋ช ] ๐ django ํ๋ก์ ํธ ์์ฑ
โ๏ธ ๊ฐ์ํ๊ฒฝ์ด ํ์ฑํ๋ ์ํ์์ mysqlclient๋ฅผ ์ค์นํด์ค๋ค.
$ pip install mysqlclient ๐ django ์ต์ ๋ฒ์ ์ค์น
โ๏ธ mysql์ด ์ค์น๋ ์ํ์์ mysql๋ก ์ง์ ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํด ์ค๋ค. ์ด๋ ์ถํ django settings.py์์ sqllite3๋ฅผ ๋์ฒดํ๊ธฐ ์ํจ์ด๋ค.
$ mysql -u root -p ๐ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด root ์ฌ์ฉ์๋ก mysql ์ง์
mysql> create database [DB์ด๋ฆ] character set utf8mb4 collate utf8mb4_general_ci; ๐ DB ์์ฑ
mysql> show databases ๐ DB ์์ฑ ํ์ธ
โ๏ธ root์ฌ์ฉ์๋ก mysql์ ์ง์ ํ ์ํ์์ ์ํ๋ค๋ฉด ์๋์ฒ๋ผ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '[๋ณ๊ฒฝํ ๋น๋ฐ๋ฒํธ]'; ๐ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ
โ๏ธ ์ฌ๊ธฐ๊น์ง ์๋ฃํ๋ค๋ฉด, Django settgins์์ ๋ช๊ฐ์ง settgins์ ๋ค๋ค๋ณด์.
ALLOWED_HOSTS = ['*'] ๐ IP ์ ๋ถ ํ์ฉ
โ๏ธ manage.py์ ๊ฐ์ level์ pythonํ์ผ์ ๋ง๋ค์ด ์ฌ๊ธฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์จ๊ธฐ๊ณ , ์ด ํ์ผ์ .gitignore์ ์ถ๊ฐ์ํด์ผ๋ก์จ ๋
ธ์ถ์ํค์ง ์์์ผ ํ๋ค.
โ๏ธ ์์ฑํ ํ์ผ์ ์๋ ๋ด์ฉ์ ๋ถ์ฌ๋ฃ๊ณ , ์ค์ ์ ๋ณด์ ๋งคํ ์ํจ๋ค.
# my_settings.py DATABASES = { 'default' : { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'DATABASE ๋ช ', # ๐ mysql์์ ์์ฑํ DB๋ช 'USER': '์ฌ์ฉ์๋ช ', # ๐ root๋ฅผ ์ ์ด์ค๋ค. 'PASSWORD': 'DB์ ์์ฉ ๋น๋ฐ๋ฒํธ', # ๐ mysql ๋น๋ฐ๋ฒํธ 'HOST': '127.0.0.1', 'PORT': '3306', 'OPTIONS': {'charset': 'utf8mb4'} } } SECRET_KEY = 'settings.py์ secret_key' # ๐ SECRET_KEY
โ๏ธ settgins.py ์ต์๋จ์ ์ ์ ๋ณด๊ฐ ์กด์ฌํ๋ ํ์ผ์ ๊ฐ์ ธ์ ์ฐ๋์ํจ๋ค.
from my_settings import DATABASES, SECRET_KEY .... .... SECRET_KEY = SECRET_KEY # ๐ ๊ธฐ์กด ์ ๋ณด ์ญ์ ํ, importํ ๋ณ์์ ์ฐ๊ฒฐ์ง๋๋ค. .... .... DATABASES = DATABASES # ๐ sqllite3 ๊ด๋ จ ์ ๋ณด ์ญ์ ํ, importํ ๋ณ์์ ์ฐ๊ฒฐ์ง๋๋ค. .... ....
โ๏ธ Django ํ๋ ์์ํฌ์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ ์ค ๋ถํ์ํ ๊ธฐ๋ฅ(admin, csrf, auth)์ ์๋์ฒ๋ผ ์ฃผ์์ฒ๋ฆฌ ํด์ ๊ฐ๋ณ๊ฒ ๋ง๋ค์ด์ค๋ค.
โ๏ธ Application์ ๋ณต์ก์ฑ์ ์ค์ด๊ธฐ ์ํด 3๊ฐ ํํธ๋ก ๋ถ๋ฅํ์๋ค.
โ๏ธ ๊ฐ์ํ๊ฒฝ ๋ด corsheaders ์ค์น ๋ฐ application & middleware ๋ฑ๋ก
$ pip install django-cors-headers ๐ corsheaders
# Application definition DJANGO_APPS = [ # 'django.contrib.admin', # ๐ admin ๊ธฐ๋ฅ ์ฃผ์ # 'django.contrib.auth', # ๐ auth ๊ธฐ๋ฅ ์ฃผ์ "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", ] PROJECT_APPS = [] THIRD_PARTY_APPS = [ "corsheaders", # ๐ corsheaders ์ฑ ๋ฑ๋ก ] INSTALLED_APPS = DJANGO_APPS + PROJECT_APPS + THIRD_PARTY_APPS MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", # 'django.middleware.csrf.CsrfViewMiddleware', # ๐ csrf ๊ธฐ๋ฅ ์ฃผ์ # 'django.contrib.auth.middleware.AuthenticationMiddleware', # ๐ authentication ๊ธฐ๋ฅ ์ฃผ์ "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", "corsheaders.middleware.CorsMiddleware", # ๐ corsheaderMiddleWare ๋ฑ๋ก ]
โ๏ธ settgins.py ์ตํ๋จ ๋ถ์ CORS ๊ด๋ จ ์ค์ ์ ์ถ๊ฐ์ํจ๋ค.
##CORS CORS_ORIGIN_ALLOW_ALL=True CORS_ALLOW_CREDENTIALS = True CORS_ALLOW_METHODS = ( 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', ) CORS_ALLOW_HEADERS = ( 'accept', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', )
โ๏ธ ํ์ฌ๊น์ง์ settgins์ ๋ฌธ์ ๊ฐ ์๋์ง ์ค๊ฐ ์ ๊ฒ ํ๋ค. ์๋์ ๊ฐ๋ค๋ฉด ์ ์์ด๋ค. ๋นจ๊ฐ๊ธ์จ๋ ์์ง migrations๋ฅผ ์งํํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ ๊ด์ฐฎ๋ค.
$ python manage.py runserver ๐ ์๋ฒ ๊ตฌ๋
โ๏ธ manage.py๊ฐ ์๋ level์ .gitignore์ ์์ฑํ๋ค.
โ๏ธ .gitignore์ ์ถ๊ฐํ ์ ๋ณด๋ฅผ "https://www.toptal.com/developers/gitignore" ์์ ์์ฑ ํ ๋ถ์ฌ๋ฃ๋๋ค.
โ๏ธ python, pycharm, VisualStudioCode, vim, macOS, Linux, zsh ๊ด๋ จ ์ ๋ณด๋ฅผ .gitignore์ ์ถ๊ฐํ์๋ค.
โ๏ธ ์ด์ ํจ๊ป SECRET_KEY์ DATABASE ์ ๋ณด๋ฅผ ๋ถ๋ฆฌ์์ผ ๋ python ํ์ผ์ .gitignore์ ์ถ๊ฐํ๋ค.
# .gitignore my_settings.py
$ git init ๐ git ์ด๊ธฐํ
$ git remote add origin [github repository url] ๐ ์๊ฒฉ repository ์ฐ๊ฒฐ
$ git commit -am "๋ด์ฉ" ๐ add & commit
$ git branch -M main ๐ master ๋ช ์นญ main์ผ๋ก ๋ณ๊ฒฝ
$ git branch [branch๋ช ] ๐ branch ์์ฑ
$ git checkout [branch๋ช ] ๐ ํด๋น branch ์ ํ
$ git checkout -b [branch๋ช ] ๐ branch ์์ฑ ํ ์ด๋
$ git push origin "๋ธ๋ฐ์น๋ช " ๐ github๋ก push
๐ ๋๋์ .
โ๏ธ ํผ์ ๊ณต๋ถํ ๋,
django-admin startproejct [ํ๋ก์ ํธ๋ช ] .
์ ํตํด ํ๋ก์ ํธ๋ฅผ ์์ฑํ์๋ค. ๋ณดํตdjango-admin startproejct config .
๋ก ๋ง๋ค์๋ค. project ๋๋ ํ ๋ฆฌ๋ฅผ app ๋๋ ํ ๋ฆฌ์ ๊ฐ์ ๊ณ์ธต์ ์์น์์ผฐ์๋๋ฐ, ์ (.)์ ๋ถ์ด์ง ์์ผ๋ฉด ๋ฐ์ํ๋ ๋๋ ํ ๋ฆฌ์ ๊น์ด ๋๋ฌธ์ ๋ถํธํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฒ์๋ ์ (.)์ ์ด์ฉํด ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค๊ฐ ๋ค์ ๋ํ ๋ฆฌ์ผ๋๋ก ๋ฐ๋ผ๊ฐ๋ณด์๋ค. ํ ํ๋ก์ ํธ ์, ๋ค๋ฅธ ํธ๋ฆฌ๊ตฌ์กฐ๋ก ์ธํ ๋ฌธ์ ๊ฐ ์ผ๋ ค๋๊ธฐ๋ํ๊ณ , ํ๋ฒ ๋ ์ฐ์ตํด๋ณผ ์๊ฐ์ผ๋ก ์งํํ๋ค. ์ฒ์์๋ pipenv๊ฐ ๊ฐ์ฅ ํธํ๋ค๊ณ ๋๊ผ๋๋ฐ ์ด์ ๋ miniconda๋ก ๊ฐ์ํ๊ฒฝ์ ํ์ฑํํ์ฌ ํ๋ ์์ ์ด ์ ์ฐจ ์ต์ํด์ง๋ ๊ฒ ๊ฐ๋ค.
โ๏ธ SECRET_KEY ๋ฑ ์ํ๊ฐ ํ์ํ ์ ๋ณด๋ฅผ ๋ณ๋๋ก ์ ์ฅํ๊ณ .gitignore์ ๋ฑ๋กํ๊ธฐ ์ํด Django์์ ์ ๊ณตํ๋ dotenv๋ฅผ ์ฌ์ฉํ์๋๋ฐ, ๊ทธ๋ฅ ํ์ผ๋ก ๋ง๋ค์ด import ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ๋ ๊ฐํธํ๊ฒ ๋๊ปด์ก๋ค. ๋ถ๋ช ์ด๋ค ์ฐจ์ด๊ฐ ์์๊ฒ ๊ฐ์๋ฐ ์ฐพ์๋ด์ผ๊ฒ ๋ค.
โ๏ธ ๋ช ๋ฒ์ ๊ฐ๋จํ Django ํด๋ก ์ฝ๋ฉ์ํ๋ฉฐ, ํ๋ก ํธ์ชฝ๊ณผ ํต์ ํ๋ ์๋ฏธ์๋ํด์ '๋ฌด์์ ์ด๋ป๊ฒ ํ๋์ง'์ ๋ํ ์๋ฌธ์ด ์์๋๋ฐ, CORS์ ๋ฑ์ฅ์ผ๋ก ์ด๋ค ๊ฒ์ ๊ณต๋ถํด์ผํ ์ง ์๊ฒ๋ ๊ฒ๊ฐ๋ค. SOP ๊ฐ๋ ๋ถํฐ ์์ํด์ origin, fetch ๋ฑ์ ๋ํด ์์๋ด์ผ๊ฒ ๋ค.
์ด์ Django ์ ํ ์ ์ด ํฌ์คํ ํ๋๋ก - ๋ - ๐ฅ๏ธ๐ฅ๏ธ๐ฅ๏ธ