서버 개발을 진행하면서 특정한 상태 코드, 카테고리, 코드 값 등을 상수(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을 초기화할 수 있습니다.
'Django' 카테고리의 다른 글
Django 다중 서버 환경 동시성 제어하기(select_for_update/redis lock) (0) | 2025.02.23 |
---|---|
Django TextChoices로 상수 관리하기 (4) | 2025.01.05 |
FieldTracker와 Signals를 활용한 Django 모델 변경 로그 관리 (2) | 2024.12.29 |