개발자는 사용자에게 안정적으로 알맞은 컨텐츠를 서빙하기 위해 여러가지 방법을 쓴다. 서버의 트래픽이 증가하더라도 서버가 다운되지 않게 네트워크 장비에 로드밸런서를 두거나 대역폭을 늘리거나 HA를 하거나 DB샤딩을 하는 등 여러가지 방법으로 서비스의 안정성을 추구한다. 그 중 하나의 방법이 바로 정적 타입시스템이다.
언어의 기본 타입 또는 개발자가 정의한 타입을 기반으로 해당 타입을 언어와 연관시키는 메커니즘을 뜻한다.
타입 동등, 타입 호환, 타입 추론에 대한 규칙을 지킨다면 타입시스템이라고 볼 수 있다.
모든 언어는 이러한 타입시스템을 가지고 있으며 동적 타입과 정적 타입으로 나눠진다.
동적 타입 : 런타임에 모든 변수의 유형을 결정하고 잘못된 경우 예외가 발생한다. (int, string 같은 타입을 정의하지 않고, 런타임에 타입에 대한 에러가 발생한다)
정적 타입 : 컴파일 타임에 모든 변수의 유형을 결정하고 잘못된 경우 예외가 발생한다.(타입을 명시하고, 타입에 대한 에러를 컴파일 타임에 잡을 수 있다)
여기서 정적 타입을 정적 타입시스템이라고 할 수 있는데, 동적타입의 언어를 정적타입의 언어의 특징들을 부여해 시스템의 안정성을 높이자는게 요즘 추세이다.
예를 들어 자바스크립트의 경우 타입스크립트의 등장, 파이썬의 경우 3.5버전부터 등장한 타입어노테이션이 있다.
ex) typescript
정적 타입시스템은 프로그램의 가독성을 높이고 타입에 대한 에러를 미리 방지할 수 있다.
파이썬은 3.5부터 타입어노테이션과 typing을 기반으로 타입이 명시된 파이썬 코드를 작성할 수 있으며, mypy를 통해 정적 테스팅을 할 수 있다.
기존 파이썬에 명시된 int, float, str 등의 타입 + typing에 정의된 타입을 기반으로 쓴다.
상수를 나타내는 Final, 정수형을 나타내는 int, 몇가지 중 하나라는 의미로 Union도 쓰는 것을 볼 수 있다.
TIME_OUT: Final[int] = 10
def add(a: int, b: int) -> int: return a+b
def toString(num: Union[int, float]) -> str: return str(num)
파이썬 타입 정적 검사기 모듈 mypy모듈설치
pip install mypy
※ 이 때 만약 requests모듈을 쓴다면 types-requests도 설치해야한다.
mypy는 일부 모듈을 인식하지 않는 버그가 있기 때문에 옵션을 적용해서 실행해준다.
mypy main.py --namespace-packages
(여기서 main.py는 실행하고자하는 파일명)
mypy <파일명> <옵션>
으로 실행한다.
before
coin_dict_list = read_file("constant/COIN.txt") for co in coin_dict_list:
After
coin_dict_list = read_file("constant/COIN.txt") if not coin_dict_list:
print("파일에 관한 에러가 발생했습니다.")
return None
for co in coin_dict_list:
coin_dict_list에는 이터러블한 타입이 들어가지 않을 수 있다.
이러한 부분에 대한 에러를 분기점을 통해 미리 방지 되는 것을 볼 수 있다.