Flask 기반 재난 구호 물자 관리 시스템 개발

시스템 아키텍처 구성

백엔드는 Flask 프레임워크를 기반으로 하며, 데이터베이스 연동에는 SQLAlchemy를 사용한다. 프론트엔드는 Bootstrap 또는 Vue.js로 구현되며, 전체 시스템은 물자 관리, 구조팀 정보, 피해 지역, 배분 이력이라는 네 가지 주요 모듈로 구성된다. RESTful API를 통해 프론트와 백엔드를 분리하고, JWT 토큰을 이용한 인증 방식을 적용한다.

데이터베이스 스키마 설계

물자 테이블에는 이름, 종류, 수량, 보관 위치가 포함되며, 구조팀 테이블은 팀 정보 및 연락처를 저장한다. 피해지역 테이블은 위치와 필요 물품 목록을 관리하고, 배분 이력 테이블은 물품 ID, 배분 수량, 수령자, 시간 정보를 기록한다. 예시 SQLAlchemy 모델 클래스는 다음과 같다:

class InventoryItem(db.Model):
    __tablename__ = 'inventory_items'
    item_id = db.Column(db.Integer, primary_key=True)
    item_name = db.Column(db.String(100), nullable=False)
    item_type = db.Column(db.String(60))
    stock_count = db.Column(db.Integer, default=0)
    storage_location = db.Column(db.String(150))

핵심 기능 구현

물자 입고 처리는 POST 요청으로 이루어지며, 입력 데이터 검증과 재고 갱신 로직이 포함된다:

@app.route('/api/inventory', methods=['POST'])
@jwt_required()
def register_item():
    payload = request.get_json()
    item_entry = InventoryItem(
        item_name=payload['item_name'],
        item_type=payload['item_type'],
        stock_count=payload['stock_count'],
        storage_location=payload['storage_location']
    )
    db.session.add(item_entry)
    db.session.commit()
    return jsonify({"status": "success", "message": "Item registered"}), 201

물자 배분 기능에서는 트랜잭션 처리를 통해 재고 부족 여부 확인 및 이력 생성 절차를 안전하게 수행해야 한다. 데이터베이스 마이그레이션은 Flask-Migrate를 활용하여 관리한다.

데이터 시각화 기능

ECharts를 통합하여 물자 분포도와 실시간 재고 현황판을 제공한다. 서버 측 엔드포인트는 JSON 형식의 통계 자료를 반환하며, 클라이언트는 AJAX 호출을 통해 해당 데이터를 받아 화면에 표시한다. 예제 경로는 아래와 같다:

@app.route('/api/statistics')
def fetch_statistics():
    result = db.session.query(
        InventoryItem.item_type,
        func.sum(InventoryItem.stock_count)
    ).group_by(InventoryItem.item_type).all()
    return jsonify(dict(result))

배포 전략

운영 환경에서는 Gunicorn과 Nginx를 조합하여 서비스를 배포하고, Supervisor를 통해 프로세스를 제어한다. 민감한 설정 값은 환경 변수로 관리하며, Flask-CORS를 사용해 크로스 도메인 요청을 허용한다. GitHub Actions를 활용하여 CI/CD 파이프라인을 자동화할 수 있다.

추가 기능 제안

물자의 유통기한 알림, 다중 창고 운영, 운송 경로 최적화 알고리즘 등의 확장 기능을 고려할 수 있다. Twilio나 SendGrid와 같은 외부 서비스를 연동하여 SMS 또는 이메일 알림 기능도 추가 가능하다. Redis를 도입하면 빈번한 조회 작업 성능을 개선할 수 있다.

태그: flask python sqlalchemy ECharts jwt

5월 26일 07:12에 게시됨