API 개발 중 다음 오류가 발생하였다.
TypeError: Object of type DbmsStatus is not JSON serializable
문제 상황을 특정하기 위해 response 내의 값들을 줄여 설명하겠다.
문제가 발생한 상황은 아래 코드의 return 구문이다.
instanceGroup = models.InstanceGroup.query.filter(models.InstanceGroup.userId == userId).filter(models.InstanceGroup.id == instanceId).first()
result['id'] = instanceGroup.id
result['instanceName'] = instanceGroup.instanceName
result['instanceStatus'] = instanceGroup.status
return jsonify(result)
위 코드에서, InsdtanceGroup 의 model 코드는 다음과 같다. (간소화 하였음)
class InstanceGroup(db.Model):
id = db.Column(db.BigInteger, primary_key=True, autoincrement=True)
instanceName = db.Column(db.String(20), nullable=False)
instanceStatus = db.Column(db.Enum(DbmsStatus), nullable=False)
instanceStatus Column 은 다른 Column 과 다르게, Enum Type의 변수다.
이 부분이 오류를 발생시킨 핵심이다.
해당 객체는 Enum Type Class이다.
class DbmsStatus(Enum):
NORMAL = 'normal'
ERROR = 'error'
INSTALL = 'install'
따라서 다른 Column 처럼 JSON 형태로 변환되지 못하여 생긴 문제였다.
해결
instanceGroup = models.InstanceGroup.query.filter(models.InstanceGroup.userId == userId).filter(models.InstanceGroup.id == instanceId).first()
result['id'] = instanceGroup.id
result['instanceName'] = instanceGroup.instanceName
result['instanceStatus'] = instanceGroup.status.value
return jsonify(result)
instanceGroup.status -> instanceGroup.status.value
다음과 같이 해결 할 수 있다.