매일공부

[Python] mypy는 왜 쓰는가 — 동적 타이핑 언어에 왜 타입을 입히나 본문

IT/작업기록

[Python] mypy는 왜 쓰는가 — 동적 타이핑 언어에 왜 타입을 입히나

julian 2026. 4. 22. 09:58

배경

프로젝트 View 함수들에 타입 힌트를 입히고 mypy로 검사하는 작업을 하다가, "파이썬은 어차피 동적 타이핑 언어인데 왜 굳이 타입을 명시하지?"라는 의문이 들어서 짚어봤다.

mypy 실행해보기

pip install mypy django-stubs
mypy apps/common/views.py apps/orders/views.py

에러 없이 통과되면 OK. django-stubs는 Django에 대한 PEP-484 타입 스텁을 제공하는 패키지로, mypy가 Django의 모델/쿼리셋 등을 제대로 이해하고 검사할 수 있게 해준다.

mypy 자체는 정적 검사에서 타입힌트를 활용하는 도구고, Python 3.5부터 타입 힌트 문법(typing 모듈)이 도입되면서 가능해졌다.

근데 파이썬은 타입 없이도 되지 않나?

맞다 — 파이썬은 동적 타이핑(Dynamic Typing) 언어라 타입을 안 써도 실행에는 아무 문제가 없다. 그런데도 타입 힌트를 쓰는 핵심 이유는 "실행 시점(Runtime)이 아닌, 코드 작성 시점(Development-time)의 안정성" 때문이다.

1. 정적 언어(C/Java)와는 성격이 다르다

파이썬의 타입 힌트가 C나 Java의 타입 선언과 똑같은 게 아니다.

구분 C / Java (정적 타이핑) Python + Type Hint (점진적 타이핑)

강제성 타입을 틀리면 컴파일 자체가 안 됨 타입을 틀려도 프로그램은 정상 실행됨
목적 메모리 할당 및 성능 최적화 코드 가독성 및 에러 방지
검사 시점 컴파일 단계 mypy 같은 별도 도구를 통한 정적 분석 단계

파이썬의 타입 힌트는 인터프리터에게 강제하는 명령어가 아니라, 개발자와 도구(IDE, mypy)를 위한 가이드라인이다.

2. 왜 굳이 타입 힌트를 쓰는가

① "코드 자체가 문서다" (Self-documenting)

협업하거나 3개월 뒤의 내가 내 코드를 볼 때, 함수 인자값이 뭔지 파악하려고 함수 내부 로직을 다 뜯어볼 필요가 없어진다.

  • AS-IS: def get_user_info(user_id): — user_id가 문자열인가? 숫자형인가?
  • TO-BE: def get_user_info(user_id: int) -> UserDict: — 정수형이고, 딕셔너리 형태를 반환하겠구나

② 버그의 조기 발견 (Shift-Left)

동적 타이핑 언어의 가장 큰 단점은 "실행해보기 전까지는 에러를 모른다"는 것. 타입 힌트가 있으면 mypy 같은 정적 검사기가 실행도 하기 전에 "여기서 None이 반환될 수 있는데 체크 안 했다"고 경고를 준다. 배포 후 서버가 터지는 걸 미리 막을 수 있다.

③ IDE의 강력한 어시스트

PyCharm이나 VS Code 같은 도구는 타입 정보를 바탕으로 자동완성을 지원한다. 타입이 지정되어 있으면 user.를 입력했을 때 사용 가능한 메서드 리스트가 정확히 뜬다. 오타로 인한 런타임 에러(AttributeError)를 원천 차단하는 효과도 있다.

3. 요약

파이썬의 타입 힌트 도입은 파이썬을 "Java처럼 딱딱하게 만드는 것"이 아니라, "동적 언어의 유연함은 유지하되, 대규모 프로젝트에서의 관리 효율성을 정적 언어 수준으로 끌어올리는 것"이다. 이를 점진적 타이핑(Gradual Typing)이라고 부른다. 필요한 곳에만 타입을 입히고 나머지는 자유롭게 두는 방식이다.

View 함수들에 타입을 입힌 건, 프로젝트가 "혼자 만드는 연습용"을 넘어 "누가 봐도 명확한 협업용 프로젝트"로 진화했다는 의미이기도 하다.

Comments