RPA · MANUFACTURING진행 중
MIS 데이터 수집 자동화
AI-Elite_MIS_RPA
API가 없는 사내 MIS 화면에서 5개 공장의 데이터를 좌표 기반으로 수집하고, 분석 가능한 표준 데이터셋으로 재가공하는 파이프라인입니다. 사람이 매일 반복하던 수집 업무를 자동화했습니다.
성과
| 사람이 직접 | 자동 실행 | |
|---|---|---|
| 하루 소요 시간 | 40분 | 3분 |
1회 실행마다 37분이 줄었고, 사내 업무 측정 기준으로 월 15시간을 절감했습니다. 줄어든 것은 시간만이 아닙니다. 화면을 보고 옮겨 적는 과정에서 생기던 오타와 누락, 공장을 헷갈려 다른 데이터를 붙여 넣는 실수의 경로 자체를 함께 없앴습니다.
개요
사내 MIS에는 데이터를 꺼낼 API가 없었습니다. 5개 공장의 생산실적·유틸리티·재공품 데이터를 매일 화면에서 조회해 옮겨 담는 일이 반복 업무로 남아 있었습니다.
화면 좌표 클릭과 클립보드 수집으로 이 과정을 자동화하고, 수집한 원본을 BEMS 웹앱이 그대로 읽을 수 있는 표준 데이터셋으로 재가공하는 파이프라인을 만들었습니다. BEMS 웹앱에서 분리한 독립 프로젝트입니다.
구조
[MIS RPA] [웹앱: BEMS]
MIS 화면 좌표 클릭 → 클립보드 수집 서버 기동 시
↓ mtime 변경을 감지해
RawDB_*.xlsx (원본 수집) ↓
↓ 형식 재가공 엑셀을 읽어
DB_생산실적.xlsx · DB_재공품.xlsx ─────► MySQL 테이블 UPSERT
RPA는 DB에 직접 쓰지 않습니다. 접점은 공유 폴더의 엑셀 파일뿐이라, 수집이 실패해도 웹앱이 멈추지 않고 각각을 따로 재실행할 수 있습니다.
세 파이프라인 모두 수집(화면 조작) → 가공(엑셀 재집계) 두 단계로 분리했습니다.
가공 단계는 MIS·pywinauto에 의존하지 않아 다른 PC에서도 돌릴 수 있고, 모두
--dry-run으로 파일을 쓰지 않고 결과만 확인할 수 있습니다.
사고를 막기 위해 넣은 장치
좌표 기반 자동화는 화면이 한 칸만 밀려도 엉뚱한 데이터를 쓰거나, 조회 화면이 아닌 실적 입력 화면에 값을 써 넣는 사고로 이어질 수 있습니다. 그래서 방어 장치를 넣었습니다.
- 그리드 지문 검사 — 공장별 그리드의 SHA-1을 비교해, 직전 공장 데이터를 재복사한 경우 적재를 거부합니다. 좌표가 밀려 다른 공장 데이터가 섞이는 사고를 첫 실행에서 잡습니다
- 빈 분모 방어 — 생산실적이 없는 공장·일자는 빈 원단위를 저장하지 않고 즉시 중단합니다
--dry-run필수화 — 좌표 수정 후에는 반드시 미리보기로 검증하도록 문서화- 실행 전 자동 백업
화면이 바뀌었을 때 (2026-07)
수집 대상 화면이 유틸리티 일자별 사용량 추이에서 원단위 실적입력(일단위) 한 화면으로
교체되었습니다. 신규 화면은 단가·비용·COD를 함께 제공하는 대신 믹스생산량·원단위가
없어졌습니다.
- 중간 산출물이던
DB_에너지.xlsx(행=항목, 열=날짜) 재가공 단계를 폐지하고, 행=일자 형태로 통일해 웹앱 파서가 원본을 그대로 읽도록 단순화 - 없어진 믹스생산량은 방금 수집한 생산실적에서 공장별 합계를 월 단위로 역동기화
- 원단위는 Python에서 계산하지 않고 엑셀 수식으로 관리 — 저장 후 숨김 Excel 프로세스로 전체 재계산해, 실적 변경과 계산 캐시가 함께 갱신되게 함
운영하며 만난 문제
에너지 수집(09:56)이 생산실적 도착(10:51)보다 빨라 믹스생산량이 0으로 굳은 채 일일 보고가 나간 일이 있었습니다. 수집 순서를 생산실적 우선으로 고정하고, MIS 접속 없이 수 초 만에 믹스생산량만 다시 맞추는 재집계 CLI를 따로 만들어 같은 문제를 사후에도 복구할 수 있게 했습니다.
과거 데이터 수집
일일 수집과 같은 스크립트로 기간만 지정해 과거 데이터를 받습니다. 화면·파싱·적재
경로가 완전히 같아 코드가 갈라지지 않습니다. 중단 후 이어받기(--resume), 사업장별
선택 수집, 예상 소요 시간 안내(조회 횟수 × 약 3초)를 지원합니다.