본문 바로가기
Django

Django에서 JSON 파일로 동적 상수 클래스를 생성하기

by dhleeone 2025. 2. 1.

서버 개발을 진행하면서 특정한 상태 코드, 카테고리, 코드 값 등을 상수(Enum) 형태로 정의하는 경우가 많습니다. 예를 들어, 동물의 번호를 관리하는 Enum을 아래와 같이 정의할 수 있습니다.

from enum import IntEnum


class AnimalNumberEnum(IntEnum):
    ALLIGATOR = 1
    BEAR = 2
    CAT = 3
    DOG = 4
    ELEPHANT = 5
    ...

 

하지만 새로운 상수를 추가하거나 기존 값을 변경할 때마다 하드코딩을 수정해야 하고, 변경된 내용을 배포해야 하는 불편함이 있습니다. 이러한 방식은 유지보수 비용을 증가시키고, 관리의 어려움을 줄 수 있습니다.

 

이러한 문제를 해결하기 위해 JSON 파일을 활용하여 별도로 상수에 활용할 값들을 관리하고 상수 클래스를 동적으로 생성할 수 있습니다.

 

JSON 파일을 활용하는 장점

변경 용이

상수 값이 JSON 파일에 정의되어 있기 때문에 파일 내용만 수정하면 즉각 반영할 수 있습니다.

중앙 관리

여러 모델이나 앱에서 사용할 상수 값을 한 곳에서 관리할 수 있어 일관성을 유지할 수 있습니다.

배포 효율성

코드 변경 없이 파일만 업데이트하는 방식을 통해 빠르게 반영할 수 있습니다.

 

JSON  파일 작성

enum_files/AnimalNumber.json

[
  {
    "name": "ALLIGATOR",
    "number": 1
  },
  {
    "name": "BEAR",
    "number": 2
  },
  {
    "name": "CAT",
    "number": 3
  },
  {
    "name": "DOG",
    "number": 4
  },
  {
    "name": "ELEPHANT",
    "number": 5
  },
]

 

우선, 사용할 상수 값을 JSON 파일로 작성하여 특정 경로에 저장합니다.

예를 들어, enum_files/AnimalNumber.json 파일을 생성합니다.

 

상수 클래스 동적 생성

# base/dynamic_enums.py

import json
from pathlib import Path
from enum import IntEnum


# 상수 클래스 초기화를 위한 전역 변수(초기 상태: None)
AnimalNumberEnum = None

def initialize_enums():
    # 상수(enum) 초기화
    _initialize_model_enum("AnimalNumber")

def _initialize_enum(name):
    # 생성할 상수 클래스의 이름 예: AnimalNumberEnum
    enum_name = f"{name}Enum"
    enum_class = globals().get(enum_name)
    
    # 아직 해당 enum이 초기화되지 않은 경우에만 진행
    if enum_class is None:
        # JSON 파일의 경로 설정: 예) enum_files/AnimalNumber.json
        path = Path(f"enum_files/{name}.json")
        if path.exists():
            # JSON 파일을 읽어서 데이터를 로드
            with open(path, "r", encoding="utf-8") as f:
                members = json.load(f)

            # JSON의 각 항목에 있는 "name"을 키, "number"를 값으로 추출
            enum_members = {member["name"]: member["number"] for member in members}
            
            # IntEnum 클래스를 사용해 enum 생성
            globals()[enum_name] = IntEnum(enum_name, enum_members)

 

JSON 파일을 읽어와 동적으로 Enum 클래스를 생성하는 로직을 구현합니다.

initialize_enums

Django 서버가 실행될 때 필요한 모든 Enum을 초기화하는 함수입니다.

_initialize_enum

JSON 파일을 기반으로 Enum 클래스를 동적으로 생성합니다.

기존에 globals()에 등록된 Enum이 있으면 중복 생성하지 않습니다.

 

Django 연동하기

from django.apps import AppConfig


class BaseConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "apps.base"

    def ready(self):
        from apps.base.dynamic_enums import initialize_enums

        # enums 초기화
        initialize_enums()

 

Django에서 서버가 시작될 때 initialize_enums() 함수를 실행하도록 설정해야 합니다.

이를 위해 apps.py에서 ready() 메서드를 오버라이드합니다.

 

AppConfig.ready()는 Django 서버가 시작될 때 실행되는 함수이므로, 여기에서 initialize_enums()를 호출하면 서버가 시작될 때 자동으로 Enum을 초기화할 수 있습니다.