발표 자료 종합 - pop-pin/wiki GitHub Wiki

동기

기존 지도 서비스들의 Visualization을 개선하고 유동인구로 확장해 2022년 할로윈의 사고와 같은 일을 예방하기 위한 프로젝트이며, 다음과 같은 개선사항을 진행하고자 했다:

유동인구 시각화

지역특색 시각화

기존 지도 앱들의 서비스 개선 - 가중치 평점

위와 같은 기능들을 구현하기 위해 다양한 출처의 빅데이터를 알고리즘을 엄선하여 수집, 활용했다.

빅데이터

유동인구

거리 유동인구에 대한 데이터가 한정되어 있어 국가에서 제공하는 공공데이터를 최대한 활용하여 시간대별 대중교통 승하차 데이터를 수집하여 활용했다. 더 최근의 데이터, 같은 요일, 공휴일의 유무를 기준으로 하여 가중치를 부여했다.

(발표땐 원래 머신러닝 하려고 했는데 한명이 그만둬서 급하게 가중치를 임의로 부여했다고 설명 예정)

크롤링 - 김대훈(추가 할 것)

2.3.1.b

polygon 가로, 세로의 최소/최대 좌표를 구함

x, y좌표 각각 일정 간격으로 나눔

각 좌표마다 API를 subprocess로 호출하여 프로세스를 분리 → 속도가 코어 갯수 만큼 향상(파이썬은 기본 1코어)

2.3.1.c

저장되어있는 항목 : idx(순서), name, API_KEY, count(남은 갯수)

count가 0초과이고 idx가 가장 빠른 API key를 호출

count를 1감소 해당 API_KEY의 지정된 횟수를 모두 사용하면 해당 API_KEY를 사용하지 못하게 방지하여 과금 방지 및 자동으로 키를 교체할 수 있음

시각화 - 양다인

백엔드 - 문희상

2.3.1 OAuth2.0 로그인 및 JWT 토큰

회원가입과 같은 불필요한 절차를 줄여 사용자의 편의를 높이기 위해 OAuth2.0 기반의 로그인 시스템을 구현했습니다. 또한 JWT토큰을 엑세스 토큰과 리프세쉬 토큰으로 나눠서 발급해 보안처리를 하였습니다.

 

2.3.2 마이크로서비스 및 API Gateway

서비스의 확장성과 관리 용이성을 위해 마이크로서비스 아키텍처를 채택하였습니다. 또한 API Gateway를 통해 요청이 들어올 때 필터를 통한 토큰의 유효성 검사를 진행하는 등 여러 마이크로서비스의 설정을 용이하게 하기 위해 사용하였습니다.

 

2.3.3 Aggregate 프레임워크

크롤링을 통해 MongoDB에 저장된 데이터를 Aggregate 프레임워크를 사용하여 서울시의 구별로 데이터를 분리하여 평균 평점을 계산하는 등의 서비스 로직을 구현하는데 사용하였습니다.

2.3.4 Redis를 통한 성능 향상

사용자가 특정한 가게에 좋아요를 누르는 상황에서 Redis를 사용하여 사용자 경험을 크게 향상시키고자 하였습니다. 또한 데이터의 무결성을 보장하기 위해 주기적으로 데이터베이스로 동기화하는 기능도 구현하였습니다.

배포

Kubernetes에 MongoDB, Redis, ELK Stack, Grafana 등 다양한 오픈소스를 활용하여 실제 Production 환경 구축

Kubernetes

ArgoCD를 통해 GitOps를 적용하여 하나의 소스에서 클러스터의 상태를 통제한다.

클러스터 내부의 네트워크 라우팅을 iptables가 아닌 IPVS를 활용하여 불필요한 chain을 없애 클러스터 내 통신 최적화

Prometheus을 활용하여 클러스터 내부의 Node 및 Daemon 모니터링

Microservice 및 Crawling Batch Job을 운영중, 클러스터 내에서 Blue-Green Deployment 및 Cron Workflow 통제