Skip to content

Digi-ro/DIGI-RO

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🏛️ DIGIRO (Digital + 종로)

종로구 실시간 집회알림 서비스
2025 KT디지털인재장학생 3조 팀 프로젝트

FastAPI React PostgreSQL Docker Kubernetes

📋 프로젝트 개요

DIGIRO는 종로구 지역의 실시간 집회 및 교통통제 정보를 제공하는 웹 기반 알림 서비스입니다.

🎯 배경 및 문제점

종로구는 집회가 빈번하게 발생하는 지역입니다:

  • 🏛️ 광화문: 주요 집회 장소
  • ⚖️ 헌법재판소: 법적 시위 거점
  • 🌳 탑골공원: 역사적 집회 장소

기존 서비스의 한계점

  • 실시간 확인 불가: 집회 정보를 즉시 확인하기 어려움
  • 알림서비스 부재: 사전 통지 시스템 없음
  • 보고서 형식: 사용자 친화적이지 않은 정보 제공
  • 분산된 정보: 집회와 교통통제 정보가 각각 분리됨

💡 해결 방안

"기분 좋게 나왔는데, 도착하자마자 너무 시끄러워 집에 갈까 고민했다."
— 광복절 집회 현장 시민 인터뷰

DIGIRO는 이러한 시민들의 불편을 해결하기 위해 개발되었습니다.

✨ 서비스 화면

digiro main page

✨ 주요 기능

🔄 실시간 정보 제공

  • 집회/시위 정보: 일시, 장소, 예상 인원, 관할서 정보
  • 교통통제 정보: 통제 구간, 시간 안내
  • 지도 시각화: 카카오맵 기반 집회 위치 및 경로 표시

🗺️ 인터랙티브 지도

  • 집회 시작/종료 지점 표시
  • 예상 시위 행진 경로 시각화 (붉은색 점선 표시)
  • 마커 클릭으로 상세 정보 확인 가능

🏗️ 시스템 아키텍처

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 알림 서비스]
Loading

🛠️ 기술 스택

구분 기술
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

로컬 개발 환경 설정

  1. 저장소 클론

    git clone https://github.com/Digi-ro/digi_ro_deployment.git
    cd digi_ro_deployment
  2. 백엔드 실행

    cd back-end
    poetry install
    poetry run uvicorn digi_ro.main:app --reload
  3. 프론트엔드 실행

    cd front-end
    npm install
    npm start
    ### 애플리케이션이 `http://localhost:3000`에서 실행됩니다.
    
    ### 빌드
    프로덕션용 빌드를 생성하려면:
    
    npm run build
    
    ### 사용법
    
    웹 브라우저에서 `http://localhost:3000`에 접속 후 확인
  4. 로컬 데이터베이스 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로 실행

# 전체 서비스 실행
docker-compose up -d

🚀 Kubernetes 배포

쿠버네티스 클러스터에서 Docker Hub의 이미지를 이용하여 k8s-Deployment 폴더의 yaml 파일들로 배포할 수 있습니다.

Docker Hub Repositories (현재 적용 버전)

  • 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/

필요한 시크릿 (Required Secrets)

배포를 진행하기 전에, Kubernetes 클러스터에 api-secrets라는 이름의 Secret이 digiro 네임스페이스에 생성되어 있어야 합니다. 이 Secret에는 다음 키들이 포함되어야 합니다:

  • ENCRYPTION_KEY
  • NAVER_API_CLIENT_ID
  • VWORLD_API_KEY
  • SMS_KEY
  • SMS_SECRET_KEY
  • DATABASE_URL
  • GEMINI_API_KEYS
  • KAKAO_API_KEY
  • NAVER_API_CLIENT_SECRET
  • SEOUL_API_KEY
  • SEOUL_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>

📱 API 엔드포인트

집회 정보 API

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/  # 집회 정보 수집

교통통제 API

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에 저장된 통제 정보 목록 조

알림 서비스 API

POST /api/v1/notification/signup                    # 알림 구독
PUT  /api/v1/notification/modify                    # 알림 정보 변경
DELETE /api/v1/notification/delete                  # 알림 구독 해제
POST /api/v1/notification/send-daily-notifications/ # 알림 정보 발송

📞 문의

프로젝트에 대한 문의사항이나 제안이 있으시면 언제든지 연락 주세요.

📄 라이선스

이 프로젝트는 아직 라이선스 고민중입니다..


DIGIRO - Digital + 종로
실시간 집회정보로 더 스마트한 종로구를 만들어갑니다

Made with ❤️ by KT디지털인재장학생 3조

GitHub stars GitHub forks

About

종로구 지역의 실시간 집회 및 교통통제 정보를 제공하는 웹 기반 알림 서비스

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors