본문 바로가기

python & django & scipy

[django] Model 관리 프로젝트 구축하기

 

 

문제

회사에서 같은 DB의 모델을 사용하는 django 프로젝트가 3개 정도있다.

적용 전인 반년에서 1년 전까지만 해도 협업 프로세스라는게 존재하지 않았기 때문에 휴리스틱으로 모든 프로젝트를 진행했기 때문에

당연히 특정 django 프로젝트의 니즈에 의해 모델 구조가 변경됐을 때 변경사항이 다른 django 프로젝트에 잘 전달이 되지 않고 있었다.

덕분에 배포 후에 migration 에러가 뜬다던가, 현재는 데이터 분석에도 영향이 있다.

 

1년 전에는 니즈가 딱히 없었다. 프로덕트 규모 자체가 적었고, 팀도 당시에는 백엔드 개발자가 나 혼자였다(+ CTO님).

필요성은 항상 있었지만, 우선순위가 높은 기술 부채가 아니었다. 그 때에도 어떻게 구현할 지 큰 그림은 있었다.

CTO님이 다른 프로젝트도 같이 관리하고 있었기 때문에 동기화에 큰 문제는 없었지만 나 이외에 다른 백엔드 개발자 분이 입사하게 되면서 해당 니즈의 우선순위가 많이 높아져 드디어 8월에 Model 관리 프로젝트 구축을 시작했다.

 

모델을 관리하기 위한 django 프로젝트를 PyPI에 업로드 해 다른 프로젝트에서는 pip install & import 로 모델을 사용하면 모델에 변경 사항이 생길 때마다 자동으로 동기화 된다.

마이그레이션도 해당 프로젝트에서 하면 다른 프로젝트에서 사용하는 데에 무리가 없다.

 

 

요구사항 분석

  • model 파일이 관리될 것
  • django setup시 migration 검사를 할 수 있도록 할 것
  • 최소한의 글자로 import 할 수 있게 하는 것 (optional)

 

 

해결 과정

**_models라는 프로젝트를 만들어보자.

 

 

1차 시도 (실패)

 

django의 all_auth 패키지를 참고했다.

그냥 사용하는 app 별로 다 만들었다.

settings 모듈은 pip package에 포함하지 않도록 했다.

  • model 파일이 관리될 것 → 만족
  • 최소한의 글자로 import 할 수 있게 하는 것 (opt) → from **_model.food.models import {Model} (나름 만족)
  • django setup시 migration 검사를 할 수 있도록 할 것 → 만족

문제

AppConfig의 이름이 겹친다. 다른 패키지에서도 동일한 django-app 을 사용하고 있기 때문에 겹친다. 바보같은 실수였다.

 

 

해결

모델 패키지에서는 {app name}_model 로 사용하기로 했다.

 

 

2차 시도 (실패)

food.py에서 food_model의 models.py를 import해서 사용하기로 했다.

  • model 파일이 관리될 것 → 만족
  • 최소한의 글자로 import 할 수 있게 하는 것 (opt) → from **_model.models.food import {Model} (나름 만족)
  • django setup시 migration 검사를 할 수 있도록 할 것 → 만족

 

 

문제

models/food.py가 **_apps를 참조하기 때문에 다른 패키지에서 사용할 때도 **_apps가 필요해진다.

모델이 정의된 파일만 import 해서 사용하기에는 **_model 패키지에서 마이그레이션 체크 용도로 사용할 **_apps 패키지도 같이 필요한 것이 좋은 의존 관계는 아니다.

 

 

3차 시도(실패)

2차 시도에서의 문제를 해결하기 위해 모델 정의를 models/{app}.py에 하고 **_apps의 각 app models.py에서 import하는 방식으로 바꾸었다.

**_model/**_apps/food_model/models.py

근데 정작 FoodProduct.objects.all()을 했을 때 table 이 매치가 되지 않음

FoodProduct의 table 이름이 models_foodproduct로 되어있다.

⇒ Meta class를 이용해서 db_table 이름을 박아버린다.

⇒ 잘됨

 

 

문제

app_config의 name이 **_model에서와 다른 django 프로젝트에서의 차이가 생김

**_model에서의 appconfig는 아래처럼 돼야 동작

 

 

 

4차 시도(성공)

manage.py의 depth를 한 단계 겉으로 빼고, settings의 경로도 수정해주니 정상 동작한다.

 

 

결론

현재는 잘 동작해서 migration과 변경사항 관리를 해당 프로젝트에서 진행 하고있다.

모델의 변화를 다른 백엔드 개발자가 모르는 문제도 github pr approve 최소 인원을 설정해서 약간의 프로세스를 추가하기도 했다.

또다른 문제는 개발을 진행할 때 변경사항을 개발 환경 db에 어떻게 적용하느냐인데, 일단은 PyPI에 업로드해서 해당 개발 환경에서만 install 하여 사용하는 것으로 임시방편을 마련했다. 

관련해서 더 매끄러운 해결방법이 없는지 lab day에 생각해봐야겠다.