team project

KickEat

취향과 위치를 기반으로 서울시 음식점을 추천하는 맛집 탐색 서비스

2025.02GitHub ↗
메인
메인

01개요

서울시 공공데이터의 음식점 정보를 기반으로, 사용자가 고른 음식 취향과 등록한 주소를 조합해 음식점을 추천합니다. 공공데이터에 없는 메뉴·사진 정보는 카카오맵 API와 크롤링으로 보완했고, 리뷰·찜·게시판 등 커뮤니티 기능을 함께 제공합니다.

02기술 스택

Frontend
ReactReact RouterTanStack Querystyled-componentsCKEditor 5Chart.js
Backend
Spring BootSpring Data JPA
DB
MySQL
Data / API
서울시 공공데이터Kakao Maps SDK (Places)Selenium (Headless Chrome)Daum 우편번호

03데이터 수집 구조

서울시 공공데이터
약 12만 개 음식점 · 위치 · 카테고리
Kakao Places 검색
상호명 → 카카오맵 장소 ID
Selenium 크롤링
메뉴 · 사진 · 영업 정보
카카오맵 API + Selenium
카카오맵 API + Selenium

04주요 기능

맛집 추천

  • 선호 음식을 카트에 담으면 회원 주소와 선택한 카테고리로 음식점 추천
  • 갱신 버튼으로 다른 추천 받기, 주소 검색으로 다른 지역 기준 추천

음식점 찾기 · 상세

  • 상세 카테고리 + 검색어 검색, 조회순·평점순·리뷰순·찜순 정렬, 찜 등록
  • 카카오맵에서 수집한 메뉴·사진·영업 정보, 회원 주소와의 거리, 리뷰 작성·조회

커뮤니티

  • 자유게시판: 관리자 공지 상단 고정(2개), 댓글, 제목·내용 검색
  • 이벤트 게시판, 1:1 문의, 쪽지·신고, 마이페이지
맛집 추천
맛집 추천
음식점 찾기
음식점 찾기
음식점 상세
음식점 상세

05DB 설계

ERD
ERD

06트러블슈팅

공공데이터만으로는 메뉴 · 사진 정보가 없음

문제
서울시 공공데이터의 약 12만 개 음식점 정보는 위치·카테고리·상호명 정도만 제공
원인
상세 페이지에 필요한 메뉴·사진·영업시간은 공공데이터에 존재하지 않음
해결
상호명으로 Kakao Places 키워드 검색을 해 카카오맵 장소 ID를 얻고, 서버에서 Selenium(Headless Chrome)으로 해당 장소 페이지를 크롤링해 상세 정보를 채움

07회고

  • 상세 페이지 요청마다 Headless Chrome을 띄워 크롤링하는 구조라 응답이 느림 — 수집 결과를 DB에 캐싱하거나 배치로 미리 수집하는 방식이 적합
  • 외부 사이트 구조에 의존하는 크롤링은 페이지가 바뀌면 바로 깨짐 — 실패 시 기본 정보만 보여주는 대체 처리 필요
Gunmo Lee