종로구 실시간 집회알림 서비스
2025 KT디지털인재장학생 3조 팀 프로젝트
DIGIRO는 종로구 지역의 실시간 집회 및 교통통제 정보를 제공하는 웹 기반 알림 서비스입니다.
종로구는 집회가 빈번하게 발생하는 지역입니다:
- 🏛️ 광화문: 주요 집회 장소
- ⚖️ 헌법재판소: 법적 시위 거점
- 🌳 탑골공원: 역사적 집회 장소
- ❌ 실시간 확인 불가: 집회 정보를 즉시 확인하기 어려움
- ❌ 알림서비스 부재: 사전 통지 시스템 없음
- ❌ 보고서 형식: 사용자 친화적이지 않은 정보 제공
- ❌ 분산된 정보: 집회와 교통통제 정보가 각각 분리됨
"기분 좋게 나왔는데, 도착하자마자 너무 시끄러워 집에 갈까 고민했다."
— 광복절 집회 현장 시민 인터뷰
DIGIRO는 이러한 시민들의 불편을 해결하기 위해 개발되었습니다.
- 집회/시위 정보: 일시, 장소, 예상 인원, 관할서 정보
- 교통통제 정보: 통제 구간, 시간 안내
- 지도 시각화: 카카오맵 기반 집회 위치 및 경로 표시
- 집회 시작/종료 지점 표시
- 예상 시위 행진 경로 시각화 (붉은색 점선 표시)
- 마커 클릭으로 상세 정보 확인 가능
graph TB
A[사용자 브라우저] --> B[React Frontend]
B --> C[FastAPI Backend]
C --> D[PostgreSQL Database]
E[서울경찰청 집회 정보] --> C
F[서울시 교통통제 API] --> C
G[카카오맵 API] --> C
C --> H[SMS 알림 서비스]
| 구분 | 기술 |
|---|---|
| Frontend | React.js, CSS |
| Backend | FastAPI, Python |
| Database | PostgreSQL |
| 외부 API | 카카오맵 API, 서울시 공공데이터 API, Gemini API |
| Infrastructure | Docker, Kubernetes |
| Security | (비공개) 암호화 방식 사용 |
digiro/
├── back-end/ # 백엔드 API 서버
│ └── digi_ro/
│ ├── app/
│ │ ├── api/v1/ # API 엔드포인트
│ │ ├── core/ # 핵심 설정
│ │ ├── crud/ # 데이터베이스 CRUD 연산
│ │ ├── db/ # 데이터베이스 연결
│ │ ├── schemas/ # Pydantic 스키마
│ │ ├── security/ # 인증 및 암호화
│ │ └── services/ # 비즈니스 로직
│ └── tests/ # 단위 테스트
│
├── Crawler-Pod/ # 크롤링 마이크로서비스
│ └── back-end/
│ └── digi_ro/
│ └── app/
│ ├── core/ # 크롤링 설정
│ ├── crud/ # 데이터 처리
│ ├── db/ # DB 연결
│ ├── schemas/ # 데이터 모델
│ └── services/ # 크롤링 서비스
│
├── DB-Pod/ # 데이터베이스 마이크로서비스
│ └── back-end/
│ └── digi_ro/
│ └── app/
│ ├── core/ # DB 핵심 설정
│ ├── crud/ # 데이터 관리
│ ├── db/ # 연결 관리
│ └── schemas/ # 테이블 스키마
│
├── front-end/ # React 프론트엔드
│ ├── public/ # 정적 파일
│ └── src/
│ ├── assets/ # 이미지, 아이콘
│ ├── components/ # React 컴포넌트
│ ├── context/ # 상태 관리
│ └── pages/ # 페이지 컴포넌트
│
├── k8s-deployment/ # Kubernetes 배포 설정
└── smpa_attachments/ # 서울경찰청 첨부파일 저장소
└── 1year/ # 연도별 데이터
- Python 3.12+
- Node.js 14+
- npm or yarn
- PostgreSQL 14+
- Docker & Docker Compose
-
저장소 클론
git clone https://github.com/Digi-ro/digi_ro_deployment.git cd digi_ro_deployment -
백엔드 실행
cd back-end poetry install poetry run uvicorn digi_ro.main:app --reload -
프론트엔드 실행
cd front-end npm install npm start ### 애플리케이션이 `http://localhost:3000`에서 실행됩니다. ### 빌드 프로덕션용 빌드를 생성하려면: npm run build ### 사용법 웹 브라우저에서 `http://localhost:3000`에 접속 후 확인
-
로컬 데이터베이스 init
brew install postgresql@14 # Mac brew services start postgresql@14 cd back-end 1) PostgreSQL CLI 접속 psql -U postgres psql -U digiro_admin -d digiro_db .env 파일에 DATABASE_URL작성 DATABASE_URL=postgresql://<username>:<password>@localhost:<port>/digiro_db poetry run python -m digi_ro.create_db_table ### 알림서비스 신청자 관련 db table 조회 SELECT n.id AS notification_id, n.encrypted_phone_number, d.name AS district_name, s.name AS station_name FROM notifications AS n LEFT JOIN notification_district_association AS nda ON n.id = nda.notification_id LEFT JOIN districts AS d ON nda.district_id = d.id LEFT JOIN notification_station_association AS nsa ON n.id = nsa.notification_id LEFT JOIN stations AS s ON nsa.station_id = s.id;
# 전체 서비스 실행
docker-compose up -d
쿠버네티스 클러스터에서 Docker Hub의 이미지를 이용하여 k8s-Deployment 폴더의 yaml 파일들로 배포할 수 있습니다.
- Backend:
taekyuko/digi-ro-backend:v7.0 - Frontend:
taekyuko/digi-ro-frontend:v1.7 - Crawler:
taekyuko/digiro-crawler:v0.9 - DB-Init:
taekyuko/digiro-db-init:v0.5
k8s-Deployment 디렉토리의 YAML 파일들을 kubectl apply 명령어로 배포합니다.
# Kubernetes 클러스터에 모든 리소스를 배포합니다.
kubectl apply -f k8s-Deployment/배포를 진행하기 전에, Kubernetes 클러스터에 api-secrets라는 이름의 Secret이 digiro 네임스페이스에 생성되어 있어야 합니다. 이 Secret에는 다음 키들이 포함되어야 합니다:
ENCRYPTION_KEYNAVER_API_CLIENT_IDVWORLD_API_KEYSMS_KEYSMS_SECRET_KEYDATABASE_URLGEMINI_API_KEYSKAKAO_API_KEYNAVER_API_CLIENT_SECRETSEOUL_API_KEYSEOUL_METRO_API_KEY
예시:
kubectl을 사용하여 Secret을 생성하는 방법은 다음과 같습니다. 각 <value> 부분은 실제 값으로 대체해야 합니다.
kubectl create secret generic api-secrets -n digiro \
--from-literal=ENCRYPTION_KEY=<value> \
--from-literal=NAVER_API_CLIENT_ID=<value> \
--from-literal=VWORLD_API_KEY=<value> \
--from-literal=SMS_KEY=<value> \
--from-literal=SMS_SECRET_KEY=<value> \
--from-literal=DATABASE_URL=<value> \
--from-literal=GEMINI_API_KEYS=<value> \
--from-literal=KAKAO_API_KEY=<value> \
--from-literal=NAVER_API_CLIENT_SECRET=<value> \
--from-literal=SEOUL_API_KEY=<value> \
--from-literal=SEOUL_METRO_API_KEY=<value>GET /api/v1/rallies/today # 오늘의 집회
GET /api/v1/rallies/tomorrow # 내일의 집회
GET /api/v1/rallies/all/ # 전체 집회 조회
GET /api/v1/rallies?district= # 특정 집회 상세정보
POST /api/v1/internal/rally-info/ # 집회 정보 수집GET /api/v1/control/traffic # 전체 교통통제 정보
GET /api/v1/api/v1/control/metro # 현재 진행중인 통제
POST /api/v1/GET /api/v1/ #[1단계] 원본 데이터 수집 및 저장 (업데이트 기능 추가)
POST /api/v1/control/parse-new-info #[2단계] 파싱 및 지오코딩 (waypoint 좌표 포함)
GET /api/v1/control/ # DB에 저장된 통제 정보 목록 조POST /api/v1/notification/signup # 알림 구독
PUT /api/v1/notification/modify # 알림 정보 변경
DELETE /api/v1/notification/delete # 알림 구독 해제
POST /api/v1/notification/send-daily-notifications/ # 알림 정보 발송프로젝트에 대한 문의사항이나 제안이 있으시면 언제든지 연락 주세요.
- 📧 Email: woosukqw@korea.ac.kr
- 🐛 Issues: GitHub Issues
- 📱 Contact: KT디지털인재장학생 3조
이 프로젝트는 아직 라이선스 고민중입니다..
