FrameWork/Django

settings.py 분리하여 관리하기

jheaon 2023. 11. 23. 18:57

 

 

Settings.py을 분리한다는 것이 무슨 말이죠?

장고를 사용하다보면 기능 구현을 위해 여러 라이브러리나 모듈, 미들웨어 등을 추가하면서 몸집을 키워나가게 되는데 이 과정에서 settings.py 파일의 크기가 커진 나머지 내가 어떤 것을 추가하였는지 대해 찾기도 어려울 뿐더러, 배포을 할때에는 사용자에게 보여주면 안되는 세부정보들을 제공하지 않기 위해 개발용 세팅과, 배포용 세팅을 따로 둘 필요성이 있습니다.

 

따라서 이런 이유로 장고 개발자들은 본래 프로젝트를 시작하면 만들어지는 settings.py을 settings 라는 폴더를 만들고 그 안에 common.py, prod.py 등으로 쪼개서 관리하시는 식으로 프로젝트를 관리하고 있습니다. 

 

한문장으로 설명하자면 : 그냥 프로젝트에 사용되는 설정 코드를 분리하여 쉽게 관리하기 위함입니다.

 

 

Settings.py을 분리 어떻게 하는데요?

project 아래에 settings 폴더를 만든뒤 settings.py 을 넣어 준 뒤, common.py 로 이름을 변경합니다. 

project
    ├── settings/
        ├── __init__.py
        ├── common.py
        ├── dev.py
        └── prod.py
    ├── __init__.py
    ├── asgi.py
    ├── urls.py
    ├── wsgi.py

 

점프 투 장고의 박응용 님이나, 인프런 강사이신 이진석 님의 코드를  보면 일반적으로 공통적인 코드는 common.py, 개발 관련 코드는 dev.py, 배포 관련 코드는 prod.py 에 넣어 관리하고 있음을 확인 할 수 있었습니다.

 

통상적으로는 common 파일에는 프로젝트 공통적으로 사용하는 부분을 작성하며, 개발자 관점에서 사용되는 django_debug_toolbar 등 개발 관련 라이브러리 설정 같은 경우에는 dev.py에, 그리고 배포 관련한 설정은 prod.py에 설정하여 구분해 놓는 편입니다. 

 

- 참고로 여기서 사용되는 각 파일명은 common, dev=developer, prod=production 을 의미합니다. 

 

아래는 dev.py로 개발에 필요한 툴을 따로 구분하여 정리한 모습 입니다. 

 

- dev.py

from common import *

INSTALLED_APPS += [
    "debug_toolbar",
    "rest_framework",
]

MIDDLEWARE = [
    "debug_toolbar.middleware.DebugToolbarMiddleware",
] + MIDDLEWARE


# Django_Debug_Toolbar Configure Internal IPs
INTERNAL_IPS = [
    "127.0.0.1",
]

 

 

 

여기서 중요한 것이 있는데, 원래 project/settings.py 에 있던 설정 파일을 project/settings/common.py로 폴더를 한번 더 만들어서 관리하기 때문에, BASE_DIR의 경로를 설정할 때 뒤에 .parent를 더 붙여 경로 지정을 바로 잡아주셔야 합니다. 

 

- common.py 

# 뒤에 .parent 을 붙여 BASE_DIR 의 위치를 바로 잡아 준다. 
# 만약 os.path.dirname()을 사용하고 있다면, 한번 더 감싸면 된다.

BASE_DIR = Path(__file__).resolve().parent.parent.parent

...

 

 

설정을 마치고 나서는 장고 프로젝트를 실행 할 때 사용하는 manage.py 파일이 해당 세팅을 바라보도록 설정 하여야 합니다. 따라서 os.environ.setdefault()의 두번째 인수에 해당 프로젝트 세팅 경로를 재 설정해주시면 됩니다. 

 

- manage.py

def main():
    # 아래 2번째 파라미터의 경로를 재 설정 해주면 된다. 
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings.dev')
    
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)

 

그 다음 python manage.py runserver을 실행시켜 해당 프로젝트가 잘 돌아가는지 확인하시면 됩니다.