✅ DTO란 무엇인가? (Data Transfer Object)
1. 🎯 정의와 역할
- DTO는 "데이터 전달"만을 목적으로 만든 객체입니다.
- DTO는 수정, 추가, 삭제가 없어야 하며, 오직 전달만 수행해야 합니다.
- 예시: CreateMeetingResponse는 pydantic.BaseModel을 상속한 DTO입니다.
📌 정보이론 관점에서 "정보량이 바뀌면 더 이상 DTO가 아니다."
2. ❌ dict 사용의 문제점
✅ 잘못된 예시 (dict 사용)
async def api_create_meeting_edgedb() -> dict[str, str]:
return {"url_code": "abc"}
✅ 올바른 예시 (DTO 사용)
async def api_create_meeting_mysql() -> CreateMeetingResponse:
return CreateMeetingResponse(url_code="abc")
둘 다 Swagger에서 문제 없이 호출 가능하지만, dict에는 명확한 스펙이 없습니다.
⚠️ dict를 쓰면 생기는 문제들
- Swagger 문서에서 key/value 타입 명시가 안 됨
- key 누락 또는 오타를 컴파일 타임에 알 수 없음
- dict는 mutable → 데이터가 변경되기 쉬움
- 디버깅이 어렵고, 유지보수가 힘들어짐
3. ✅ 왜 DTO가 중요한가?
항목 dict DTO (BaseModel)
| 명세 문서 자동화 | ❌ 불가능 | ✅ Swagger 자동 생성 |
| 정적 분석 지원 | ❌ 없음 | ✅ IDE/툴이 타입 검사 |
| 구조적 안정성 | ❌ 낮음 | ✅ 타입 보장 |
| 재사용성 | ❌ 낮음 | ✅ 높음 |
4. 📌 실무 팁 요약
- 구현보다 스펙 먼저 정의하자 → 동료와 협업 쉬워짐
- DTO를 적극 활용하고 dict는 지양하자
- FastAPI + Pydantic 조합으로 타입 안전성 확보
5. 🧪 성능 측정: timeit 활용법
import timeit, json, orjson
print(timeit.timeit(lambda: json.dumps(obj)))
print(timeit.timeit(lambda: orjson.dumps(obj)))
- 빠르게 코드 성능 확인 가능
- 실무에서도 자주 사용하는 툴
🧠 최종 정리
- DTO는 데이터 전달만! dict 사용 지양.
- DTO 사용은 Swagger 자동 문서화, 타입 안정성, 협업 효율성 측면에서 매우 중요.
- 고유 ID는 base62 등을 활용해 생성.
- 실전에서는 항상 성능 측정 → timeit 유용.