우리 프로젝트의 경우 학생들이 작성한 독후감을 평가하고 피드백할 때 자연어 처리 모델이 사용되는데 모델의 크기가 꽤 커서 모델을 피드백을 하는 시간보다 모델을 로드할 때 시간이 더 많이 소요되었다. 만약 피드백 요청이 올 때마다 모델을 올리고 피드백을 수행한다면 낭비되는 시간이 너무 많아 지나치게 비효율적이라고 생각되어서 서버가 켜질 때 한번만 모델을 로드하고 피드백 요청이 들어오면 이미 로드된 모델에서 피드백을 수행하는 메소드만 호출하는 방법으로 문제를 해결하고자 하였다.
방법을 찾던 중 어플리케이션을 구성하는 apps.py을 사용하여 우리가 원하는 작업을 수행할 수 있다는 것을 알게되었다.
apps.py에는 각 어플리케이션을 구성하는 여러 정보들이 들어간다.
Attributes | Methods |
---|---|
.name | .get_models() |
.label | .get_model() |
.verbose_name | .ready() |
.path | |
.default | |
.default_auto_field | |
.module(read only) | |
.models_module(read only) |
장고 서버가 시작되면 django.setup()메소드가 실행되는데 이때 settings,py의 INSTALLED_APPS를 보고 각 앱의 apps.py를 실행하여 앱을 실행할 때 필요한 구성정보들과 모델정보를 불러와 서비스의 초기화를 진행한다.
이 점을 이용하여 apps.py의 Config클래스에 클래스변수로 모델을 불러오고, 피드백 작업이 필요한 곳에서 apps.py의 Config클래스를 import하여 모델에 정의된 메소드를 실행시키는 방식으로 문제를 해결하였다.
# /report/apps.py
from django.apps import AppConfig
from .services import Feedback # 자연어 처리 모델이 정의된 파일
class ReportConfig(AppConfig):
model = Feedback() # 자연어처리 모델을 불러와 클래스변수로 등록
...
# /report/serializers.py
from .apps import ReportConfig # Config클래스를 import
...
correct = ReportConfig.model.spellCheck(text.original) # 모델의 메소드를 호출
text.correct = correct["correct"]
feedback = ReportConfig.model.getFeedBack(text.correct) # 모델의 메소드를 호출
text.feedback = feedback["feedback"]
...