WELCOME TO THE PROJECT STORE

카페감수광

제주 카페 리뷰와 위치 데이터를 기반으로 취향에 맞는 카페를 추천하는 서비스

Recommendation2025.05.12 ~ 2025.06.105명완료
ROLE
데이터 수집·전처리·정제 파이프라인 담당
IMPACT
47,190 좌표, 3,950 카페, 22,144 리뷰, 30,336 추천 키워드 정리
PROOF
Kakao 45개 제한 대응, 200m grid + GeoJSON, Selenium retry, KR-SBERT/TF-IDF

IN THE STORE

프로젝트 안내

WHY THIS STORE EXISTS
목적
위치·리뷰 키워드 나열을 넘어, 취향과 탐색 맥락에 맞춘 제주 카페 발견
목표
카카오맵 API · 웹 크롤링 · 한국어 리뷰 키워드 추출 · 추천 API 연결. 지도·키워드·테마·위치 기반 탐색 흐름.
개발 과제
카카오맵 API 응답량 제한, 크롤링 실패, 짧고 반복적인 한국어 리뷰. 추천용 정제 데이터 확보 난이도.
결과
  • FastAPI 데이터 처리 서버와 Spring Boot 서비스 서버 분리
  • 제주도 검색 좌표 47,190개 기준 카페 데이터 수집
  • 카페 3,950개, 리뷰 22,144개 정리
  • 80,601개 원천 키워드 → 30,336개 최종 키워드 정제

IN THE STORE

내가 맡은 일

OWNERSHIP
역할
Data pipeline & recommendation backend
기여도
데이터 수집과 추천 품질 담당. FastAPI 데이터 처리 서버와 Spring Boot 서비스 서버 분리, 리뷰 키워드 추출 파이프라인과 실시간 작업 상태 조회 설계.
구현한 기능
  • 카카오맵 기반 카페 검색과 Selenium 상세 크롤링
  • 카페 목록/상세 조회, 검색, 자동완성, 수정 제안
  • 위치 기반 추천, 키워드 기반 추천, 사용자 정보 기반 맞춤 추천
  • Kiwi 형태소 분석, KR-SBERT 임베딩, TF-IDF 대표 키워드 선정
  • 비동기 크롤링 작업 상태 저장과 진행률 조회
개인 성과
  • 제주 전체 수집 범위의 격자 기반 분할, API 응답 제한 보완
  • 짧은 한국어 리뷰 → 추천 가능한 키워드 데이터 정제 흐름
  • 장기 실행 크롤링 작업의 Redis 상태 저장 분리, 사용자 대기 흐름 감소

IN THE STORE

기술과 선택

TECH & DECISIONS

백엔드

Java 17
Spring Boot 서비스 서버 표준 런타임
Spring Boot 3.4.5
인증, 카페, 추천, 리뷰, 북마크, 피드, 사용자 API의 일관된 제공
Spring Security
이메일 로그인과 JWT 인증 흐름
Spring Batch
수집·정제 데이터 처리 흐름의 배치 작업 분리

AI

Python 3.11 + FastAPI
크롤링·키워드 분석용 Python 데이터 처리 API 분리
KiwiPipy
한국어 리뷰 후보 키워드 추출
KR-SBERT
리뷰 키워드 의미 유사도 임베딩 비교
TF-IDF
클러스터별 대표 키워드 선정

데이터

Spring Data JPA
카페, 리뷰, 사용자, 북마크 도메인의 관계형 모델 관리
MySQL
서비스 도메인의 정형 데이터 저장소
Elasticsearch
카페 검색과 자동완성용 검색 저장소
Selenium
카카오맵 상세 페이지 리뷰 데이터 수집

인프라

Redis
비동기 크롤링과 키워드 분석 작업의 진행 상태 저장
Docker
백엔드와 데이터 처리 서버 실행 환경 재현
AWS S3
이미지와 정적 자산 저장소

테스트

JUnit 5
카페 도메인과 검색·추천 API 회귀 검증

문서화

Swagger
팀원 확인용 백엔드 API 계약 문서화

FastAPI와 Spring Boot 서버 분리

선택
크롤링·키워드 분석은 FastAPI, 인증·카페·추천 서비스 API는 Spring Boot
이유
Python NLP/크롤링 생태계 활용 + 서비스 도메인·인증의 Spring 기반 안정화
대안
Spring 단일 서버에서 Python 프로세스 호출, FastAPI 단일 서버
트레이드오프
런타임 경계·API 계약 관리 비용 증가 vs 데이터 처리/서비스 도메인 책임 명확화
검증
크롤링 서버 단위 테스트와 Spring 도메인 테스트 분리, 실패 범위 확인
주도성
직접 구현/결정

