🎯 저장소 목적: 개발 중 발생한 오류와 해결방법 기록 동일 오류 재발 방지 및 학습 자료 📁 첫 번째 사례: get_materials API JSON 직렬화 오류 해결 PostgreSQL Row 객체 → 딕셔너리 변환 방법 상세한 문제 분석 및 해결 과정 문서화 ✅ 완료: TK-MP-Project 백엔드 API 수정 성공
56 lines
1.5 KiB
Markdown
56 lines
1.5 KiB
Markdown
# get_materials API 응답 오류 수정
|
|
|
|
## 🚨 문제 상황
|
|
- **오류**: TypeError - Object of type 'RealDictRow' is not JSON serializable
|
|
- **원인**: PostgreSQL Row 객체를 바로 JSON으로 변환 시도
|
|
- **위치**: `/api/materials` 엔드포인트
|
|
|
|
## 🔍 문제 원인 분석
|
|
|
|
### Before (오류 발생)
|
|
```python
|
|
materials = []
|
|
for row in cur.fetchall():
|
|
materials.append(row) # ← psycopg2.extras.RealDictRow 객체
|
|
|
|
return jsonify({
|
|
'data': materials # ← JSON 직렬화 불가능!
|
|
})
|
|
왜 오류가 발생했나?
|
|
|
|
psycopg2.cursor.fetchall() → RealDictRow 객체 반환
|
|
Flask.jsonify() → Python dict만 JSON 변환 가능
|
|
RealDictRow ≠ dict → TypeError 발생
|
|
|
|
✅ 해결 방법
|
|
After (정상 작동)
|
|
pythonmaterials = []
|
|
for row in cur.fetchall():
|
|
# 명시적으로 딕셔너리 변환
|
|
material = {
|
|
'id': row[0],
|
|
'job_number': row[1],
|
|
'item_number': row[2],
|
|
'description': row[3],
|
|
'category': row[4],
|
|
'quantity': row[5],
|
|
'unit': row[6],
|
|
'created_at': row[7].isoformat() if row[7] else None
|
|
}
|
|
materials.append(material)
|
|
|
|
return jsonify({'data': materials})
|
|
🔧 핵심 수정사항
|
|
|
|
인덱스 접근: row[0], row[1], ... 방식으로 값 추출
|
|
명시적 변환: 각 필드를 수동으로 딕셔너리에 매핑
|
|
날짜 처리: datetime → isoformat() 변환 추가
|
|
|
|
📅 수정 정보
|
|
|
|
날짜: 2024-07-15
|
|
프로젝트: TK-MP-Project
|
|
파일: backend/app.py
|
|
함수: get_materials()
|
|
결과: API 응답 정상화 완료
|