흠... FastAPI로 LLM 모델 하나만 연결할 땐 할만하다 싶었는데 본격적으로 들어가니까 또 어렵다. Pydantic을 이용하면 파이썬도 타입스크립트처럼 타입을 지정할 수 있다고 한다. 아직도 배울게 태산이구나...
학습시간 09:00~02:00(당일17H/누적1977H)


A. 기본 개념
B. 통신 방식의 역사
C. REST API
| 구분 | REST (Representational State Transfer) | GraphQL (Graph Query Language) |
|---|---|---|
| 발표 | 2000년 | 2011년 |
| 특징 | 각 자원에 대한 고유 URL(엔드포인트) 존재, 정해진 데이터 구조로만 응답 | 단일 URL(엔드포인트) 사용, 클라이언트가 필요한 데이터 구조를 직접 정의하여 요청 |
| 장점 | 직관적이고 이해하기 쉬움, 넓은 생태계와 높은 호환성 | Over-fetching, Under-fetching 문제 해결, 유연하고 효율적인 데이터 로딩 |
| 단점 | Over-fetching, Under-fetching 발생 가능, API 변경 시 버전 관리 필요 | 상대적으로 복잡한 쿼리, 캐싱 및 파일 업로드 구현이 복잡함 |
A. 요청과 응답
B. 메시지 구조

A. 개념 비교
| 구분 | 동기 (Synchronous) | 비동기 (Asynchronous) |
|---|---|---|
| 처리 방식 | 요청 순서대로 하나씩 처리 | 여러 요청을 동시에 처리 시작 |
| 대기 여부 | 응답이 올 때까지 대기 | 대기 없이 다음 작업 진행 |
| 장점 | 설계가 간단하고 직관적 | 시스템 전체의 처리 효율 향상 |
| 단점 | I/O 작업에서 대기 시간으로 인한 성능 저하 | 동기 방식에 비해 설계가 복잡 |
| 예시 | 카페에서 주문하고 음료가 나올 때까지 카운터 앞에서 기다리기 | 카페에서 주문 후 진동벨을 받고 자리에서 기다리기 |
A. 주요 업무
A. 핵심 특징
B. 주요 장점
# main.py
from fastapi import FastAPI
# FastAPI 인스턴스 생성
app = FastAPI()
# 루트 경로('/')에 대한 GET 요청 처리
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
A. 가상 환경
venv보다 약 9배 빠른 uv를 사용한 가상 환경 구성을 권장pip install uv로 설치uv venv 또는 uv init -p 3.11 명령어로 가상 환경 생성 및 파이썬 버전 지정 (3.10 이상 권장)B. FastAPI 설치
uv add "fastapi[standard]" 또는 uv add fastapi --extra standard 명령어로 FastAPI와 표준 의존성(uvicorn 등)을 함께 설치uv export -o requirements.txt로 의존성 목록을 파일로 저장 가능A. 서버 실행
uvicorn main:app --reload 명령어로 개발 서버 실행main: 파이썬 파일 이름 (main.py)app: 파일 내의 FastAPI 인스턴스 변수 이름-reload: 코드가 변경될 때마다 서버를 자동으로 재시작하는 개발용 옵션B. 자동 생성 문서
http://127.0.0.1:8000/docs: 대화형 API 테스트가 가능한 Swagger UI 문서http://127.0.0.1:8000/redoc: 가독성이 좋은 ReDoc 문서http://127.0.0.1:8000/openapi.json: OpenAPI 규격에 따른 스키마 정보A. 개념 정의
/users/{user_id})?로 시작하며, 필터링, 정렬 등 부가적인 옵션을 전달할 때 사용 (예: /items?skip=0&limit=10)from fastapi import FastAPI
app = FastAPI()
# 경로 매개변수: /items/{item_id}
@app.get("/items/{item_id}")
def read_item(item_id: int): # 타입 힌트로 자동 유효성 검사
return {"item_id": item_id}
# 쿼리 매개변수: /search?keyword=fastapi
# Optional[str] = None 또는 str | None = None 으로 선택적 파라미터 지정
@app.get("/search")
def search_items(keyword: str | None = None):
if keyword:
return {"message": f"'{keyword}' 검색 결과"}
return {"message": "검색어 없음"}
A. HTTP 메서드 활용
@app 데코레이터를 사용하여 각 HTTP 메서드(GET, POST, PUT, DELETE)에 해당하는 API 함수(경로 작동 함수)를 정의HTTPException을 발생시켜 특정 HTTP 상태 코드와 에러 메시지를 클라이언트에 전달 가능A. Pydantic 활용
BaseModel을 상속받아 데이터 모델 클래스를 정의하면, FastAPI가 자동으로 요청 본문(request body)의 유효성을 검사Field를 사용하여 필드별로 더 상세한 유효성 검사 규칙(최소/최대 길이, 기본값, 설명 등)을 설정할 수 있음from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
# Pydantic 모델 정의
class Movie(BaseModel):
id: int | None = Field(default=None, description="영화 ID")
title: str = Field(min_length=1, description="영화 제목")
director: str = Field(min_length=1, description="감독 이름")
rating: float | None = Field(default=None, ge=0, le=10, description="평점 (0~10)")
# Pydantic 모델을 타입 힌트로 사용
@app.post("/movies/")
def create_movie(movie: Movie):
# movie 객체는 이미 유효성 검사가 완료된 상태
return movie

A. 전체 흐름

A. 서빙 방식 비교
| 서빙 종류 | 처리 단위 | 응답 시간 | 주요 사용처 |
|---|---|---|---|
| 배치 (Batch) | 대용량 데이터 묶음 | 수 분 ~ 수 시간 | 일일 보고서, 월간 분석 |
| 스트림 (Stream) | 데이터 스트림 | 수 초 ~ 수 분 | 실시간 대시보드, 이상 탐지 |
| 실시간 (Real-time) | 단일 요청 | 수 밀리초 | 추천 시스템, 자율 주행 |
| 엣지 (Edge) | 단일 요청 (기기 내) | 매우 빠름 | IoT 기기, 모바일 AI 기능 |

A. 로컬 환경
http://fastapi-backend:8000)B. 클라우드 환경