월간직무보고 대시보드 — 흩어진 주간보고·품의에서 초안까지 자동으로
매달 같은 일을 반복하고 있었습니다. 주간업무보고를 하나씩 열어 보고, 품의 내역을 찾고, 업무 처리 현황 화면에서 숫자를 옮겨 적고, 지난달 양식에 맞춰 문장을 다시 고쳐 쓰는 일입니다.

이 작업의 대부분은 판단이 아니라 찾기와 옮겨 적기였습니다. 실수도 대부분 여기서 났습니다. 숫자 오타, 항목 누락, 지난달 문구가 그대로 남는 일이었습니다.
그래서 만들었습니다. 인트라넷에 이미 쌓여 있는 자료에서 근거를 모아 월간직무보고 초안까지 만들어 주는 개인용 대시보드입니다. 사람은 검토하고 복사해서 붙여넣기만 합니다.
1. 처음 정한 원칙 네 가지
만들기 전에 선을 그었습니다. 이 원칙이 이후 모든 결정의 기준이 됐습니다.
| 원칙 | 이유 |
|---|---|
| 인트라넷에는 읽기만 한다 | 결재 문서 시스템에 자동 입력을 하면 사고 위험이 큽니다. 쓰기는 사람이 합니다. |
| 결과물은 인트라넷 양식과 같은 칸으로 | 복사해 붙여넣는 순간까지 손이 덜 가야 합니다. |
| 근거 없는 내용은 만들지 않는다 | 보고서에서 가장 위험한 것은 그럴듯한 거짓입니다. 모르면 [확인필요]로 남깁니다. |
계정 정보는 코드가 아니라 .env에 |
공유·보관 과정에서 노출될 가능성을 줄입니다. |
특히 세 번째 원칙이 이 프로젝트의 성격을 결정했습니다. 빈칸을 채우는 것보다, 모르는 칸을 모른다고 표시하는 것이 더 중요했습니다.
2. 무엇을 만들었나
브라우저에서 여는 로컬 웹앱입니다. 화면은 크게 세 부분입니다.
사이드바에서 대상 월을 고르고 수집을 실행합니다. 상단에는 수집 건수와 진행 단계가 표시됩니다. (화면의 사내 문서 내용은 모자이크 처리했습니다)
흐름은 네 단계입니다.
- 수집 — 로그인 후 주간업무보고(팀), 내가 기안한 품의, 업무 처리 현황 월간표, 기존 월간직무보고를 조회만 합니다. 백그라운드로 돌아갑니다.
- 저장 — 수집한 원문을 내 컴퓨터의 로컬 SQLite에 저장합니다. 외부로 나가지 않습니다.
- 생성 — 수집 자료와 지난달 양식을 함께 넘겨, 인트라넷 “성과 계획표” 칸 구조(구분 / 평가지표 / 달성목표 / 수행결과 / 비고 + 특기사항) 그대로 초안을 받습니다.
- 검토·복사 — 왼쪽 칸에서 수정하면 오른쪽 복사용 칸에 그대로 반영됩니다. 칸별로 복사해 인트라넷에 붙여넣습니다.
왼쪽이 편집 칸, 오른쪽이 복사용 칸입니다. 두 칸이 같은 구조라 복사·붙여넣기에서 서식이 깨지지 않습니다. (내용은 모자이크)
어떤 문서를 근거로 삼았는지 표로 남깁니다. 각 행에서 인트라넷 원문으로 바로 이동할 수 있습니다. (제목·작성자는 모자이크)
수집 현황 화면을 만든 이유는 근거를 따라가 볼 수 있어야 초안을 믿을 수 있기 때문입니다. AI가 쓴 문장은 결국 쓰는 사람의 책임이므로, 어디서 나온 숫자인지 즉시 확인할 수 있어야 했습니다.
3. 막혔던 지점 여섯 가지
① 월간보고가 1건만 조회됐다
검색 폼에 화면에 보이지 않는 “월” 값이 있었고, 그 기본값이 현재 월로 잡혀 있었습니다. 목록 조회 결과를 보며 셀렉터만 고치고 있었는데, 원인은 폼의 숨은 필드였습니다.
화면이 아니라 폼의 전체 필드를 봐야 한다는 것을 배웠습니다.
② 설정 파일의 열 이름 하나가 통째로 사라졌다
설정 형식에서 no라는 글자가 “아니오(거짓)” 로 해석돼 버렸습니다. 사소한 이름 하나가 조용히 데이터를 지웠습니다. 이후로는 예약어를 피해 이름을 짓고 있습니다.
③ 초안이 빈 칸으로 나왔다
AI 응답이 길이 제한에서 잘려 형식이 깨졌고, 그 실패가 조용히 빈 결과로 바뀌어 있었습니다. 가장 위험한 종류의 버그였습니다.
실패는 조용히 넘기지 말고 드러내야 합니다. 출력 한도를 늘리고, 잘림을 오류로 알리도록 고쳤습니다.
④ 서버가 갑자기 멈췄다
설정 파일에 한글 주석을 덧붙이다 문자 인코딩이 섞였습니다. 한글이 오가는 곳에서는 저장 방식을 명시해야 했습니다.
⑤ 주간보고 한 건이 해당 월에서 누락됐다
보고일은 8월 말인데 제목은 “9월 N주”였습니다. 날짜가 아니라 업무상의 귀속 기준(제목의 월) 으로 분류하도록 바꿨습니다.
⑥ 제작관리 수치의 출처를 찾지 못했다
근거 문서가 한 달 전(전월 말)에 작성돼 있었습니다. “그 달의 자료”가 아니라 그 달을 위해 쓴 자료를 찾도록 수집 범위를 넓혔습니다.
4. 검증 — 지난달 보고서를 정답지로 삼았다
새로 만든 시스템을 믿으려면 비교 대상이 필요했습니다. 마침 지난달 보고서가 이미 있었으므로, 그것을 정답지로 놓고 숫자 단위로 대조했습니다.
- 업무 지각 건수가 실제 작성본과 일치했습니다.
- 업무 처리 건수의 분모(근무일 기준 총건수)도 일치했습니다. 분자는 조회 시점에 따라 달랐는데, 보고서 작성 이후 갱신되는 값이었습니다.
- 비용 합계는 문서 내 항목을 합산해 원문과 맞아떨어졌습니다.
이 과정에서 뜻밖의 소득이 있었습니다. 기존 작성본의 숫자 한 곳이 근거 문서와 다르다는 사실을 발견했습니다. 오타로 보였습니다. 자동 대조가 사람이 놓친 것을 찾아낸 셈입니다.
그리고 시스템이 “만들어 낸 것처럼 보였던 숫자”는 환각이 아니라 항목 합산값이었습니다. 근거를 남기도록 설계한 덕분에 확인이 가능했습니다.
5. 기대 효과
실사용 전이므로 “관찰된 것”과 “앞으로 잴 것”을 구분해서 적습니다.
이미 확인된 것
- 흩어진 자료 수집과 숫자 옮겨 적기가 버튼 한 번(백그라운드 실행)으로 대체됐습니다.
- 지난달 양식의 틀(구분·평가지표·달성목표)을 유지한 채 수행결과만 채워집니다.
- 숫자 오류를 사람이 눈으로 찾던 방식에서 근거 문서와 자동 대조하는 방식으로 바뀌었습니다.
- 근거가 없는 항목이 표시되어, 어디를 직접 확인해야 하는지가 분명해집니다.
실사용에서 재볼 것
| 항목 | 이전(수작업) | 이후(대시보드) |
|---|---|---|
| 작성 소요 시간 | 측정 예정 | 측정 예정 |
| 숫자 수정 횟수 | 측정 예정 | 측정 예정 |
| 자료 찾느라 연 화면 수 | 여러 개 | 1개 |
| 최종 검토에서 고친 비율 | - | 측정 예정 |
6. 한계와 주의
- 초안은 초안입니다. 금액처럼 사람이 확정해야 하는 값은 일부러 자리표시로 남겼습니다.
- 사이트 화면 구조가 바뀌면 수집이 깨질 수 있습니다. 설정 파일 한 곳만 고치면 되도록 분리했지만, 유지보수는 필요합니다.
- 비밀번호 잠금은 화면 가림 수준의 간이 보호입니다. 계정 정보가 담긴 설정 파일은 공유하지 않습니다.
- AI가 쓴 문장은 쓰는 사람의 책임입니다. 그래서 원문 링크와 수집 현황을 화면에 남겼습니다.
- 이 글의 화면 캡처는 사내 문서 내용을 모자이크 처리한 것입니다. 레이아웃과 흐름만 참고해 주세요.
7. 배운 점
- 자동화의 핵심은 속도가 아니라 “옮겨 적기 노동”의 제거였습니다. 판단은 사람에게 남겼습니다.
- 정답지를 먼저 찾아라. 지난달 보고서가 있었기에 검증이 가능했습니다.
- 모른다고 말하는 시스템이 믿을 만합니다. 빈칸에
[확인필요]를 남기는 설계가 신뢰를 만들었습니다. - 현업 지식은 대화 속에서 규칙으로 쌓입니다. “이 숫자는 저 화면에서”, “이 항목은 전월 품의에서” 같은 문장이 그대로 코드와 지침이 됐습니다.
- 막힌 지점의 원인은 대개 눈에 보이지 않는 곳에 있었습니다 — 숨은 입력값, 글자 인코딩, 조용히 삼킨 오류.
- 읽기 전용이라는 제약이 오히려 설계를 단순하게 만들었습니다. 쓰기가 없으니 되돌릴 일도 없습니다.
8. 마무리
공공기관·사내 시스템을 다루는 자동화는 “무엇을 자동화하지 않을지”를 정하는 일이 절반입니다. 이 프로젝트에서 자동화한 것은 찾기와 옮겨 적기이고, 자동화하지 않은 것은 판단과 결재입니다.
그 선을 긋고 나니 나머지는 생각보다 단순했습니다.
기술 스택: Python · Streamlit · Playwright · SQLite · Claude API · python-docx