[Django] Settings.py 분리하기

🌟Django Settings 분리하기

🎯settings.py를 하나로 쓸때의 문제점

기존처럼 settings.py를 하나로 사용하게 되면 개발 시 DEBUG값을 true 로 두었다가 배포할때 false로 바꾸어야 하는 번거로움이 있습니다. 이외에도 환경마다 설정을 일일이 달리해야하는 등의 불편함도 있습니다.

🎯settings.py 왜 분리해서 사용할까요?

settings.py를 분리하게 되면 몇가지 장점들이 있는데 다음과 같습니다.

  1. 기본 환경에 들어있는 디버그 변수를 사용하지 않아도 된다.
  2. 개발할 땐 개발용 세팅을, 배포할땐 배포용 세팅을 따로 분리해두므로 그때그때 변경하지 않아도 된다.
  3. local환경 버전관리에도 좀더 용이하다. 결론적으로 얘기하자면 환경마다 settings.py 설정 및 적용을 달리할 수 있다는 장점때문에 실무에서는 주로 settings.py를 분리해서 사용합니다.

🎯settings.py 분리방식

settings.py를 쪼갤때는 공개여부에 따라 파일을 분리합니다. 모든 환경에서 공통적으로 사용되는 공개 설정은 base.py 라는 파일에 작성하고 환경에 따라 설정을 달리 작성할 때는 local(development).py,production.py를 활용합니다. 비공개 설정은 대부분 환경변수를 활용합니다. 설정값에 환경변수를 로드하여 공개여부를 설정할 수 있습니다. 공개적인 설정은 레포지토리에서 저장되지만, 비공개 설정은 gitignore에 반드시 추가하여 관리해야 합니다.

🎯settings.py 분리하기

  1. development.py 베이스를 전부 임포트해와서 상속받은 뒤, debug는 true로, database는 개발용 임시db(default)로 정의해줍니다. 이때는 debug가 true이므로 allowed_host엔 자동으로 로컬주소가 입력됩니다.
  2. production.py 베이스를 전부 임포트해와서 상속받은 뒤, debug는 false로, database는 배포용 데이터베이스로 정의해줍니다. 추가적으로 allowedhost에 실제로 런칭할 서비스의 웹사이트 도메인을 추가하여, 권한을 도용하여 중요기능을 실행시키는 CSRF 공격으로부터 웹사이트를 보호합니다. 이는 debug가 false값일때 활성화되며 allowedhost에 도메인이 추가되어있지 않으면 Disallowedhost가 발생하여 웹사이트가 정상적으로 작동하지 않습니다.
  3. settings.py base.py에 있는 BASE_DIR은 프로젝트의 root 경로를 저장해두는 변수입니다. 이 변수를 통해 파일의 경로를 지정하는데, 우리는 기존의 settings.py를 안쪽으로 한번 쪼갰으므로 기존의 변수에서 os.path.dirname()을 한번 더 추가하여 root 경로를 한단계 더 안쪽으로 설정해줍니다.

🎯분리한 settings.py 적용하기

각각 나눠진 파일들을 아래의 명령어를 통해 따로따로 적용하여 runserver 할 수 있습니다.

python3 manage.py shell --settings = 프로젝트 폴더.settings.사용할 파일명
python3 manage.py runserver --settings = 프로젝트 폴더.settings.사용할 파일명

이외에도 shell을 통해서 환경변수를 지정해주는 방식도 있습니다.

하지만 두 방법 다 매번 runserver마다 작성해야하므로 쓰기 번거롭습니다. 이때 가상환경 내에 DJANGOSETTINGSMODULE 환경변수를 등록해두면 —settings 없이도 사용할 수 있게 됩니다. shell을 통해 .env 위치로 들어간 뒤, 가상환경을 활성화 하고 다음 내용을 작성하여 환경변수를 등록해줍니다.

DJANGO_SETTINGS_MODULE = 프로젝트 폴더.settings.사용할 파일명

🎯 requirements.txt 분리하기

settings.py를 개발용과 배포용으로 나눈김에 requirements.txt도 공통,개발용,배포용으로 나누면 패키지설치에 필요한 시간과 메모리를 줄일 수 있습니다. 두 환경 다 공통적으로 설치해야하는 것base.txt개발할때만 필요한 패키지development.txt배포할때 필요한 패키지production.txt에 넣어서 따로따로 설정합니다.

참고링크
https://cjh5414.github.io/django-settings-separate/ https://wikidocs.net/6606#_5 https://ehfgk78.github.io/2018/02/02/Django-Settings_Requirements/#heading-5-requirementstxt-%EB%B6%84%EB%A6%AC


Written by@이주형
平常心

GitHubFacebook