[Django] 배포
Django 배포 (Deployment)
우리가 배포 과정에서 설정해주어야 했던 사항들을 정리하고 조금 더 알아보도록 하겠습니다.
디버그 모드 (Debug Mode)
기본적으로 Django 프로젝트를 생성하면 settings.py에 디버그 모드가 켜져 있는 상태로 만들어 집니다.
# settings.py
...
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
...
디버그 모드가 켜져 있으면 웹 브라우저에 우리 프로젝트에 대한 자세한 로그를 보여 주는데 개발 중에는 에러가 발생했을 때 쉽게 수정할 수 있게 도와주는 기능이지만 배포 시에는 이와 같은 자세한 로그가 프로젝트의 소스 코드와 여러 설정 값을 노출해서 보안 이슈로 이어지기 때문에 꼭 디버그 모드를 꺼주어야 합니다. 그리고 디버그 모드를 끄게 되면 실제로 ALLOWED_HOSTS에 있는 호스트(hosts) 외에는 일체 접속이 차단 되어 더이상 내 컴퓨터에서도 접속이 되지 않습니다. 그래서 DEBUG 모드를 끄게 되면 호스트를 적어주는 것이 필수 설정 항목이 되는거죠.
호스트 설정 (Allowed Hosts)
호스트(Host)란 쉽게 말하면 네트워크상의 컴퓨터를 말하는데 앞에서 클라이언트와 서버에 대해 배웠죠? 요청하는 호스트가 바로 클라이언트고 요청에 대해 응답을 하는 호스트가 서버입니다. 우리가 ALLOWED_HOSTS에 적는 호스트는 우리 Django 프로젝트로 들어오는 요청에 대해 응답을 할 수 있는 호스트 즉, 서버의 주소를 적어 주는 것입니다. 처음 프로젝트를 생성하면 아래처럼 비어있는 리스트로 생성이 되며
# settings.py
...
ALLOWED_HOSTS = []
...
이렇게 비어있는 호스트이면서 디버그 모드가 켜져 있는 경우에는 [ ‘localhost’, ‘127.0.0.1’, ‘[::1]’ ]과 같은 의미가 되어 로컬 호스트(localhost) 즉 내 컴퓨터에서 접속이 가능한 상태가 됩니다. 그런데 디버그 모드를 끄게 되면 ALLOWED_HOSTS에 적혀있는 호스트 외에는 일체 접속이 차단되기 때문에 심지어 내 컴퓨터에서도 접속이 되지 않게 됩니다. 그래서 우리가 배포할 서버와 내 컴퓨터에 대해 허용해주기 위해 ALLOWED_HOSTS 리스트에 호스트를 추가해주는 것이 필요합니다.
정적 파일 관리 (Static Files)
프로젝트를 개발할 때는 각 앱 별로 정적 파일을 위한 디렉토리를 두고 관리했지만 배포 후 실 서버에서는 정적 파일을 하나의 경로 안에 두고 사용하게 됩니다. 그래서 흩어져있는 정적 파일들을 하나의 경로로 모두 모아 주어야 하는데 이때 사용하는 명령어가 바로 collectstatic 명령어 입니다. collectstatic 명령어는 흩어져 있는 정적 파일을 settings.py에 명시되어 있는 STATIC_ROOT 경로로 복사해서 모아 줍니다.
STATIC_URL과 STATIC_ROOT의 차이
STATIC_URL은 실제 존재하는 경로가 아니라 웹 페이지에서 사용할 정적 파일에 대한 URL입니다. 쉽게 말해서 정적 파일들에 붙여 놓는 하나의 태그 같은 개념이라고 생각하면 됩니다. 예를 들어 STATIC_URL='/static_files/'
라고 하면 정적 파일에 대한 URL은~/static_files/정적 파일
의 형태로 할당됩니다.
반면에 STATIC_ROOT는 실제 존재하는 경로로 Django 프로젝트에서 사용하는 모든 정적 파일이 이 경로에 존재하며 웹 서버가 정적 파일을 찾기 위해 참조하는 실제 경로입니다. 정적 파일에 대한 더 자세한 내용은 다른 토픽에서 다시 설명하도록 하겠습니다. 간단한 내용부터 조금씩 이해하면서 가도록 합시다.
소스코드 관리
이번에 우리는 전체 프로젝트 폴더를 압축해서 PythonAnyWhere의 웹 사이트 UI를 이용해 소스코드를 업로드 했지만 버전 관리 시스템을 사용해서 소스코드를 관리하고 원격 서버에 업로드 하는 방법을 권장합니다. Git, SVN, Mercurial 등의 시스템을 이용하면 되는데 이러한 방법들을 자세하게 알고 싶다면 ‘Git으로 배우는 버전 관리’ 강의를 참고하세요.
PythonAnyWhere를 사용하여 간단하게 배포했지만 사실 Django의 배포는 이것보다 조금 더 세세한 과정들이 있습니다. 이 부분은 열심히 구글링해보자!
댓글남기기