5.5 KiB
5.5 KiB
📘 프로젝트 명세서 (Project Specification)
프로젝트명: VOC Notification System (부산교통공사 VOC 수집/알림/보고서 생성기) 버전: v1.2 아키텍처: MVC 패턴 (Model-View-Controller) 프레임워크: CustomTkinter (UI), DrissionPage (Scraping), SQLite (DB), ReportLab/HWP Automation (Report)
🏗️ 1. 아키텍처 개요 (Architecture Overview)
이 프로젝트는 부산교통공사 홈페이지의 '고객의 소리(VOC)' 게시판을 자동 수집하고, 특정 키워드/부서 관련 게시글이 발생하면 사용자에게 알림을 제공하며, 이를 바탕으로 HWP/PDF 보고서를 생성하는 데스크톱 애플리케이션이다.
📦 디렉토리 구조 (Directory Structure)
d:\py_train\voc_noti\app\
├── main.py # 🚀 [Entry Point] 앱 실행 진입점. Controller 초기화 및 실행.
├── assets\ # 🎨 [Assets] 아이콘, 폰트, DLL 등 정적 자원
│ ├── app_icon.png # 애플리케이션 아이콘
│ ├── GmarketSansTTFMedium.ttf # 커스텀 폰트
│ ├── FilePathCheckerModule.dll # HWP 보안 승인 모듈
│ └── VOC_Sample.hwp # 보고서 템플릿
├── data\ # 💾 [Data] 설정 파일 및 DB
│ ├── config.json # 사용자 설정 (역명 리스트 등)
│ ├── settings.json # 앱 실행 설정 (로그인 정보, 키워드 등)
│ └── voc.db # SQLite 데이터베이스
├── controllers\ # 🎮 [Controller]
│ └── controller.py # 메인 컨트롤러 (AppController)
├── models\ # 🧠 [Model]
│ └── model.py # Pydantic 데이터 모델 (VOCPost)
├── services\ # 🕵️ [Service] 비즈니스 로직
│ ├── scraper_service.py # 웹 스크래핑 (DrissionPage)
│ └── report_service.py # 보고서 생성 (HWP/PDF Automation)
├── utils\ # 🛠️ [Utils]
│ └── database.py # DB 접근 (DAO)
└── view\ # 🎨 [View] UI 레이어 (CustomTkinter)
├── __init__.py
├── theme.py # 폰트(Gmarket Sans) 및 테마 관리
├── ui_utils.py # 자산 로더 (AssetLoader)
├── components\ # 재사용 컴포넌트
└── dialogs\ # 각종 팝업 다이얼로그
🧠 2. 데이터 모델 (Data Model) : VOCPost
app/models/model.py에 정의된 Pydantic 모델을 사용한다.
| 필드명 | 타입 | 설명 |
|---|---|---|
id |
str |
접수 번호 (PK) |
title |
str |
게시글 제목 |
writer |
str |
작성자 |
date |
str |
작성 일자 |
department |
str |
담당 부서 |
is_public |
int |
공개 여부 (1/0) |
status |
str |
처리 상태 |
content |
str |
본문 내용 |
answer |
str |
답변 내용 |
line_str |
str |
호선 (유추 정보) |
train_details |
dict |
열차 상세 정보 |
🎮 3. 주요 기능 및 구현 상세 (Key Features)
3.1 🕵️♂️ 웹 스크래핑 (VOCScraper)
- 라이브러리:
DrissionPage - 기능:
- 관리자 페이지 로그인 및 세션 유지.
- 목록 페이지 순회 및 신규/업데이트 감지.
- 상세 페이지 파싱 (본문, 답변).
3.2 📄 보고서 생성 (ReportService)
- HWP 보고서:
- 보안 모듈:
app/assets/FilePathCheckerModule.dll을 사용하여 파일 접근 경고창을 억제함. - 동작 방식: 레지스트리에 DLL 등록 후
hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckDLL")호출. - 자동화: 템플릿(
VOC_Sample.hwp)의 누름틀(Field)에 데이터를 자동 입력. - 정보 유추: 본문 텍스트 분석을 통해 관련 호선(1호선 등) 및 열차 방향(상선/하선)을 자동 판단.
- 보안 모듈:
- PDF 보고서:
- 라이브러리:
ReportLab Malgun Gothic폰트를 사용하여 한글 깨짐 방지.
- 라이브러리:
3.3 🎨 UI 및 테마 (ThemeManager)
- 폰트:
app/assets/GmarketSansTTFMedium.ttf를 동적으로 로드하여 애플리케이션 전반에 적용. - 스타일: 다크/라이트 모드 지원,
blue컬러 테마.
3.4 🔔 알림 시스템 (Notification)
- 라이브러리:
winotify - 시작 알림: 앱 실행 시 윈도우 토스트(Popup) 알림을 통해 백그라운드 실행 여부를 사용자에게 즉시 인지시킴.
- 트레이 아이콘:
pystray를 사용하여 시스템 트레이에 상주하며, 아이콘 우클릭으로 창 열기/종료 제어 가능.
📦 4. 빌드 및 배포 (Build & Deployment)
4.1 cx_Freeze 설정
- 기반:
setup.py를 통해 exe 파일 생성. - 경로 처리:
utils/path_utils.py를 사용하여 개발 환경(__file__기준)과 빌드 환경(sys.executable기준)의 에셋/설정 파일 경로 차이를 자동으로 보정. - 포함 파일:
assets/: 아이콘, 폰트, HWP 보안 DLL, 보고서 템플릿 포함.data/: 사용자 설정(settings.json) 및 초기 데이터 포함.
- 주의사항:
setup.py의include_files옵션이 빌드된 exe 폴더 루트에 해당 폴더들을 복사하도록 설정됨.
5. 바이브 코딩 (Vibe Coding) 원칙 준수
- 한국어 우선: 모든 문서, 주석, 로그는 한국어로 작성.
- 완결성: 모든 기능은 Mock이 아닌 실제 동작 가능한 코드로 구현.
- 사용자 친화적: 복잡한 설정 없이 실행만으로 동작하도록 구성 (보안 모듈 자동 등록 등).