Software Engineering/Django

[Django] 장고를 사용한 FBV API 서버 개발기 (시행착오)

iseop 2025. 5. 24. 22:25

어쩌다 보니 장고 프로젝트를 하나 만들게 되었습니다. 아주 편하고 빠르게 웹 개발을 하고, 또 유지보수도 매우 쉬웠는데요(FBV와 CBV를 제공하는데 FBV는 러닝 커브가 거의 없다고 봐도 됩니다), 제가 장고에 대해 잘 몰랐던 점 때문에 어려웠던 점 몇 가지를 두서없이 정리해 보았습니다. 사실 공식 문서를 잘 읽고 따라하면 되는데 시간에 쫓겨 만드는 현실...

 

https://docs.djangoproject.com/en/5.2/intro/

 

Getting started | Django documentation

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

 

0. 장고 클래스에는 기본 시퀀스 기본키가 있다.

그래서 "id"라는 필드가 내부적으로 존재하고, 기본키로 사용된다.

 

 

1. 클래스(테이블)의 필드(컬럼)가 다른 클래스를 참조하는 외래키인 경우:

저는 이 외래키 필드가 다른 클래스의 ID 값만을 참조할 것이라는 초보적인 생각을 했습니다. 그래서 외래키 필드 변수명 끝에 _id를 붙였습니다. 그러나 models.ForeignKey()로 만든 필드는 다른 클래스 자체를 참조하기 때문에 그럴 필요가 없고, 이에 더해 다른 클래스의 ID 값을 가져올 때는 ID변수 = 클래스_id 처럼만 하면 된다는 사실을 몰랐습니다.

 

그런데 저는 필드명 끝에 _id를 붙였기 때문에 ID변수 = 클래스_id_id 라고 적어보거나(안됩니다), 다른 클래스를 통째로 가져와서 ID변수 = 클래스.id 처럼 작성했다가, 결국 나중에 전부 다 고쳤습니다.

 

 

2. 시간 다루기

django.utils.dateparse.parse_datetime() 을 사용했습니다. ISO 8601 형식의 문자열을 넣으면 파이썬에서 편하게 사용 가능한 datetime 타입으로 바꿔줍니다.

 

 

3. 시리얼라이저가 특정 필드만 검사하도록 하기

짧게 직렬화기라고 부르겠습니다. 클라이언트에서 입력이 없거나 넘겨줄 필요가 없는 필드들은 직렬화기가 검사할 필요가 없습니다. 이 때는 아래처럼 직렬화기 클래스 내의 메타 클래스 안에 필요한 필드들만 명시해주면 됩니다.

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = [필요한 필드들을 리스트로 작성]

 

 

4. 직렬화기로 클라이언트에 보낼 정보 제한(수정)하기

직렬화기 클래스 내에서 to_representation() 메소드를 오버라이딩하면 됩니다.

class ...:
    def to_representation(self, instance):
        data = super().to_representation(instance)
        modified_field = data.get('필드명')
        if modified_field:
            data['modified_field'] = modified_field.replace('@', '골뱅이')
        return data

 

 

5. 정해진 시간마다 장고 모듈을 포함하는 파이썬 파일을 실행시키기

처음에는 django_cron 등 플러그인을 알아보았는데, 운영체제의 기능을 사용하는 것이 결국 저에게는 답이었습니다. crontab에 해당 파이썬 파일을 실행하도록 등록해두되, 해당 파일은 아래처럼 작성해야합니다. 그리고 contab에 등록할 때, python 프로세스의 실행 디렉터리 위치와 virtualenv 활성화도 필요합니다. 저는 파일에 포함시켰지만, 환경 변수도 중요합니다. 물론 sys.path 등을 이용하면 실행 위치도 파일 안에 포함시킬 수 있을 것 같습니다. (저는 bash 스크립트를 활용했습니다...)

# Setup Django
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
django.setup()

# Custom imports
from keyword_app.models import *