✅ 미팅 생성 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?
- GitHub 저장소: https://github.com/ijl/orjsonPyPI+6yepcode.io+6GitHub+6
- poetry add orjson==3.10.12
- FastAPI의 응답 속도 향상을 위해 orjson 적용.
- orjson은 기본 json보다 최대 6배 이상 빠름.
🧪 성능 비교 테스트 코드
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 구현 전 테스트도 용이합니다.
'Fastapi' 카테고리의 다른 글
Chapter 3-3 고유하고 짧은 alphanumeric 식별자 만들기 – Base62 접근 방식 (0) | 2025.05.27 |
---|---|
Chapter 3-4 Base62 디버깅과 디버깅 스킬의 중요성 (0) | 2025.05.27 |
Chapter 2-6 Github Action 설정 및 캐싱 가이드 (0) | 2025.05.23 |
Chapter 2-5 테스트 스크립트 작성 가이드 (0) | 2025.05.23 |
Chapter 2-4 자동화 테스트가 필요한 이유 (0) | 2025.05.23 |