시스템 아키텍처 구성
백엔드는 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를 도입하면 빈번한 조회 작업 성능을 개선할 수 있다.