공공기관이 찾는 로컬 찐 맛집! “공기밥”
공공기관의 업무추진비 데이터를 활용해 해당 지역의 맛집 정보를 제공하는 서비스
(삼성 청년SW아카데미 자율 프로젝트 🏆우수상🏆)
배포 주소 : https://gonggibap.co.kr
SSAFY 11th 자율 PJT
개발기간: 24.10.14 ~ 24.11.21 (6주)
인터넷에 소개되는 맛집들은 대부분 광고, 홍보인 경우가 잦아 조사 결과 소비자의 피로도가 증가하고 있었습니다. 따라서 광고, 협찬 없는 진짜 로컬 맛집을 제공하고자 하였고, 이를 위해 공공기관의 업무추진비 데이터를 활용하기로 기획하였습니다.
AS-IS
- 바이럴 마케팅으로 인한 정확한 정보 획득 어려움
- 소비자의 피로도 증가
- 로컬 맛집에 대한 수요
TO-BE
- 공공기관이 인증한 로컬 맛집 정보 제공
- 소비자의 만족도 향상
- 로컬 맛집 플랫폼으로의 성장
- 인터넷의 바이럴 마케팅에 피로감을 느끼는 사람
- 실제 로컬 찐 맛집을 찾고자 하는 사람
- 공기밥은 업무추진비 데이터를 활용해 추출한 맛집을 지도를 통해 보여줍니다.
- 마커 : 실제 위치를 확인할 수 있습니다.
- 클러스터링 : 인접한 데이터를 그룹화 하여 요약
- 음식점, 카페, 술집과 한식, 중식 등 카테고리별로 지도 데이터를 수정할 수 있습니다.
- 실제 업무추진비로 사용된 내역을 제공하여 사용자가 데이터를 직접 확인하고 믿을 수 있게 하였습니다.
- 블로그 API를 통해 해당 맛집의 사용자 리뷰도 확인할 수 있습니다.
- 사이트 내의 리뷰 서비스를 제공하고 있으며, 점수와 사진을 등록할 수 있습니다. 이때 유익한 리뷰의 사진 중 하나는 썸네일 사진으로 업데이트 됩니다.
- 카카오맵 웹에서 공기밥 서비스가 인증한 맛집을 표시하는 확장프로그램 제공합니다.
- 크롬 익스텐션 스토어에서 익스텐션을 설치할 수 있습니다.
- 맛집 공유하기 : 공유 링크를 복사하여 카카오톡에 전송하면 해당 맛집의 썸네일 사진이 나오도록 구현하였습니다.
- 관심 맛집 : 로그인 이후 "내 지도에 추가하기" 버튼을 클릭시 나만의 맛집여지도를 만들 수 있습니다.
- 다크 모드 : 사용자는 라이트모드/다크모드 를 선택하여 UI를 업데이트 할 수 있습니다.
- 모바일 UI : 사용자는 서비스를 모바일 UI로도 이용할 수 있습니다. 이때, 제스처 기능 또한 제공됩니다.
공간 데이터는 위치 정보를 저장할 수 있는 데이터 타입입니다.
MySQL은 다음과 같은 공간 데이터 타입과 함수들을 지원하여 효율적인 데이터 조회를 가능하게 합니다.
- 공간 데이터 타입:
Point,Polygon등 - 공간 함수:
ST_Contains,ST_Distance등
SELECT *
FROM restaurant
WHERE latitude BETWEEN 37.560997 AND 37.568698
AND longitude BETWEEN 126.994728 AND 127.006782;- BETWEEN 조건을 활용하면 DB에 식당의 수가 1,000,000개가 존재한다면 이를 모두 검색하는 FULL SCAN 방식으로 식당 데이터가 늘어난다면 조회 성능 저하가 발생한다.
- 기존의 latitude, longitude 두 개의 Decimal 타입 필드를 하나의 Point 타입 필드로 변경할 수 있습니다.
- MySQL은 Point와 같은 공간 데이터 타입에서 공간 함수를 사용할 수 있습니다. BETWEEN 조건 대신 **공간 함수(ST_Contains)를 사용해 특정 범위 내 식당을 조회할 수 있습니다.
- 공간 데이터 타입은 공간(SPATIAL) 인덱스를 적용해 FULL SCAN 방식 보다 조회 성능
- Route 53
- 역할: 사용자 요청을 최초에 처리하는 DNS 서비스
- 기능: 트래픽을 WAF로 라우팅
- AWS WAF
- 역할: 서비스의 악의적인 요청을 필터링.
- 기능: SQL Injection, XSS 같은 보안 위협을 방지하고 악성 트래픽을 차단함
- Application Load Balancer (ALB)
- 역할: 사용자 트래픽을 EC2 인스턴스에 분산하고 장애 발생 시 스탠바이 인스턴스로 라우팅
- 기능: Auto Scaling Group 내의 백엔드 인스턴스로 요청 전달.
- Private Subnet
- 구성:
- Backend & Extension:
- Auto Scaling Group으로 주요 애플리케이션 로직 처리
- Standby Instance:
- 장애 발생 시 대체 역할
- Aurora Database:
- 데이터 저장소로 Write 작업은 Primary, Read 작업은 Read Replica에서 처리
- Backend & Extension:
- 구성:
- 고가용성:
- Auto Scaling Group과 Multi-AZ 구성을 통해 장애를 최소화
- 보안 강화:
- WAF로 외부 트래픽 필터링, EC2, Aurora와 같은 민감한 리소스는 Private Subnet에 배치
- 확장성:
- 트래픽 변화에 따라 인스턴스를 동적으로 확장/축소
- 최적화:
- Read Replica를 활용하여 데이터베이스 성능 향상
- 클라이언트 → Route 53 → WAF → ALB
- ALB → Private Subnet의 Backend/Extension
- 데이터 요청 → Aurora Database (Write: Primary, Read: Replica)
다음과 같은 흐름으로 업무추진비 데이터를 수집
- 각각의 구청에서 업무추진비가 공개되어 있음
- 예시 사이트 : 서울특별시 중구 업무추진비
- 업무추진비에서 수집되는 대부분의 데이터는 pdf, Excel파일 형식이어서 python 라이브러리인
pandas및pdfplumber를 활용하여 excel파일 및 pdf파일을 각각 csv파일로 형식 변환
- 많은 수의 식당을 일일히 수작업으로 하기는 현실적으로 힘드므로 OpenAI API를 활용해 전처리 자동화
- 사용 모델 : GPT 4o-mini
- 식당 정보(업종, 전화번호 등), 위경도 등 추가적인 데이터를 수집하기 위해 Kakao Map API 활용
- 최종적으로 식당 21,150곳, 사용내역 163,736건 수집
- 공기밥 Extension은 공기밥 서비스에서 제공하는 맛집 정보를 카카오맵에서 조회하기 편하게 익스텐션 개발
- 카카오맵에서 맛집 검색 시 나오는 공기밥 이모티콘을 클릭하거나 맛집 상세페이지에서 팝업으로 등장하는
공기밥에서 방문 횟수 확인하기클릭 시 공기밥 서비스로 접속 가능하여 서비스의 접근성 향상 및 유입 유저수 증가
여러 홍보 수단을 사용해 해당 서비스의 프로모션을 진행한 모습
실제로 링크드인 게시물 게시 이후에는 트래픽이 꽤 많이 발생하였음
다양한 프로모션 이후에 실제 트래픽이 발생하여
MAU는330명을 달성하였으며, 재방문자 수는47명을 달성하였음
해당 트래픽을 분석한 결과 모바일의 비중이 높은 것을 확인하였음
이후 모바일 UI를 출시하는 등 계속해서 사용자 경험을 향상시켰음
저희 팀은 함께 성장하는 문화를 지향하여 프로젝트를 진행했습니다. 프로젝트를 진행하는 동안 배운 기술과 관심사를 서로 공유하며 개인의 성장 뿐만이 아니라 팀의 성장을 유도하였습니다.
- 다양한 주제를 다루는 기술 세미나를 격주마다 진행하여 팀원 간의 기술적 이해도를 향상시켰습니다.
- 질문과 토론을 통해 서로 다른 포지션의 팀원들도 시야를 확장할 수 있었고, 함께 성장하는 발판이 되었습니다.
세미나 주제
- 자바의 멀티쓰레드
- 데이터베이스 샤딩
- 공간 인덱싱
- RAG 성능 향상 기법
- 컨테이너 가상화 기술과 도커
- MSA vs Monolithic 아키텍처
| 공기밥 웹 서비스 | 공기밥 Chrome 익스텐션 |
|---|---|
![]() |
![]() |
| 🔗 사이트 방문하기 | 🔗 익스텐션 설치하기 |
| BackEnd | BackEnd | Infra | Infra |
|---|---|---|---|
| 고민호 | 박선홍 | 손지석 | 남보우 |
| FrontEnd | FrontEnd | 기획 |
|---|---|---|
| 이명욱 | 임준희 | 박준엽 |









































