Development/Python
(str, Enum) vs (Enum)
폴피드
2025. 5. 20. 10:58
- (str, Enum) vs (Enum)
값 타입 | str ("ACTIVE") | MyEnum.ACTIVE (객체) |
직렬화 결과 (JSON) | 문자열로 출력 ("ACTIVE") ✅ | 객체 이름 또는 내부 값 ❌ |
Pydantic 호환성 | FastAPI에서 자동 문자열 직렬화 ✅ | 직렬화/역직렬화 불편함 ❌ |
SQLAlchemy Enum 컬럼 저장값 | 문자열로 바로 저장 가능 ✅ | 내부적으로 enum.name 저장 (변환 필요) |
- 코드 비교
from enum import Enum
class Status(str, Enum):
ACTIVE = "active"
INACTIVE = "inactive"
print(Status.ACTIVE) # "active"
print(Status.ACTIVE.value) # "active"
print(Status.ACTIVE.name) # "ACTIVE"
✔ JSON 직렬화: "active"
✔ FastAPI/Pydantic에서 요청/응답 자동 변환
✔ SQLAlchemy에서도 Enum(Status) 사용 시 문자열로 저장됨
class Status(Enum):
ACTIVE = "active"
INACTIVE = "inactive"
print(Status.ACTIVE) # Status.ACTIVE
print(Status.ACTIVE.value) # "active"
print(Status.ACTIVE.name) # "ACTIVE"
✘ JSON 직렬화: Status.ACTIVE → 직렬화 오류 발생 가능
✘ FastAPI 입력으로 "active"를 보내면 파싱 실패 가능
✘ SQLAlchemy Enum(Status)로 쓸 경우 직접 .value 처리해야 저장 시 값 제대로 들어감
- 언제 (str, Enum) 을 써야 하나?
거의 대부분의 경우 (str, Enum)을 사용하는 것이 정답입니다 ✅
특히:
- FastAPI 요청/응답으로 JSON 문자열을 주고받는 경우
- SQLAlchemy에서 Enum을 문자열 기반 컬럼으로 저장하려는 경우
- Swagger/OpenAPI에서 자동으로 "active", "inactive" 등의 값 노출되기를 원하는 경우
728x90
반응형