EatDa는 디지털 마케팅에 어려움을 겪는 고령 소상공인과 자영업자를 위한 AI 기반 위치 기반 로컬 커뮤니티 서비스입니다.
- AI 자동 홍보물 생성: 리뷰 기반 숏폼 영상, 메뉴 포스터, 이벤트 배너를 AI가 자동으로 생성
- 마케팅 비용 절감: 높은 홍보 비용과 전문 인력 부담 해결
- 간편한 관리: 복잡한 디지털 마케팅 도구 없이 쉽게 가게 홍보
- 위치 기반 탐색: 내 주변 가게의 실제 음식 사진과 생생한 리뷰를 SNS 피드처럼 탐색
- 통합된 정보: 여러 플랫폼에 흩어진 리뷰와 이벤트 정보를 한눈에
- 숨은 맛집 발견: 마케팅 부족으로 알려지지 않은 진짜 맛집 발굴
- 참여형 콘텐츠: 메뉴판 프레임 제작 경쟁, 리워드 제공
- 지역 상권 활성화: 사용자 참여를 통한 지역 경제 기여
| 항목 | 기존 플랫폼 | EatDa |
|---|---|---|
| 콘텐츠 구조 | 리스트·별점 중심 | 이미지 + 숏폼 중심 SNS 피드 |
| 리뷰 탐색 | 별점 + 텍스트 | 위치 기반 주변 리뷰 통합 탐색 |
| 홍보 지원 | 사장님 직접 제작 | AI 자동 생성 (숏폼/포스터/배너) |
| 위치 탐색 | 주소 검색 중심 | H3 기반 거리순 실시간 탐색 |
| 이벤트 정보 | 가게별 페이지만 노출 | 내 주변 이벤트 한눈에 모아보기 |
| 유저 참여 | 리뷰·댓글 작성 | 메뉴판 제작 경쟁 + 리워드 |
- 고령 자영업자 증가: 디지털 활용 격차 심화
- 마케팅 실패로 인한 폐업: 개인 대응 가능 영역에서 마케팅 실패가 최대 비중
- 높은 홍보 비용: 광고, 콘텐츠 제작, 웹사이트 관리 비용 부담
- 전문 인력 확보 어려움: 디자이너/마케터 고용 비용 부담
- 음식 사진과 리뷰를 한눈에 보기 어려움: 단순 주소/별점 리스트가 아닌 직관적 선택 필요
- 위치 기반 탐색 미흡: 내 위치 주변 매장 탐색 기능 부족
- 리뷰 정보 분산: 여러 플랫폼에 흩어진 텍스트 중심 리뷰
- 이벤트 정보 접근 어려움: 포털, SNS, 배달앱 등에 분산된 할인 정보
- 숨은 맛집 아쉬움: 홍보 부족으로 외면받는 좋은 가게들
위치 기반 로컬 커뮤니티 서비스
소비자는 내 주변 가게의 이벤트와 실사용 리뷰를 SNS 피드처럼 쉽게 탐색하고,
사장님은 AI를 활용해 본인의 사업장을 홍보할 여러 방안을 간편하게 제작·관리할 수 있는 플랫폼
✅ 인스타그램의 이미지 피드
✅ 배민의 리뷰 시스템
✅ 당근마켓의 내 주변 위치 기반 탐색
→ 위치 기반 + 커뮤니티 중심 + AI 홍보 자동화 실현
React Native + TypeScript
- 대규모 커뮤니티 생태계 기반 안정성
- 네이티브 컴포넌트 접근으로 성능 최적화
- 정적 타입 시스템으로 런타임 오류 사전 방지
Spring Boot (정형 API) + FastAPI (AI 서비스)
- Spring Boot: 서비스 중심 정형 API, 엔터프라이즈 패턴
- FastAPI: 비동기 I/O 기반 AI 모델 연동 전용
MySQL (메인) + Redis (보조)
- MySQL: 관계형 데이터, ACID 트랜잭션
- Redis: 세션/캐시/Redis Streams (메시징 큐)
- Luma AI & RunwayML Gen-4: 숏폼 비디오 생성
- GPT-4o: 프롬프트 엔지니어링
- NAVER CLOVA OCR: 영수증 인증
- Stable Diffusion 3: 이미지 생성 (LoRA Fine-tuning)
- AWS EC2 (xlarge): 단일 서버 (4vCPU / 16GB RAM)
- Docker + Nginx: 컨테이너 분리, Reverse Proxy
- Prometheus + Grafana: 메트릭 수집 및 시각화
- 모든 서비스를 1대 인스턴스에 설치
- 고가용성/오토스케일링 불가
- 모놀리식/모듈러 모놀리식 구조 채택
- Docker 기반 경량화 설계 필수
┌─────────────┐
│ React Native│
│ Client │
└──────┬──────┘
│
▼
┌─────────────────────────────────────┐
│ Nginx (Reverse Proxy) │
└──────┬──────────────────────┬───────┘
│ │
▼ ▼
┌─────────────┐ ┌──────────────┐
│ Spring │◄─────┤ FastAPI │
│ Boot │ │ (AI Service)│
└──────┬──────┘ └──────────────┘
│
├──────────────┐
▼ ▼
┌─────────┐ ┌────────────┐
│ MySQL │ │ Redis │
└─────────┘ │ Streams │
│ + Cache │
└────────────┘
무중단 배포를 위한 Blue-Green 전략 적용
L1 캐시 (Caffeine)
- JVM 힙 메모리 내부
- 핫스팟 데이터만 저장 (최대 100개)
- TTL: 60분
- 초고속 응답 (1ms)
L2 캐시 (Redis)
- 외부 공유 캐시
- 전체 데이터 저장
- 분산 환경 캐시 일관성 유지
사용자 요청 → L1 확인 → L2 확인 → MySQL 조회
↓ Hit ↓ Hit ↓
응답 L1 승격 캐시 갱신
적용 대상
review.asset.generate: 리뷰 숏폼/이미지 생성menu.poster.generate: 메뉴 포스터 생성event.asset.generate: 이벤트 배너 생성
특징
- Consumer Group 기반 메시지 소비
- 실패 시 최대 3회 재시도
- DLQ(Dead Letter Queue) 처리
- TTL 기반 메시지 만료 (리뷰: 5분)
- Spring Batch로 20분마다 만료 메시지 정리
H3 공간 인덱싱 + 멀티 레벨 캐싱
- 육각형 셀 구조: 삼각형/사각형보다 균일한 거리 계산
- 거리별 해상도 설정: 300m, 500m, 700m, 1km, 2km
- 효율적인 필터링: 1차 H3 필터 → 2차 정밀 거리 계산
- 1시간 동안 임계값 이상 조회 → 핫스팟 지정
- 핫스팟 데이터 → L1 캐시 승격
- CPU/메모리 사용률 기반 동적 임계값 조정
리뷰 기반 숏폼/이미지 생성
메뉴 포스터 생성
- 한국어 텍스트 렌더링 특화 학습
- rank=8, alpha=16, lora_dropout=0.05
- 텍스트 인코더 동결 + VRAM 최적화
- 사용자가 메뉴판 프레임 제작
- 다른 사용자 투표
- 가게 사장님 채택 시 제작자 리워드
이벤트 배너 생성
- 이벤트 정보 입력 (제목/기간/할인율)
- AI 자동 배너 이미지 생성
- Redis Streams 비동기 처리
NAVER CLOVA OCR
- 한글 인식 최고 수준 (한국어 특화)
- 영수증 주소/날짜 정보 추출
- 실제 방문 검증 → 리뷰 작성 권한 부여
1. 캐시 무효화 전략 최적화
- 사전 계산된 거리 정보 캐싱
- 가게 등록 시 신규 가게가 캐시에 반영 안 됨
- 실시간 거리 계산은 O(n) 복잡도로 지연
1) H3 공간 인덱싱
- 거리별 해상도 설정 → 1차 필터링
- 육각형 셀: 균일한 거리, 적은 인접 셀
2) 핫스팟 + 캐시 상태
- Fresh: DB 일치 캐시
- Stale: 비동기 갱신 필요
- 핫스팟 + Stale → 비동기 갱신 + 즉시 응답
3) 계층적 캐시
- L1 (Caffeine): 핫스팟만, 60분 TTL
- L2 (Redis): 전체 데이터
4) 동적 임계값 조정
- CPU 80%↑ → 핫스팟 범위 확대 (50회/1h)
- CPU 30%↓ → 핫스팟 범위 축소 (200회/1h)
- 메모리 85%↑ → TTL 감소 (최소 5분)
- Cache hit 70%↓ → TTL 증가 (최대 60분)
2. Redis Streams 도입
- AI 생성 처리 시간 길어 비동기 필수
- 직접 비동기: 요청 손실, 과부하, 장애 전파 위험
- Producer/Consumer 분리
- 재시도, 백프레셔, 느슨한 결합
- RabbitMQ: 단일 EC2라 브로커 부담
- Redis Queue: 재처리/순서/DLQ 없음
- Redis Streams: 재처리·순서·DLQ 표준 지원
- 3가지 스트림: 리뷰/메뉴포스터/이벤트
- Consumer Group 소비
- 실패 시 최대 3회 재시도 → DLQ
- MAXLEN 2000개 제한
- TTL 기반 만료 (리뷰: 5분)
- Spring Batch 20분마다 정리
3. SD3 Fine-tuning 최적화
한국어 텍스트 렌더링 특화 LoRA 파인튜닝
1) 데이터 로더 병목 & RAM 폭증
- 원인: 전체 경로 리스트업, random.sample(50000)
- 해결: Manifest 스트리밍, IterableDataset
2) 체크포인트 불일치 → NaN/품질 저하
- 원인: LoRA rank/alpha 과도
- 해결: rank=8, alpha=16, lora_dropout=0.05
3) VRAM 한계
- 텍스트 인코더 동결 → VRAM 절감
- LoRA 필요 시점만 attach
- 임베딩 CPU 계산 → GPU는 U-Net 집중
4. 프롬프트 엔지니어링 5단계 진화
❌ 일관성 부족, 할루시네이션
✅ 품질 향상
❌ 과적합, 동일 답변 반복
- 5가지 항목 체크 (주제/행동/장면/스타일/카메라)
- 최대 3회 재생성 ❌ 주관적 지표, 품질 개선 미흡
- Checklist + LLM 점수 평균
- 부분/전체 재생성 분기 ❌ 시간 소요 증가
- 고득점 프롬프트 전/후 기록 ✅ 향후 SFT 미세튜닝용 데이터 확보 ✅ 생성 시간 단축 가능성
주요 테이블 구조
-- 사용자
CREATE TABLE user (
id BIGINT PRIMARY KEY,
email VARCHAR(255) UNIQUE,
nick_name VARCHAR(50) UNIQUE,
role VARCHAR(20) COMMENT 'EATER or MAKER',
provider VARCHAR(20) COMMENT 'GOOGLE, KAKAO'
);
-- 가게
CREATE TABLE store (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
address VARCHAR(255),
latitude DOUBLE,
longitude DOUBLE,
h3_index7 BIGINT,
h3_index8 BIGINT,
h3_index9 BIGINT,
h3_index10 BIGINT,
maker_id BIGINT,
FOREIGN KEY (maker_id) REFERENCES user(id)
);
-- 리뷰
CREATE TABLE review (
id BIGINT PRIMARY KEY,
user_id BIGINT,
store_id BIGINT,
description TEXT,
status ENUM('PENDING', 'SUCCESS', 'FAIL'),
FOREIGN KEY (user_id) REFERENCES user(id),
FOREIGN KEY (store_id) REFERENCES store(id)
);
-- AI 생성 자산
CREATE TABLE review_asset (
id BIGINT PRIMARY KEY,
review_id BIGINT UNIQUE,
type VARCHAR(20) COMMENT 'SHORTS or IMAGE',
image_url TEXT,
shorts_url TEXT,
prompt TEXT,
status ENUM('PENDING', 'SUCCESS', 'FAIL'),
FOREIGN KEY (review_id) REFERENCES review(id)
);| 역할 | 이름 | GitHub |
|---|---|---|
| 팀장 / Infra | 백제완 | @jewan100 |
| BE | 김건학 | @Gonagi |
| BE | 한종욱 | @Ukj0ng |
| FE | 양세희 | @sehee-xx |
| FE | 이종현 | @Maoka2 |
| AI | 최상인 | @sangin302 |
이 프로젝트는 MIT 라이선스 하에 배포됩니다.

















































