2월 16, 2022

[Django] 프로젝트 초기 세팅

 Django프로젝트를 생성하고, 초기 개발 환경을 구성하는 과정에 대해 알아보겠습니다.

환경 구성의 큰 틀은 다음과 같습니다.

a. Django 프로젝트 초기 세팅

b. git & github 으로 프로젝트 관리하기


a-1 : 가상환경 생성

가상환경은 각각의 프로젝트마다 하나씩 만들어줍니다. 

왜 각각의 프로젝트마다 별개의 가상환경을 만들어줘야 할까요? 이유는 패키지의 호환 때문입니다.

보통 Python을 설치할 때 딸려오는 패키지 매니저 pip를 사용해 필요한 패키지를 설치하면, 설치된 패키지는 "전역으로 설치"됩니다. 이 경우, 프로젝트를 하나만 진행한다면 문제가 없겠지만, 프로젝트를 여러개 진행하게 될 시 문제가 발생할 수 있습니다. pip로 설치된 패키지는 꾸준히 최신 버전으로 업데이트 받습니다. 그런데 업데이트 한 새로운 버전이 이전의 구버전과의 호환을 지원하지 않는다면, 구 버전으로 만든 서비스 또는 프로젝트는 동작하지 않게 되는 문제가 발생할 수 있습니다. 

따라서 가상환경을 이용해, 프로젝트에 따른 패키지의 버전을 달리하면 구버전과 신버전간의 호환 문제가 발생하지 않습니다.

conda create -n "가상환경 이름" python=3.8

conda activate "가상환경 이름"

가상환경을 생성하고 활성화 하는 코드는 다음과 같습니다.


a-2 : 데이터베이스 생성

다음으로 프로젝트에서 사용할 mysql 데이터베이스를 생성해줍니다.
mysql에 접속해 준 뒤, 다음의 명령어를 입력해줍니다.

mysql> create database NAME character set utf8mb4 collate utf8mb4_general_ci;

character set은 이 데이터베이스가 받아들일 수 있는 문자 세트를 utf8mb4로 지정하라는 뜻입니다.

collate 는 문자열이 정렬될 때, 어떤 문자들이 먼저 올지 결정하는 기준입니다.(정렬방식)

알파벳 정렬시의 순서가 AaBb 가 맞는지, 혹은 ABab가 맞는지를 결정한다고 보면 됩니다.

collate의 기본값은 utf8mb4_general_ci 입니다. 


a-3 : Python package 생성

pip install django
로 django를 설치해줍니다.

pip install mysqlclient

다음으로 Mysql Server에 접속할 수 있게 해주는 mysqlcilent를 설치해줍니다.

이 때, Mysql이 미리, 먼저 설치돼 있어야 합니다.


a-4 : Django project 생성

django-admin startproject westarbucks

해당 명령어로 'westarbucks'라는 장고 프로젝트를 생성해주고, cd를 통해 해당 프로젝트 디렉토리로 이동합니다.
Django 프로젝트의 모든 기준점은 바로 이 폴더, 즉 manage.py가 있는 곳입니다. 추후에 프로젝트에서 명령어를 실행할 때(ex: python manage.py runserver) 모두 manage.py에서 시작하는 것을 통해 이를 알 수 있습니다.

a-5 : Settings.py 변경/ my_settings.py 생성

프로젝트의 설정 정보를 담고 있는 파일이 settings.py입니다. 프로젝트의 목적에 맞게 settings.py를 조율해주어야 합니다.

ALLOWED_HOSTS = ['*']
로 allowed host를 개방해줍니다. 즉, 네트워크에 연결할 수 있는 컴퓨터들을 열어주는 것입니다.

INSTALLED_APPS 리스트에서 사용하지 않는 앱들은 주석처리 해줍니다.
제가 진행하는 프로젝트에서는 admin과 authentication을 사용하지 않으므로 주석처리해줍니다.

admin을 사용하지 않을 것이므로, westarbucks/urls.py의 admin 루트도 지워주도록 합니다.

 

저희는 이 프로젝트를 깃허브에 연동해 사용할 것입니다. 그런데 깃허브에 올라간 파일에 SECRET_KEY와 DATABASES에 대한 정보가 버젓이 올라가 있으면 안되겠죠? 이를 방지하기 위해 my_settings.py라는 파일을 만들고, 이 파일은 .gitignore을 통해 깃과 연동되지 않도록 해줄 것입니다.

manage.py와 같은 위치에 my_settings.py를 touch명령어로 만들어줍니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DATABASE 명',
        'USER': 'DB접속 계정명',
        'PASSWORD': 'DB접속용 비밀번호',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

SECRET_KEY = '시크릿키' #settings.py에 있는 
secret_key 

그리고 그 안에 해당 정보를 적어줍니다.

