Fastapi

Chapter 3-1 미팅 생성 API 스펙 만들기

Chansman 2025. 5. 27. 10:00

✅ 미팅 생성 API 스펙 만들기

1. 🎯 목표: "미팅 생성" API 스펙 정의 및 더미 응답 제공

  • 프론트엔드가 빠르게 연동할 수 있도록 먼저 API 스펙 + 더미 데이터 반환부터 구성합니다.
  • 실무에서는 실제 로직 구현보다 먼저 스펙 정의가 중요합니다.

2. 🧱 기본 FastAPI 앱 구조 세팅

📁 디렉터리 구성

app/
  __init__.py
  apis/v1/meeting_router.py
  dtos/create_meeting_response.py
  dtos/frozen_config.py
asgi.py

📌 app/init.py

from fastapi import FastAPI
from fastapi.responses import ORJSONResponse
from app.apis.v1.meeting_router import edgedb_router, mysql_router

app = FastAPI(default_response_class=ORJSONResponse)
app.include_router(edgedb_router)
app.include_router(mysql_router)

▶️ asgi.py

from app import app

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

🧪 main.py는 삭제하여 불필요한 파일 정리.


3. ⚡ 왜 ORJSON? 

🧪 성능 비교 테스트 코드

import timeit, json, orjson
TWITTER_JSON = """긴 JSON 문자열"""

print(timeit.timeit(lambda: json.dumps(TWITTER_JSON)))
print(timeit.timeit(lambda: orjson.dumps(TWITTER_JSON)))

✅ 실제 결과: 기본 json 18.64s vs orjson 3.29s (Mac 기준)


4. 🧩 DTO 정의 (응답 모델)

📄 app/dtos/frozen_config.py

from pydantic import ConfigDict
FROZEN_CONFIG = ConfigDict(frozen=True)

📄 app/dtos/create_meeting_response.py

from typing import Annotated
from pydantic import BaseModel, Field
from app.dtos.frozen_config import FROZEN_CONFIG

class CreateMeetingResponse(BaseModel):
    model_config = FROZEN_CONFIG
    url_code: Annotated[str, Field(description="회의 URL 코드. unique 합니다.")]

5. 🛠️ Router 정의

📄 app/apis/v1/meeting_router.py

from fastapi import APIRouter
from app.dtos.create_meeting_response import CreateMeetingResponse

edgedb_router = APIRouter(prefix="/v1/edgedb/meetings", tags=["Meeting"], redirect_slashes=False)
mysql_router = APIRouter(prefix="/v1/mysql/meetings", tags=["Meeting"], redirect_slashes=False)

@edgedb_router.post("", description="meeting 을 생성합니다.")
async def api_create_meeting_edgedb() -> CreateMeetingResponse:
    return CreateMeetingResponse(url_code="abc")

@mysql_router.post("", description="meeting 을 생성합니다.")
async def api_create_meeting_mysql() -> CreateMeetingResponse:
    return CreateMeetingResponse(url_code="abc")

💡 강의용 예제에서는 DB 이름을 URL에 명시했지만, 실제 서비스에서는 지양해야 합니다.


6. 🧪 Swagger로 확인

  • asgi.py 실행 후 http://localhost:8000/docs 접속
  • edgedb와 mysql용 meeting 생성 API 자동 문서화 확인 가능

🧠 정리

구성 요소 설명

FastAPI 웹 프레임워크
ORJSON 빠른 JSON 직렬화 도구
Router API 경로 분기 처리
DTO 응답 데이터 스키마 명시
Swagger 자동 문서화 확인 UI

👉 이렇게 스펙을 먼저 만들면 프론트엔드 작업 병행 가능하고, 실제 DB 구현 전 테스트도 용이합니다.