정말 기초적인 FastAPI 튜토리얼 #3 - 입력 데이터 검증

파이썬의 타입 힌트 기능과 이를 활용하여 FastAPI에서 입력 값을 검증하는 방법을 알아봅니다.

정말 기초적인 FastAPI 튜토리얼 #3 - 입력 데이터 검증
Image by Gerd Altmann from Pixabay
💡
2023 한국 파이콘에서 진행했던 FastAPI 튜토리얼에 내용을 추가하여 글 형식으로 정리해보았습니다.
이 튜토리얼은 파이썬을 조금 다뤄보신 분들이 FastAPI를 기초부터 배울 수 있게 구성했습니다.

3편에서는 다음 내용을 다룹니다.

  • 파이썬의 타입 힌트
  • 입력 데이터 검증하기

파이썬의 타입 힌팅

variable: type

파이썬은 동적 타입 언어이지만 3.5 버전부터 타입 힌트 기능을 제공합니다. (강타입 언어처럼 타입을 강제하지는 않습니다.)

타입 힌트에 익숙치 않은 분들을 위해 아주 간단하게 예시 코드를 보여드리겠습니다.

name: str = 'pycon' # 변수에 타입 힌트 추가 (타입 강제가 아님에 유의!)


def hello(name: str = 'default name') -> dict: # 함수의 인자와 리턴값에 타입 힌트 추가
    return {'result': f'Hello {name}'}

타입 힌트 덕에 소스코드를 처음 읽고 개발하는 개발자는 실수를 줄일 수 있고, 개발 도구(IDE)들은 코드 힌트를 더 풍부하게 제공할 수 있습니다.

입력 데이터 검증하기

feat. 타입 힌팅

FastAPI 역시 파이썬의 타입 힌트 기능을 유용하게 활용합니다. 앞서 만든 add API의 선언부에 다음과 같이 타입 힌트를 추가해봅시다.

# 이전 코드
# def add(x, y):
#     return {"result": int(x) + int(y)}

@app.get("/add")
def add(x: int, y: int):
    return {"result": x + y}

이전 코드에서는 변수 xy를 int형으로 변환해주었는데, 타입 힌트를 추가함으로써 형변환이 필요 없어졌습니다. 실제로 그런지 확인해볼까요? http://127.0.0.1:8000/add?x=1&y=2 링크를 열어 결과가 다음과 같은지 확인합시다.

{
  "result": 3
}

FastAPI의 타입 힌트 활용은 자동 형변환에서 끝나지 않습니다. int형이 아닌 값을 변수에 입력하면 어떻게 되는지 확인해볼까요? http://127.0.0.1:8000/add?x=string&y=2 링크를 열어 결과가 다음과 같은지 확인합시다.

{
  "detail": [
    {
      "type": "int_parsing",
      "loc": [
        "query",
        "x"
      ],
      "msg": "Input should be a valid integer, unable to parse string as an integer",
      "input": "string",
      "url": "https://errors.pydantic.dev/2.1/v/int_parsing"
    }
  ]
}

type 부분에서는 오류가 발생한 이유가 int형 파싱(int_parsing)이라고 알려주고, loc 부분에서는 쿼리 파라미터(query) 중 x라는 값이 잘못됐다고 알려줍니다. input 부분에서는 실제로 입력된 값이 string이라고 알려주고요.

이렇게 FastAPI는 타입 힌트로 입력 데이터를 검증해줍니다.

실습 과제 #1

이제 multiply API에도 타입 힌트를 추가해봅시다.

@app.get("/multiply/{x}/{y}")
def multiply(x: int, y: int):
    return {"result": x * y}
{
  "result": 2
}

실습 과제 #2

user API에도 타입 힌트를 추가해봅시다.

@app.get("/user/{user_name}")
def user(user_name: str):
    return {"message": f"My name is {user_name}"}

  • 정답 확인 - 브라우저에서 http://127.0.0.1:8000/user/1234 링크를 열어, 결과가 다음과 같다면 성공!
{
  "message": "My name is 1234"
}

(여기서는 1234가 str형이 아님에도 오류가 발생하지 않은 이유를 생각해봅시다.)

요약

  • 파이썬의 타입 힌트 기능을 알아보았습니다.
  • 타입 힌트를 활용하여 입력 데이터를 검증하는 방법을 알아보았습니다.

다음 편에서는...

정말 기초적인 FastAPI 튜토리얼 #4 - 기본값과 선택적 쿼리에서는 다음 내용을 다룹니다.

  • 쿼리 변수에 기본값 할당하기
  • 선택적으로 쿼리 변수 입력받기

COMMENTS

}