제주 좌표 격자 기반 수집

선택
제주도 좌표 격자 분할, 지역 단위 반복 검색
이유
카카오맵 API 단일 검색 응답량 제한, 전체 카페 일괄 수집 어려움
대안
행정동 키워드 수동 수집, 검색 결과 pagination만 사용
트레이드오프
좌표 생성·중복 제거 비용 증가 vs 누락 가능성 감소
검증
수집 카페 수, 실패 ID 재시도 결과, 중복 제거 후 개수 기록
주도성
직접 구현/결정

키워드 정제 후 추천 데이터로 사용

선택
리뷰 원문 대신 형태소 분석, 임베딩, 클러스터링, TF-IDF 기반 키워드 정제
이유
짧고 반복 표현이 많은 리뷰, 원문 그대로 추천 특징화 어려움
대안
리뷰 전문 임베딩만 사용, 수동 태그 입력
트레이드오프
파이프라인 복잡도 증가 vs 사람이 이해 가능한 추천 근거 키워드 확보
검증
원천/최종 키워드 수, 샘플 카페 대표 키워드 비교
주도성
직접 구현/결정

IN THE STORE

문제를 푼 방식

PROBLEM SOLVING

카카오맵 API 응답량 제한 대응

문제
단일 검색 결과 제한으로 제주 전체 카페 안정 수집 어려움
접근
제주도 행정구역 + 격자 좌표 기준 탐색 범위 분할, 반복 검색
원인
API 검색 반경·응답 개수 제한, 넓은 영역 검색 결과 누락 가능성
해결
200m 격자 + GeoJSON 육지 필터링 기반 검색 좌표, 실패 ID 별도 재시도
결과
47,190개 좌표 탐색, 카페 3,950개와 리뷰 22,144개 수집

한국어 리뷰 키워드 파이프라인 설계

문제
짧고 반복어가 많은 리뷰 원문, 추천 직접 사용 어려움
접근
형태소 분석 → 불용어 필터링 → 임베딩 → 클러스터링 → 대표 키워드 선정
원인
감성 표현과 일반 단어 혼재, 추천 품질 흔들림 가능성
해결
KiwiPipy · KR-SBERT · HDBSCAN · TF-IDF 연결, 추천 가능한 키워드 데이터 정리
결과
80,601개 원천 키워드 → 30,336개 최종 정제 키워드 축소

IN THE STORE

검증 자료

EVIDENCE, NOT DECORATION
Architecture

Architecture

Next.js 클라이언트 → REST API 서버, Python Crawler/NLP 파이프라인과 CafeDocument 동기화 배치, Kakao·지도·임베딩 외부 연동, MySQL·ES(검색·Geo·Vector) 데이터 레이어

ERD

ERD

사용자·카페·리뷰·키워드·메뉴·관심목록과 ES(cafeDocument·keywords·address) 검색 인덱스 구조

카페 데이터

3,950개카카오맵 API와 크롤링으로 정리한 제주 카페 수.

리뷰 데이터

22,144개추천 키워드 추출에 사용한 리뷰 데이터 수.

키워드 정제

80,601개 → 30,336개원천 추출 키워드에서 최종 정제 키워드로 축소.

검색 좌표

47,190개200m 격자와 GeoJSON 육지 필터링 기반 좌표 수.

IN THE STORE

회고

WHAT I LEARNED

배운 점

  • 추천 품질의 선행 조건: 모델보다 입력 데이터 품질과 재현 가능한 수집 절차
  • 장기 실행 크롤링 작업: 동기 API 흐름 분리, 실패·진행률 관리 용이성

아쉬운 점

  • 크롤러 원본 저장소의 대용량 자산 혼재, Git LFS/별도 저장소 전략 지연
  • 추천 품질의 사용자 행동 지표 검증 단계 미연결

다음 개선

  • 크롤링 데이터셋 버전과 재수집 절차 문서화
  • 추천 결과 클릭·북마크 후속 지표 추가, 품질 검증

협업

프론트 노출 방식 기준 추천 API 응답 조정. 키워드, 지도, 북마크 흐름 정합.

IN THE STORE

면접에서 설명할 사례

STAR STORIES

리뷰 데이터를 추천 가능한 키워드로 정제

상황
짧고 반복 표현이 많은 제주 카페 리뷰, 원문 기반 추천 근거화 어려움
행동
형태소 분석 · 불용어 필터링 · 임베딩 · 클러스터링 · TF-IDF 선정 연결
결과
80,601개 원천 키워드 → 30,336개 최종 키워드, 카페 추천용 데이터 형태 정리
배움
AI 추천 기능의 우선순위: 알고리즘 이름보다 데이터 수집·정제·검증 흐름