이 my_settings.py를 settings.py와 연동해 주어야겠죠.

from my_settings import DATABASES, SECRET_KEY

로 my_settings의 값들을 settings.py에 연동해줍니다

그리고 기존의 DATABASES와 SECRET_KEY에 
DATABASES = DATABASES SECRET_KEY = SECRET_KEY

이런식으로 import한 값들을 넣어줍니다.


추가적으로 django-cors-headers도 설치해줘야 합니다.

얘는 뭘까요?? 다음은 MDN의 CORS설명입니다.

출처 : https://developer.mozilla.org/ko/docs/Web/HTTP/CORS

예... 그냥 봐서는 무슨 말인지 전혀 모르겠습니다.

우선 CORS는 "브라우저"의 보안정책입니다. 브라우저는 보안을 이유로 cross-origin인 HTTP요청들을 제한합니다. 따라서 cross-origin 요청을 하려면 "서버"의 동의가 필요합니다 . 서버가 동의한다면 브라우저는 cross-origin 요청을 허락하고, 반대의 경우에는 허락하지 않습니다. 이러한 cross-origin 허락과 거절을 메커니즘을 HTTP-header로 가능케하는 것이 CORS입니다.

cross-origin은 어떤 경우를 말하는 걸까요?? 

a. 프로토콜이 다르거나(http와 https)

b. 도메인이 다르거나 

c. 포트번호가 다른경우

입니다.

따라서 cross-origin HTTP요청을 경우에 따라서는 허가해줘야 합니다.

django-cors-headers는 CORS에 필요한 서버의 헤더를 조작하는 Django앱입니다.

이것을 설치해주고, INSTALLED_APPS와 MIDDLLEWARE에 추가해줍니다.


여기까지 해보고, pythonmanage.py runserver로 서버를 실행시켜봅니다. 로켓이 날아간다면 성공한 것입니다


다음으로, 저희가 생성한 프로젝트를 git과 github를 통해 관리할 수 있어야 합니다.

b-1 : git 초기화 & .gitignore 생성

생성한 장고 프로젝트를 git으로 관리할 수 있도록 git을 초기화해줍니다.

manage.py 와 같은 위치에서 git init 명령어를 실행해 줍니다


앞서서 DATABASES와 SECRET_KEY에 대한 정보를 settings.py에서 분리해서 관리해주었던 과정을 기억하시나요?

그때 만들었던 my_settings.py 파일은 깃에 연동되지 않도록 해주어야 합니다.

에서 운영체제, 에디터, zsh, 언어 등의 키워드를 넣으면 gitignore파일의 내용을 생성해줍니다. 

.gitigore파일을 touch 명령어를 통해 만들어준 후, 생성된 gitignore파일의 내용을 복사 붙여넣기 해줍니다. 그리고, 파일 하단에 my_settings.py를 추가하여, my_settings.py를 git이 무시하도록 해줍니다.


b-2 : add & commit

이제 깃과 연동하여 프로젝트를 진행할 준비가 마쳐졌습니다. 

add와 commit을 진행해줍니다.


b-3 : branch 생성

이제 브랜치를 생성한 이후, 해당 브랜치에서 app을 생성할 것입니다.
주의할 점이 있습니다. 

master(main) 브랜치에서는 초기 세팅 이외에는 어떠한 작업도 하지 않습니다.

브랜치를 새로 딸때에는 master(main)에서 새로 만들어야 합니다.

main브랜치는 초기세팅까지만 딱 완료한 그 상태로 존재해야 합니다.

또한, 브랜치를 생성할때에는 내가 현재 위치하고 있는 브랜치를 기준으로 생성이 됩니다.

app을 생성한 1번브랜치에서, 다른 앱을 생성하기 위해 2번 브랜치를 만들게 된다면, 1번 브랜치와 2번 브랜치가 연동되어 버리는 불편함이 생길것입니다. 

따라서 초기세팅까지 완료된 main브랜치로 돌아와 새로운 브랜치를 만들어줘야만 합니다!


b-4 : branch 생성

이제 app을 만들 준비가 다 됐습니다.

python manage.py startapp products

로 products란 app을 만들어주고, 

settings.py 의 INSTALLED_APPS에 추가해줍니다.


b-5 : Github Push

앱까지 만들었으니, 진행상황을 깃헙에 푸쉬해줄 필요가 있습니다.
add와 commit을 먼저 진행해줍니다.

remote한 github repository에 로컬의 진행상황을 push해주려면, remote 저장소를 origin에 넣어준 뒤, push를 진행하면 됩니다.

git remote add origin깃헙 repo링크

origin이란 변수에 깃헙 repo의 링크를 추가해주겠다는 코드입니다.

이후 밑의 코드로 로컬의 내용을 remote에 push(밀어넣어) 줍니다.

git push origin 브랜치이름