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
반응형