mypy오류 수정

원인
- 에러 메시지의 대부분을 차지하는 "Missing library stubs"는
- mypy가 장고 내부 코드를 읽을 수 없다는 뜻
- 해결하기 위해서 장고 코드를 mypy가 읽을 수 있는 형태로 번역해 주는 패키지를 설치
django-stubs
- poetry add -G dev django-stubs
- 개발 환경에서만 사용할 수 있도록 dev 그룹에 django-stubs 패키지를 추가
[tool.poetry.group.dev.dependencies]
black = "^26.3.1"
ruff = "^0.15.8"
mypy = "^1.20.0"
——————————————————————————————————————[비교]—————————————————————————————————————————
[tool.poetry.group.dev.dependencies]
black = "^26.3.1"
ruff = "^0.15.8"
mypy = "^1.20.0"
django-stubs = "^6.0.2"
이론
- 파이썬은 코드가 실행될 때 변수의 형태가 정해지는 동적 타입 언어임
- 하지만 앱의 덩치가 커질수록 실행 전에 오류를 미리 잡기 위해
- mypy 같은 정적 타입 검사 도구를 사용하게 됨
- 장고처럼 복잡하고 거대한 프레임워크는 이런 검사 도구가 분석하기 매우 어려움
- 그래서 "이 기능은 이런 결과물을 만들어낸다"라고 껍데기만 설명해 둔 파일이 필요한데
- 이를 스텁(Stub) 파일이라고 부름
- django-stubs 패키지가 바로 장고를 위한 스텁 파일들의 모음집임
mypy 설정 파일 작성하기
- mypy에게 방금 설치한 장고 전용 도구를 사용하라고 명시적으로 알려주어야 함
- 프로젝트 최상단 폴더에 있는 pyproject.toml 파일의 맨 아래에 내용을 추가
# mypy 도구에 대한 전반적인 설정을 시작하는 섹션입니다.
[tool.mypy]
# mypy가 사용할 외부 플러그인 목록에 장고 플러그인을 지정하여 활성화합니다.
plugins = ["mypy_django_plugin.main"]
# mypy 장고 플러그인을 위한 세부 설정을 시작하는 섹션입니다.
[tool.django-stubs]
# 장고 프로젝트의 전반적인 환경 설정 파일이 어디에 있는지 경로를 알려줍니다.
django_settings_module = "config.settings"
이론(플러그인 아키텍처)
- 소프트웨어에서 플러그인이란 본래 프로그램의 핵심 코드를 수정하지 않고도
- 새로운 기능을 손쉽게 추가할 수 있도록 도와주는 확장 도구를 의미함
- mypy 역시 이런 유연한 구조로 설계되어 있음
- 장고 전용 플러그인을 연결해주기만 하면, 장고 특유의 복잡한 데이터베이스 모델이나
- 설정 파일들을 mypy가 완벽하게 이해하고 검사할 수 있게 됨
settings.py의 타입 직접 지정하기
config/settings.py:28: error: Need type annotation for "ALLOWED_HOSTS" (hint: "ALLOWED_HOSTS: list[<type>] = ...") [var-annotated]
config/settings.py:42: error: Need type annotation for "THIRD_PARTY_APPS" (hint: "THIRD_PARTY_APPS: list[<type>] = ...") [var-annotated]
- "Need type annotation for ALLOWED_HOSTS"
- 패키지를 설치해도 자동으로 해결되지 않는 부분으로
- 장고의 환경설정 파일에 있는 특정 변수들이 어떤 형태의 데이터를 가질지 직접 지정해줘야 함
ALLOWED_HOSTS = []
...
THIRD_PARTY_APPS = []
——————————————————————————————————————[비교]—————————————————————————————————————————
ALLOWED_HOSTS: list[str] = []
THIRD_PARTY_APPS: list[str] = []
이론(타입 어노테이션)
- 변수 이름 뒤에 콜론 기호를 붙여서 이 변수가 어떤 형태의 데이터를 담을지 명시적으로 적어주는 문법
- 이를 통해 개발자는 코드를 읽을 때 변수의 역할을 명확히 파악할 수 있고
- 컴퓨터는 코드를 실행하기 전에 데이터의 종류가 잘못 섞이는 에러를 미리 잡아낼 수 있어
재확인

——————————————————————————————————————[비교]—————————————————————————————————————————
——————————————————————————————————————[비교]—————————————————————————————————————————