Trip Planner AI
Completed여행 지역·카테고리·일수를 입력하면 AI가 최적의 일정을 추천해주는 여행 플랫폼
Overview
사용자의 여행 지역, 카테고리, 일수를 기반으로 AI가 최적의 한국 여행 일정을 추천해주는 서비스
Architecture

- trip-core (Spring Boot) — 인증, 여행 계획, 그룹 여행, 커뮤니티, 북마크 등 핵심 비즈니스 로직
- trip-payment (Spring Boot) — Toss Payments 연동, 멱등성 키 기반 결제 처리
- fastapi-server (FastAPI) — K-means 클러스터링 기반 추천
- Frontend — Vercel 배포 (React/Next.js, 별도 레포)
Key Features
- JWT + OAuth2 인증 (Kakao, Naver, Google)
- AI 여행 일정 추천 (K-means)
- 그룹 여행 생성 및 참여
- 여행 코스 탐색 및 리뷰
- 영수증 리뷰 (S3 이미지 업로드)
- Toss 결제 연동 (멱등성 보장)
Problem Solving
이 프로젝트에서 해결한 핵심 문제들:
- 결제 멱등성 설계 — Redis setIfAbsent + DB Idempotency 이중 구조로 단일 장애점 없는 중복 결제 차단
- 결제 유실 방지 — confirm API + PG 웹훅 + Reconciliation 스케줄러 3중 안전망으로 유실률 0% 달성
- 트랜잭션 전파 전략 — NOT_SUPPORTED + REQUIRES_NEW로 외부 PG 호출과 DB 저장을 분리, TempPayment → Payment 전환 패턴으로 결제 유실 구조적 감지
Tech Stack
| Layer | Stack |
|---|---|
| Backend | Java 21, Spring Boot 3.4.3, JPA, QueryDSL |
| AI Engine | Python, FastAPI, scikit-learn, geopy |
| Database | PostgreSQL, Redis |
| Auth | JWT (HS512), Spring Security OAuth2 |
| Storage | AWS S3 |
| Payment | Toss Payments |
Posts
결제 테스트 4단계 — Redis + DB 이중 멱등성과 Reconciliation으로 완전한 안전망
Redis + DB 이중 멱등성, 외부 PG 직접 조회 폴백, Reconciliation 스케줄러까지 — 어떤 장애 상황에서도 결제가 유실되지 않는 구조를 테스트로 검증한다.
결제 테스트 3단계 — PG 승인 후 DB 저장 실패, Webhook이 살릴 수 있는가
PG 승인은 성공했지만 DB 저장을 의도적으로 스킵한 뒤, PG Webhook이 결제를 복구하는 과정을 테스트로 검증한다.
결제 테스트 2단계 — Redis 멱등성은 동작하지만, Redis가 죽으면?
Redis setIfAbsent로 동시 결제를 차단하는 데 성공했지만, Redis 장애 시 멱등성이 뚫리는 SPOF 문제를 테스트로 증명한다.
결제 테스트 1단계 — 멱등성 없이 100개의 스레드 동시 결제, 무슨 일이 벌어지는가
멱등성 보호 없이 100개의 동시 결제 요청을 보내면 PG에는 100건, 실제 DB에는 1건만 저장되는 데이터 불일치를 테스트로 증명한다.