
👉🏼 Entity Relationship Diagram
👉🏼 팀 Notion
👉🏼 배포 URL
여러 재난 상황이나 평소 위험한 상황에 대해서도 대처가 가능한 솔루션을 제공하기 위한 서비스
재난 문자알림을 켜놓으면
실종신고 같은 재난, 사건사고와는 거리가 먼 알림들이 오게 됩니다.
내주위 사건사고, 내주위의 재난등을 알고싶은건데? 이러한 정보만 줄 수 있는 곳은 없을까?
라는 고민에서 시작하여
시위를 자주하는 광화문을 가야하는데 여기는 안전한가?
나는 방독마스크가 있는데 통조림 많이 가지고 있는 사람이랑 교환할수는 없나?
실제 필요한 내용인 내주변 대피소는 어디있는지
119신고까지는 아니어도, 나를 도와줄 사람이 필요했으면 좋겠다 라는 상황을 가정하고
기획을 하게 되었습니다.
<주요 기능>
-
현 위치 및 목적지 위험도 조회
-
크롤링을 이용한 사건/사고 뉴스 수집(Python) - CODE-RED_Crawling
- Selenium과 BeautifulSoup을 사용하여 뉴스 정보 크롤링(당일 날짜 기준, 사건사고 내용에 대한 뉴스)
- 필터링(사건/사고에 해당하는 키워드, 문자열 유사도 알고리즘(Jaro-Winkler similarity)을 활용한 중복 제거)
- 나이브 베이즈 분류 모델을 활용한 사건/사고 구분
-
주변 대피소 검색
- 카카오 지도 api와 서울시 지진 대피소 open api를 활용
- 키워드 검색시 해당 키워드를 상세주소와 장소명 중 하나라도 포함되어있는 데이터들을 마커를 통해 시각화
- 마커 클릭시 면적을 포함한 상세 정보출력
-
내 위치 기반 지역별 실시간 채팅(서울특별시의 구들로 한정)
- 사용자의 위치 정보를 받아와 해당 위치에 가장 가까운 구로 배치
- 비회원일 경우에도 임의의 아이디를 부여 하여 채팅 가능
- 욕성 데이터를 사용하여 욕설 필터링
- 휘발성이기 때문에 DB사용 x
-
구호 물품 교환 및 1:1 채팅
- 재난 상황에서, 유저가 우리 서비스에 더 오래 머무르게 할 수 없을까? 라는 고민에서 비롯된 구호 물품 교환 서비스
- 교환 과정에서 전화번호나 현재 장소 등 민감한 정보도 공유해야 하는 점을 고려하여 일대일로 대화할 수 있는 DM(Direct Message) 기능 도입
- 일회성의 대화가 아닌 점을 감안하여 대화 내역을 DB에 저장
- 채팅은 I/O가 매우 잦기 때문에 중간 단계의 저장소로 레디스를 고려하여 List 자료구조로 채팅을 저장, 서빙
- 유저 입장에서 오래된 기록들은 볼 일이 드물다고 생각되어 매일 새벽 4시에 오래된 채팅 기록들은 메인DB에 이전하도록 스케쥴러 설정
-
구조 요청 서비스
- postgis를 사용하여 내 위치를 저장
- 저장된 내 위치를 기준으로 주변 유저들 탐색
- fcm을 통한 구조 요청 보내기
- 수락한 유저와의 최단 거리 계산
-
재난 상황 실시간 알림
- axios, 역지오코딩을 활용한 실시간 재난 문자 현황 데이터 수집 및 가공
- 주기적으로 재난 문자 발송 현황 데이터를 조회 → 파싱 → 정보 추출 → 지역별 재난 문자 발송 현황을 스트림으로 관리
- 사용자의 위도/경도를 역지오코딩을 통해 ‘지역명’을 추출하여 지역별 스트림을 생성 → 컨슈머 그룹에 사용자 정보를 할당 → 재난 상황 관련 알림을 수신할 지역별 사용자 그룹을 스트림으로 관리
- 서버는 지역별로 새로운 재난 문자가 수신되는지를 모니터링
- 새로운 재난 문자 메세지가 추가됐다면, 해당 지역명과 일치하는 컨슈머 그룹(사용자 그룹)을 조회하여 FCM을 통해 웹 푸시 알림을 전송
Tech | Stack |
---|---|
FE | |
BE CORE | |
BE | |
Environment | |
Co-work |
2024.03.25 ~ in progress
- 2024.04.16 중간 발표
- 2024.05.02 최종 발표
곽지민 | 이경복 | 강영우 |
팀장 | 부팀장 | 팀원 |
github tech blog |
github tech blog |
github tech blog |
조민근 | 오다은 | |
팀원 | 팀원 | |
github tech blog |
github tech blog |
Directory Structure
.
├─public
│ helperLocation.js
│ location.js
│
├─redis
├─src
│ │ app.module.ts
│ │ main.ts
│ │
│ ├─auth
│ │ │ auth.controller.spec.ts
│ │ │ auth.module.ts
│ │ │ auth.service.spec.ts
│ │ │ auth.service.ts
│ │ │
│ │ └─guard
│ │ jwt-auth.guard.ts
│ │ jwt.guard.ts
│ │ jwt.strategy.ts
│ │
│ ├─aws
│ │ aws.module.ts
│ │ aws.service.spec.ts
│ │ aws.service.ts
│ │
│ ├─common
│ │ │ common.module.ts
│ │ │
│ │ ├─config
│ │ │ env.config.ts
│ │ │
│ │ ├─decorator
│ │ │ user.decorator.ts
│ │ │
│ │ ├─entities
│ │ │ base-model.entity.ts
│ │ │ disaster-data.entity.ts
│ │ │ emergency-data.entity.ts
│ │ │ follows.entity.ts
│ │ │ notification-messages.entity.ts
│ │ │ posts.entity.ts
│ │ │ scores.entity.ts
│ │ │ shelters.entity.ts
│ │ │ users.entity.ts
│ │ │
│ │ └─types
│ │ disaster-alert-level.type.ts
│ │ disaster-large-category.type.ts
│ │ disaster-small-category.type.ts
│ │ emergency-alert-level.type.ts
│ │ emergency-large-category.type.ts
│ │ emergency-small-category.type.ts
│ │ notification-messages-category.type.ts
│ │ post-status.type.ts
│ │ user-role.type.ts
│ │
│ ├─crawling
│ │ crawling.module.ts
│ │ news-crawling.service.ts
│ │
│ ├─main
│ ├─mayday
│ │ │ mayday.controller.spec.ts
│ │ │ mayday.controller.ts
│ │ │ mayday.module.ts
│ │ │ mayday.service.spec.ts
│ │ │ mayday.service.ts
│ │ │
│ │ ├─dto
│ │ │ create-mayday.dto.ts
│ │ │ location.dto.ts
│ │ │ update-mayday.dto.ts
│ │ │
│ │ └─entities
│ │ location.entity.ts
│ │ mayday-records.entity.ts
│ │
│ ├─news
│ │ │ news.controller.spec.ts
│ │ │ news.controller.ts
│ │ │ news.module.ts
│ │ │ news.service.spec.ts
│ │ │ news.service.ts
│ │ │
│ │ └─entities
│ │ news.entity.ts
│ │
│ ├─posts
│ │ │ posts.controller.spec.ts
│ │ │ posts.controller.ts
│ │ │ posts.module.ts
│ │ │ posts.service.spec.ts
│ │ │ posts.service.ts
│ │ │
│ │ └─dto
│ │ create-post.dto.ts
│ │ find-post-query.dto.ts
│ │
│ ├─shelters
│ │ │ shelters.controller.spec.ts
│ │ │ shelters.controller.ts
│ │ │ shelters.module.ts
│ │ │ shelters.service.spec.ts
│ │ │ shelters.service.ts
│ │ │
│ │ └─shelters-map
│ │ shelters-map-style.css
│ │ shelters-map.html
│ │
│ ├─users
│ │ │ users.controller.spec.ts
│ │ │ users.controller.ts
│ │ │ users.module.ts
│ │ │ users.service.spec.ts
│ │ │ users.service.ts
│ │ │
│ │ └─dto
│ │ create-user.dto.ts
│ │ login.dto.ts
│ │ update-user.dto.ts
│ │
│ └─utils
│ utils.module.ts
│ utils.service.spec.ts
│ utils.service.ts
│
├─test
│ app.e2e-spec.ts
│ jest-e2e.json
│
└─views
│ discripthandlebars.txt
│
├─layouts
│ main.handlebars
│
├─main
│ index.handlebars
│
└─partials
footer.handlebars
header.handlebars
Env example
#Redis
REDIS_HOST
REDIS_DM_HOST
REDIS_PORT
REDIS_DM_PORT
REDIS_PASSWORD
# JWT
JWT_SECRET_KEY
# bcrypt
PASSWORD_SALT_ROUNDS
# Database_postgreSQL
DB_HOST
DB_PORT
DB_USERNAME
DB_PASSWORD
DB_NAME
DB_SYNC
# AWS S3
AWS_REGION
AWS_S3_ACCESS_KEY_ID
AWS_S3_SECRET_ACCESS_KEY
AWS_S3_BUCKET_NAME
# API KEY
SHELTER_API
REAL_TIME_DATA_API
# 역지오코딩 API KEY
KAKAO_MAP_REST_API_KEY
KAKAO_REST_API_KEY
# 공공데이터 재난문자 현황 API
DISASTER_API_KEY
API_ENDPOINT
# 카카오로그인
KAKAO_LOGIN_REST_API_KEY
# 알림 허용 권한 요청시 필요한 키
# 1. vapidKey
VAPID_PUBLIC_KEY
# 2. Firebase config
FIREBASE_API_KEY
FIREBASE_AUTH_DOMAIN
FIREBASE_PROJECT_ID
FIREBASE_STORAGEBUCKET
FIREBASE_MESSAGING_SENDER_ID
FIREBASE_APP_ID
FIREBASE_MEASUREMENT_ID
# Firebase config
FIREBASE_TYPE
FIREBASE_PROJECT_ID
FIREBASE_PRIVATE_KEY_ID
FIREBASE_PRIVATE_KEY
FIREBASE_CLIENT_EMAIL
FIREBASE_CLIENT_ID
FIREBASE_AUTH_URI
FIREBASE_TOKEN_URI
FIREBASE_AUTH_PROVIDER_X509_CERT_URL
FIREBASE_CLIENT_X509_CERT_URL
GCM_KEY
SUBJECT
VAPID_PRIVATE_KEY
# Notification push and click move url
BASIC_URL
HOST
$ git clone https://github.com/startcoriny/CODE-RED.git
$ cd CODE-RED
$ npm ci
$ npm run start:dev
![]() |
![]() |
---|---|
메인페이지 | 목적지 위험도 조회 |
![]() |
![]() |
크롤링을 이용한 사건/사고 뉴스 수집 | 주변 대피소 검색 |
![]() ![]() |
![]() ![]() |
내 위치 기반 지역별 실시간 채팅 | 구호 물품 교환 및 1:1 채팅 |
유저 도움요청![]() 헬퍼 도움 수락 ![]() 유저 헬퍼 평가 ![]() |
![]() |
구조 요청 서비스 | 재난 상황 실시간 알림 |