프로젝트를 시작하기 전에 가장 먼저 해야할 일은 초기 세팅이다. 초기 세팅이란 사전에 내가 필요한 것들을 가상환경에 마련해 놓는 행위라고 보면 된다. 가상 환경에서 공유되는 패키지 버전 관리들이 동일한 내용으로 이루어져야지 협업이 가능하다.
프로젝트마다 독립적인 패키지 관리를 하기 위해 새로운 가상환경을 만들어보자.
# 가상환경 생성
$ conda create -n "가상환경_이름" python=3.8
$ conda activate "가상환경_이름"
내가 만든 가상환경의 개수와 위치를 알고싶으면 아래의 명령어를 입력하면 된다.
$ conda info --envs
# 이 명령어를 입력해도 된다.
$ conda env list
만약 가상환경에서 나가고 싶으면 conda deactivate
를 입력하면 된다. 가상환경을 삭제하는 방법은 conda env remove -n <가상환경_이름>
이다.
이제 mysql이라는 RDBS에 접근해서 데이터베이스를 만들어보자.
$ mysql -u root -p
create database 데이터베이스_이름 character set utf8mb4 collate utf8mb4_general_ci;
데이터베이스가 잘 만들어졌는지 확인하자.
show databases;
$ pip install django
# 이후에 MySQL server에 접속하기 위한 package
$ pip install mysqlclient
# mysql 설치되어 있는지 먼저 확인 필수
mysqlcient
는 Django와 mysql 사이의 통신을 해준다. Django에서 쓰는 명령어들이 mysql에 잘 적용될 수 있도록 한다.
$ pip install django
# 이후에 MySQL server에 접속하기 위한 package
$ pip install mysqlclient
Django 내 파이썬 관련 패키지 모듈들의 설치 여부를 확인할 수 있는 명령어는 pip list
와 pip freeze
가 있다. 보통 버전 공유를 할 때는 컴퓨터가 읽기 편한 pip freeze
명령어를 쓴다. 버전 관리를 위해 requirement.txt
파일을 만들어서 내용을 저장해두는데, 이렇게 txt 파일을 만들어 두면 다른 개발자들은 이 파일을 다운받아 한 번에 동일한 패키지를 설치할 수 있다.
# 패키지 리스트를 txt 파일에 저장
$ pip freeze > requirements.txt
# txt 파일 안의 패키지 설치
$ pip install -r requirements.txt
Django Project에 돌입해보자. 아래 명령어로 프로젝트 폴더를 만들면 Django 인스턴스를 구성하는 수많은 파일과 설정들이 자동 생성될 것이다.
$ django-admin startproject 프로젝트_폴더_이름 .
앞에 .
을 안붙이면 새로운 파일이 만들어지고 그 안에 프로젝트 파일이 설치된다.
만약 폴더를 잘못 만들었다면 아래 명령어로 삭제 가능하다,
를 구성하는 수많은 파일과 설정들이 자동 생성될 것이다.
$ rm -r 프로젝트_폴더_이름
ALLOWED_HOSTS = ['*']
TIME_ZONE = 'Asia/Seoul'
USE_TZ = False
Settings.py
일단 직접 한 번 구현해 보기 위해서 Django의 기능 중 일부는 빼고 사용하겠다. 이 중에서 CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조)란 공격자로 인해 사용자의 요청이 서버를 공격하게 되는 것을 말한다. 지금은 로컬 통신으로 서버에 혼자 연결하기 때문에 csrf도 지운다.
urls.py
앞서 admin을 주석처리했기 때문에 사용되지 않는 임포트 문이 있는 경우에 error가 발생한다. 사용하지 않는 구문은 삭제하자.
#from django.contrib import admin
from django.urls import path
urlpatterns =
# path('admin/', admin.site.urls),
모든 정보를 settings.py
에 바로 저장되는 방식은 위험하다. settings.py
는 공유되는 파일이기 때문이다. 그렇기 때문에 보안되어야 하는 정보는 따로 파일을 만들어서 관리하는게 좋다. SECRET_KEY, DATABASE는 소스로서 공유해야하는 내용이 아니기 때문에 my_settings.py
를 만들어서 따로 저장하자. settings.py
에 있는 SECRET_KEY
, DATABASE
의 값도 수정하자.
파일은 manage.py
파일이 있는 디렉토리에 만들어야한다. 실수로 다른 곳에 만들었다가 옮기는 시간낭비는 하지 않도록 하자...(경험자...)
$ cd '생성한 프로젝트 폴더명'
$ touch my_settings.py
# my_settings.py
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DATABASE 명',
'USER': 'DB접속 계정명', #'root'
'PASSWORD': 'DB접속용 비밀번호',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
SECRET_KEY = '시크릿키' #시크릿키sms settings.py에 있는 secret_key 복붙
settings.py
에서는 아래 내용을 추가한다.
from my_settings import DATABASES, SECRET_KEY
SECRET_KEY = SECRET_KEY
DATABASES = DATABASES
맥 M1을 쓰는 경우에는 pymysql을 mysql 클라이언트 대용으로 사용해야 한다(인텔은 상관 없다).
pymysql은 mysql을 python에서 사용할 수 있도록 한다.
$ pip install PyMySQL
# settings.py에 아래 내용 추가
import pymysql
pymysql.install_as_MySQLdb()
CORS(Crosss-Origin Resource Sharing)라고 전혀 다른 도메인끼리 소통할 수 있게 하는것이 있다. 아래와 같이 패키지를 설정하면 쉽게 사용할 수 있다.
$ pip install django-cors-headers
#settings.py에 아래 내용 추가
INSTALLED_APPS =
...
'corsheaders'
MIDDLEWARE =
...
'corsheaders.middleware.CorsMiddleware',
...
# CORS 추가 설정. settings.py 맨 아래에 추가.
# 공식 문서에 있는 CORS 기본 설정. cors origin을 모두 허용한다.
##CORS
CORS_ORIGIN_ALLOW_ALL=True #원하는 IP를 입력하면 해당 IP랑만 소통한다.
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_METHODS = ( #http 통신 메소드.
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
)
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
#settings.py에 아래 내용 추가
APPEND_SLASH = False
APPEND_SLASH
를 직역하면 슬래시를 추가한다는 뜻이다. 즉, url의 주소 끝에 슬래시를 추가하는 기능인데 슬래시가 붙어서 error가 발생하는 상황을 방지하기 위해서 False로 설정하겠다.
오류가 발생하는지 확인해보자.
python manage.py runserver
성공이다. 그런데 빨간 글씨의 migration과 migrate는 뭘까? migration의 사전적 의미는 이주, 이동을 말한다. makemigration
은 models.py
에 있는 class들을 가지고 데이터베이스에 적용하기 전에 만드는 설계도이고, migrate
는 설계도를 토대로 데이터베이스에 적용 하는 것이다.
$ python manage.py makemigrations
는 migrations 폴더를 만들어주고, $ python manage.py migrate
는 migrations 파일을 db에 연동한다.
$ python manage.py makemigrations
$ python manage.py migrate
명령어를 입력하기 전에 아까 새롭게 만든 데이터베이스의 테이블을 조회해 보자.
use 데이터베이스_이름;
show tables;
Empty set (0.00 sec)
라고 출력될 것이다. 위의 두 migrations 명령어를 입력하면 테이블이 생성될 것이다.
이제 앱을 만들어보자. Django 프로젝트는 다수의 앱으로 구성된다. 예를 들어 로그인앱, 게시판앱, 관리자앱 등의 앱이 모여서 하나의 웹 페이지를 구성할 수 있다.
django-admin startapp 앱_이름
앱을 삭제하고 싶다면 $ rm -rf 앱_이름
명령어를 사용하면 된다.
앱을 만들었다면 setting.py
의 INSTALLED_APPS
에 앱 이름을 추가해서 앱을 생성했음을 알리자.
# settings.py
INSTALLED_APPS =
...
'앱_이름',
그리고 다시 migration을 한다.
$ python manage.py makemigrations
$ python manage.py migrate
버전 관리 방법을 알아보자. Github로 가서 새로운 repository를 만든 후 git을 연동하기 위해 저장소를 생성(초기화)한다.
$ git init
Branch의 기본값은 master로 설정되는 것을 볼 수 있다. 이 이름은 $ git branch -M master 바꿀_이름
으로 변경할 수 있다.
소스를 공유하기 위해 git 을 사용하지만 올리고 싶은것 올리고 싶지 않은것, 올려서는 안되는 것들이 존재한다. 이를 구분하기 위해 깃이 설치된 디렉토리에 .gitignore 파일을 생성해서 관리해야 한다. git add commit 시에 올리고 싶지 않은 것은 .gitignore 파일에 정의하면 된다.
gitignore.io(https://www.toptal.com/developers/gitignore/) 사이트에 들어가서 아래 키워드를 추가 후 Create 버튼을 누르면 gitignore에 해당되는 것들을 자동으로 생성해준다. 이를 복사해서 .gitgnore 에 추가해주자. 파일 이름에 .
이 있으면 숨김파일로 만들어진다.
python, pycharm, VisualStudioCode, vim, macOS, Linux, zsh
생각보다 프로젝트때마다 일일이 복붙하기 힘드니 코드를 따로 포스팅 해두겠다. GO
그리고 마지막으로 아까 만든 my_settings.py
도 맨 마지막에 추가해 주자.
# .gitignore
my_settings.py
$ git status
명령어를 사용하면 add 되지 않은 파일들을 확인할 수 있다.
$ git add .
를 입력해 add 를 하자. 다시 $ git status
를 확인해서 잘 add됐는지 확인한 후 $ git commit -m "커밋_메세지"
commit을 하면 된다. $ git commit
만 입력하면 두 줄 이상의 커밋 메세지를 입력할 수 있다. commit 후 $ git log
를 통해 commit 이력을 볼 수 있다.
만약 commit 메세지를 변경하고 싶다면 $ git commit --amend
를 활용하자. 굳이 이럴 상황을 안만드는게 제일 좋긴 하다...(눈물)
이제 push를 할 수 있는 조건이 완성됐다! 아까 github에서 repository를 만들었을 때 만들어진 https 주소가 있을 것이다. 이 주소를 사용해서 github에 push를 해볼것이다.
실수를 방지하기 위해 $ git branch
로 push를 할 branch를 확인하고 git remote -v
명령어로 git에 등록된 원격 저장소 리스트를 확인한다. 아마 아무런 내용도 나오지 않을것이다. git remote add origin github_주소
를 입력해서 remote에 추가하면 된다(여기서 origin이란 가장 기본 주소가 되는 이름을 말한다).
만약 원격저장소를 git의 설정에서 삭제하고 싶다면 $ git remote remove origin
명령어를 사용하자.
마지막으로 $ git push origin main
을 입력하면 push가 완료된다!
앱의 기능에 따라 branch를 따로 파서 관리할 수 있다.
$ git branch branch_이름
$ git checkout branch_이름 #branch 이동
$ django-admin startapp 앱_이름
그리고 새로운 vranch에 add할 수 있다.
$ git add .
$ git commit -m "커밋_메세지"
$ git log
$ git push origin branch_이름
github로 돌아가 branch를 merge 한 후 다시 메인 branch로 돌아가자.
$ git checkout main
그리고 $ git log
명령어를 입력해보면 github main에는 merge가 됐지만 local main에는 반영이 안되어있는걸 볼 수 있다. $ git pull origin main
을 입력하면 반영이 된다. 다시 $ git log
를 확인해보자.
DEBUG
DEBUG가 True인 경우에는 오류 내용을 담은 에러메세지를 반환한다. 이건 오류 발생시 서버 정보가 노출된다는 말과 같다. 그래서 웹서비스 상용화 단계까지 가면 DEBUG
값은 꼭 False로 해야 한다. 우선 지금 단계에서는 디버깅을 위해 True 로 해두자.
ALLOWED_HOSTS
접속 할 수 있는 IP 주소를 지정한다.
MIDDLEWARE
웹 통신에 있어서 보안성을 위한 여과장치다. 클라이언트가 http 통신 방식으로 요청을 보내면 MIDDLEWARE를 통과해야지만 서버로 넘어올 수 있다.
ROOT_URLCONF
웹 사이트에서 URLconf로 사용할 파이썬 모듈 중 어떤 것을 사용할지 알려준다.
TEMPLATES
HTML을 동적으로 생성할 수 있는 템플릿이다. 온전히 백엔드 서버로서만 기능하기에 있어서는 굳이 사용하지 않아도 되는 기능이다.