Written by @Leo Lee
지난 포스트에 이어 이번 글에서 FastAPI를 활용하기 위해 알아야 할 여러 지식들과 가지고 있는 기능들에 대해 알아보겠습니다.
라우팅은 클라이언트의 요청을 서버의 적절한 엔드포인트(함수)로 전달하는 과정입니다. FastAPI에서는 데코레이터를 사용하여 함수를 특정 경로와 HTTP 메서드에 연결합니다. 예를 들어, @app.get("/items/{item_id}")는 GET 요청을 특정 경로로 라우팅합니다.
HTTP 메서드는 클라이언트가 서버에 요청할 때 사용하는 방법을 나타냅니다. 주요 메서드로는 다음과 같은 것들이 있습니다:
GET: 서버로부터 정보를 조회
POST: 서버에 데이터를 전송하여 새로운 리소스를 생성하거나 데이터를 처리
PUT: 기존의 리소스를 대체
DELETE: 지정된 리소스를 삭제
PATCH: 리소스의 일부를 수정
FastAPI는 이 외에도 OPTIONS, HEAD 등의 메서드를 지원합니다.
엔드포인트는 클라이언트의 요청을 처리하고 응답을 반환하는 API의 지점입니다. HTTP 메서드와 URL 경로를 뜻하며 FastAPI에서는 데코레이터로 지정하여 엔드포인트를 구현합니다.
FastAPI는 다양한 방법으로 파라미터를 처리할 수 있으며, 각 방법은 특정한 사용 사례에 적합합니다.
경로 매개변수는 URL 경로의 일부로, 동적으로 변화하는 값을 받기 위해 사용됩니다. 예를 들어, /users/{user_id}와 같은 경로에서 user_id는 경로 매개변수로 함수의 인자로 전달됩니다.
쿼리 매개변수는 URL의 ? 뒤에 오는 키-값 쌍으로 전달되는 선택적 데이터입니다. FastAPI는 이러한 매개변수를 함수의 인자로 연결하며, 동일한 이름의 매개변수를 리스트로 받을 수도 있습니다.
요청 본문은 클라이언트가 서버로 보내는 데이터의 부분으로, 주로 POST, PUT, PATCH 메서드에서 사용됩니다. FastAPI는 Pydantic 모델을 사용하여 요청 본문을 검증하고 처리합니다.
폼 데이터는 주로 HTML 폼에서 전송되는 데이터 형식으로, 파일 업로드와 함께 사용될 수 있습니다. Form 클래스를 사용하여 폼 데이터를 처리합니다.
헤더 매개변수는 HTTP 요청의 헤더에 포함된 데이터를 처리합니다. Header 클래스를 사용하여 이를 함수의 매개변수로 받을 수 있으며, 인증 토큰, 콘텐츠 타입 등의 정보를 처리하는 데 유용합니다.
쿠키 매개변수는 HTTP 요청과 함께 전송된 쿠키를 처리합니다. Cookie 클래스를 사용하여 쿠키를 함수의 매개변수로 받을 수 있으며, 사용자 세션 관리, 개인화 및 추적에 활용할 수 있습니다.
Pydantic은 FastAPI와 함께 사용되는 데이터 유효성 검사 및 직렬화 라이브러리로, 개발자가 안전하고 효율적으로 데이터를 처리할 수 있도록 도와줍니다. 다음은 Pydantic의 주요 기능과 장점입니다.
데이터 유효성 검사 및 직렬화: Pydantic은 데이터의 유효성을 검사하고 직렬화하는 기능을 제공합니다. 이를 통해 오류를 방지하고 데이터의 일관성을 유지할 수 있습니다.
자동 문서 생성: Pydantic은 자동으로 문서를 생성하여 팀원 간의 협업을 용이하게 합니다.
개발 효율성: Python의 타입 힌팅을 활용하여 데이터 구조를 정의하고 유효성을 검사하므로 코드의 효율성과 유연성을 높입니다.
BaseModel 클래스: Pydantic의 모든 모델은 BaseModel 클래스를 상속받아 정의됩니다. 이를 통해 데이터의 구조, 타입, 기본값 등을 설정할 수 있으며, 자동으로 데이터 유효성 검사가 수행됩니다.
타입 힌트와 기본값: 필드를 정의할 때 타입 힌트를 사용하여 데이터의 타입을 지정하고, 기본값을 설정할 수 있습니다. 기본값이 있는 필드는 선택적 필드로 간주됩니다.
JSON 직렬화 및 역직렬화: json() 메서드를 사용하여 모델을 JSON 문자열로 직렬화하고, parse_raw() 메서드를 통해 JSON 문자열을 모델 인스턴스로 역직렬화할 수 있습니다.
사용자 정의 유효성 검사기: @validator 데코레이터를 사용하여 필드에 대한 사용자 정의 유효성 검사를 추가할 수 있습니다.
복잡한 타입과 중첩된 모델: Pydantic은 복잡한 데이터 타입과 중첩된 모델을 지원하여 다양한 데이터 구조를 처리할 수 있습니다.
ORM 모드: ORM 객체를 Pydantic 모델로 쉽게 변환할 수 있는 ORM 모드를 지원합니다.
FastAPI는 비동기 프로그래밍을 지원하여 높은 성능과 리소스 효율성을 제공합니다. 비동기 프로그래밍을 통해 동시에 여러 작업을 처리할 수 있습니다.
asyncio: Python의 비동기 I/O 이벤트 루프 라이브러리로, 시간을 많이 소요하는 작업들을 효율적으로 처리합니다.
Async/Await 키워드: async 키워드를 사용하여 비동기 함수를 정의하고, await 키워드를 통해 비동기 작업을 호출할 수 있습니다. 이는 블로킹 연산을 대기하는 동안 다른 코루틴이 실행될 수 있게 하여 효율성을 증가시킵니다.
성능 향상: 동시에 여러 I/O 바운드 작업을 처리할 수 있어 성능이 향상됩니다.
리소스 효율성: 쓰레드 기반의 동시성 모델에 비해 적은 메모리를 사용합니다.
블로킹 코드의 사용: 비동기 함수 내에서 블로킹 코드를 사용하면 전체 애플리케이션의 성능이 저하될 수 있습니다.
에러 핸들링: 비동기 프로그래밍에서는 에러 핸들링이 다소 복잡해질 수 있으며, 적절한 예외 처리가 필요합니다.
ASGI: 비동기 서버 게이트웨이 인터페이스
ASGI는 비동기 요청 처리를 지원하여 높은 동시성과 성능을 제공합니다. 이는 WSGI의 한계를 극복하기 위해 개발되었으며, FastAPI와 같은 비동기 웹 프레임워크에서 사용됩니다.
비동기 지원: 여러 요청을 동시에 처리할 수 있습니다.
웹소켓 지원: 실시간 양방향 통신을 가능하게 합니다.
확장성: 다양한 이벤트 기반 아키텍처와 함께 사용될 수 있어 확장성이 뛰어납니다.
호환성: 다양한 ASGI 호환 웹 프레임워크와 서버가 있어 선택의 폭이 넓습니다.
미들웨어는 클라이언트로부터의 요청이 처리되기 전과 후에 실행되는 함수입니다. FastAPI에서는 미들웨어를 통해 요청을 로깅하거나, 요청/응답을 수정하거나, 보안 체크를 수행할 수 있습니다.
미들웨어 추가: app.middleware("http") 데코레이터를 사용하여 미들웨어를 추가할 수 있습니다.
라우팅은 URL 경로와 해당 경로에 매핑되는 처리 함수를 정의하는 과정입니다. FastAPI에서는 다양한 HTTP 메서드에 대한 경로 연산을 쉽게 설정할 수 있습니다.
라우터 분리와 재사용성: 큰 애플리케이션에서는 라우터를 기능별로 분리하여 코드의 재사용성을 높일 수 있습니다. APIRouter 클래스를 사용하여 라우터를 별도의 모듈로 분리할 수 있습니다.
이번 포스팅에서도 지난 포스팅에 이어 FastAPI의 기능과 알아야할 개념들에 대해 살펴보았습니다. 다음 포스팅에서는 이러한 이론을 바탕으로 FastAPI의 간단한 예제를 통해 실전에서 어떻게 활용할 수 있는지 알아보겠습니다.
Tags: FastAPI, API, RESTful API, ASGI, 라우터, 라우팅, 미들웨어, 비동기 프로그래밍, 로이드케이, DO, DO솔루션