본문 바로가기
인공지능/LLM 서비스

Fast API로 시작하는 웹 개발 - 기초

by hyunji00pj 2025. 1. 14.

1. FastAPI란?

FastAPI는 Python으로 작성된 웹 프레임워크로, RESTful API와 GraphQL 같은 현대적인 웹 API를 빠르고 효율적으로 개발할 수 있도록 설계되었습니다. 비동기 처리를 지원하여 대규모 트래픽을 처리하는 데 적합하며, 자동 문서화(OpenAPI/Swagger UI) 기능을 제공합니다.

특징

  • 자동 API 문서화: OpenAPI를 통해 Swagger UI를 자동으로 생성.
  • 타입 힌팅 지원: 코드 자동완성과 데이터 유효성 검사를 지원.
  • 비동기 프로그래밍: 실시간 및 고성능 애플리케이션 개발 가능.
  • Python 타입 힌트 활용: 코드 가독성 향상과 안정성 강화.
 

2. FastAPI vs Flask vs Django

FastAPI

  • 장점: 최신 Python 기반 프레임워크로 비동기 프로그래밍과 자동 API 문서화를 지원.
  • 단점: 비교적 새로운 프레임워크로 커뮤니티와 리소스가 제한적.
  • 활용도: 데이터 집약적인 실시간 API와 고성능 애플리케이션.

Flask

  • 장점: 경량 프레임워크로 배우기 쉽고 간단한 API 개발에 적합.
  • 단점: 기본 제공 기능이 적어 대규모 애플리케이션 개발 시 비효율적.
  • 활용도: 소규모 프로젝트, 프로토타입 개발.

Django

  • 장점: 인증, 관리자 패널, ORM 등 많은 기본 기능 제공.
  • 단점: 복잡한 설정과 구조, 소규모 프로젝트에는 과한 기능.
  • 활용도: 전자상거래, 콘텐츠 기반 웹사이트.

3. 비동기 프로그래밍이란?

비동기 프로그래밍은 작업이 병렬적으로 실행될 수 있도록 하여, I/O 작업이나 대기 시간 동안 다른 작업을 처리할 수 있는 프로그래밍 방식입니다.

동기 vs 비동기

  • 동기(Synchronous): 작업이 순차적으로 실행되며, 하나의 작업이 끝나야 다음 작업이 시작.
  • 비동기(Asynchronous): 작업이 독립적으로 실행되며, 대기 시간이 발생하면 다른 작업을 먼저 처리.
import asyncio

async def task1():
    print("Task 1 시작")
    await asyncio.sleep(2)
    print("Task 1 완료")

async def task2():
    print("Task 2 시작")
    await asyncio.sleep(1)
    print("Task 2 완료")

async def main():
    await asyncio.gather(task1(), task2())

asyncio.run(main())

#출력
#Task 1 시작
#Task 2 시작
#Task 2 완료
#Task 1 완료

4. FastAPI 설치 및 환경 설정

Python 가상환경 생성

python -m venv venv
cd venv/Scripts
Activate.bat
cd ..

FastAPI 설치

pip install fastapi

ASGI 서버(Uvicorn) 설치

FastAPI 애플리케이션을 실행하기 위해 ASGI 서버인 Uvicorn을 설치합니다.

pip install "uvicorn[standard]"
  • uvicorn[standard]는 기본 서버 기능 외에 Gzip 압축, CORS 지원 같은 추가 미들웨어를 포함.

FastAPI 기본 코드 예시

간단한 FastAPI 앱

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Hello, FastAPI!"}

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "query": q}

실행

uvicorn main:app --reload

 

  • main:app: main.py 파일에서 app 객체를 실행.
  • --reload: 코드 변경 시 자동으로 서버 재시작.

6. REST와 RESTful API

REST

  • "Representational State Transfer"의 약자로, HTTP 기반의 자원(Resource)을 관리하기 위한 아키텍처 스타일.
  • 자원을 고유하게 식별하고 상태를 전송.

RESTful API

  • REST 아키텍처를 따르는 API.
  • HTTP 메서드(GET, POST, PUT, DELETE 등)를 통해 자원 관리.
  • 클라이언트와 서버 간 통신은 주로 JSON 형식.

RESTful API 예시

from fastapi import FastAPI

app = FastAPI()

@app.get("/users/")
async def get_users():
    return [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]

@app.post("/users/")
async def create_user(user: dict):
    return {"id": 3, **user}

@app.put("/users/{user_id}")
async def update_user(user_id: int, user: dict):
    return {"id": user_id, **user}

@app.delete("/users/{user_id}")
async def delete_user(user_id: int):
    return {"message": f"User {user_id} deleted"}

 

7. JSON

JSON이란?

  • "JavaScript Object Notation"의 약자로, 데이터를 표현하고 교환하기 위한 경량 데이터 형식.
  • 장점:
    • 읽기 쉽고 가볍다.
    • 대부분의 프로그래밍 언어에서 지원.
    • 서버-클라이언트 간 데이터 교환에 최적화.

FastAPI에서 JSON 반환

FastAPI는 Python의 dict를 자동으로 JSON으로 변환.

JSON 예시

from fastapi import FastAPI

app = FastAPI()

@app.get("/json/")
async def return_json():
    return {"key": "value", "list": [1, 2, 3]}

 

8. 비동기 프로그래밍의 장점

  1. 응답성(Responsiveness):
    • 대기 시간 동안 다른 작업을 처리하여 응답 속도 개선.
  2. 확장성(Scalability):
    • 대규모 트래픽 처리에 유리.
  3. 자원 효율성(Resource Efficiency):
    • CPU, 메모리 등을 효율적으로 활용.
  4. 병렬성(Concurrency):
    • 여러 작업을 동시에 처리.