본문 바로가기

프로그래밍/Django

[Django] settings 환경 분리하기

settings 분리하기

Django settings 환경 분리하기

장고를 처음 배우면서 가장 당황했던 일은 settings.py이란 파일은 온데간데 없고, deploy.py, debug.py로 환경세팅을 나누는 것이었다.

원래는...

./manage.py runserver

runserver를 할 때는 명령어가 간단했는데, 이제는 파일을 나누게 되니까 여러모로 당황스러웠다.

./manage.py runserver --settings=config.settings.debug # 개발(디버그)용 
./manage.py runserver --settings=config.settings.deploy # 배포(서비스)용 

환경 세팅이 deploy용과 debug용으로 나뉘면 런서버를 실행하는 법도 바꿔줘야 한다.
그냥 /.manage.py runserver라고만 한다면 장고는 어떤 걸 실행해야 할지 모르기 때문에 --settings=모듈 경로 라고 명시적으로 적어줘야 한다. 그러나 매번 런서버를 할 때 타자를 길게 쳐야하므로 여러모로 불편하다.

또 다른 한가지 방법은
스크린샷, 2017-07-11 19-46-35
디버그 용과 디플로이 용 모두 테스트해야 할 때는 쉘 두개를 키고 쉘 하나에 명령어 하나를 입력할 수도 있다. (단, 쉘이 꺼지면 다시 설정해줘야 한다.)

export DJANGO_SETTINGS_MODULE=config.settings.debug (쉘 1)
export DJNAGO_SETTINGS_MODULE=config.settings.deploy (쉘 2)

settings.py 를 나눠야 하는가?

settings 원본
스크린샷, 2017-07-05 01-19-16
보통 프로젝트를 시작하면 settings.py 하나만 던져준다. 하지만 실무에서는 로컬배포(서비스용, 릴리즈 버전)로 환경설정을 나눈다. 나의 경우에는 프로그래밍이 처음이다보니 내가 지금 속고 있는게 아닐까? 할 정도로 당황했다. 그런데 이것은 장고뿐만 아니라 상용화되는 모든 소프트웨어의 공통적인 분모라고 생각하면 이해하기 쉬웠다. 우리가 흔히 하는 게임도 개발용과 배포용으로 나뉜다.

  • 로컬용은 아무래도 오류를 검출하기 위한 환경세팅을 가져간다.

    • 사람마다 표현법이 다 다르다.

    • 로컬(local), 디벨롭(development), 데브(dev), 디버그(debug) 등..

  • 배포용은 로그 기록이나 오류를 숨겨 사용자 편의성을 도모하고 악의적인 해커로부터 보호하는 환경세팅을 가져간다.

    • 사람마다 표현법이 다 다르다.

    • 디플로이(deploy), 프러덕션(production 혹은 prod), distriution, 릴리즈(release), 배포 등..

    • 약간의 의미차이가 존재한다.

어떻게 나눠줘야 할까?

settings 모듈화
스크린샷, 2017-07-05 00-57-19
위와 같은 이유로 settings의 설정들을 개발용(debug)용과 배포용(deploy)으로 모듈화(분리)했다. 다만, 모든 환경에서 공통적으로 사용되는 설정들은 base.py에 두었다.

base.py에는 뭘 두지?

1. 각 종 경로
스크린샷, 2017-07-11 19-23-47
2. 언어, 타임존 등
스크린샷, 2017-07-11 19-23-37
base.py에는 공통적으로 사용되는 설정들이 저장된다. 각 종 디렉토리 경로, AUTH_USER_MODEL, INSTALLED_APPS 등이 base.py에 설정하게 된다.

debug.pydeploy.py의 차이점

Debug과 Deploy를 구분짓는 가장 핵심은 Debug = True 또는 False이다.

debug=True 화면
스크린샷, 2017-07-11 19-28-33
debug=True에서는 왜 오류가 났는지 알려주지 않는다.
단순히 페이지를 찾을 수 없다(Page Not Found)라고만 나온다.
어느 파일에서, 몇 번째 줄에서 오류가 났는지는 알려주지 않는다.

debug=False 화면
스크린샷, 2017-07-11 19-31-26
debug=False에서는 오류가 난 이유를 상세하게 알려준다.
화면에서 잘렸지만 어느 파일에서, 몇 번쨰줄에서 오류가 났는지 알수 있다.

이제 runserver를 하려면 우리는 두 가지 옵션이 생겼다.
배포용런서버를 할 것인지 개발용 런서버를 할 것인지 선택할 수 있게 되었다.

$ ./manage.py runserver --settings=config.settings.debug # 개발용 
$ ./manage.py runserver --settings=config.settings.deploy # 배포용 

그렇다면 이제 런서버를 하기 위해서는 위와 같이 --settings를 어느 것을 사용할 것인지 명시해야 한다.

위에서는 간단하게 Debug의 True / False 여부만을 다루었지만, Static 파일의 경로(로컬용은 컴퓨터에 저장하고, 배포용은 외부 서버에 저장하고 등), DB 종류(개발용은 sqlite3를 사용하고, 배포용은 postgreSQL를 사용한다는 등), WSGI 설정, allowed host 등 세팅들 다양하게 가져갈 수 있다.

참고한 글

settings.py에 대한 자세한 내용은 여기를 참조하도록 하자. 굉장히 쉽고 자세하게 설명되어있다.