기술 스택
시스템 구성 (3-Tier)
Client (Next.js)
└─ 위치 권한 획득, Kakao Map SDK 렌더링
└─ GPS 좌표는 서버 미전송 → 클라이언트에서 Kakao Local API 직접 호출
API Server (Spring Boot 3.5)
└─ RESTful JSON API
└─ 사주 계산 엔진 연동, 기운 분석, 궁합 계산
Database
└─ MySQL 8.0 — 영구 저장
└─ Caffeine — 인프로세스 캐시 (장소 키워드 24h TTL)
External APIs
└─ Ablecity API — 사주 8자 계산, 일별 기운 점수
└─ OpenAI API — LLM 기반 인사이트 생성 (gpt-4o-mini)
└─ Kakao OAuth2 — 소셜 로그인
Infrastructure
└─ AWS EC2 (애플리케이션 서버)
└─ AWS S3 (정적 리소스, 일별 로그 업로드)
└─ Docker Compose — 애플리케이션·DB 컨테이너 구성
└─ GitHub Actions — CI/CD 파이프라인
스택 상세
서버
| 항목 | 내용 |
|---|---|
| 언어 | Java 17 |
| 프레임워크 | Spring Boot 3.5.x |
| 빌드 도구 | Gradle |
| ORM | Spring Data JPA (Hibernate) |
| 보안 | Spring Security + JWT |
데이터베이스
| 항목 | 내용 |
|---|---|
| 주 DB | MySQL 8.0 |
| 인프로세스 캐시 | Caffeine (24h TTL, 최대 10,000 엔트리) |
외부 API 연동
| 서비스 | 용도 |
|---|---|
| Ablecity | 사주 8자 계산·일별 기운 점수 |
| OpenAI | 일별 인사이트·장소 키워드·음식 추천 생성 |
| Kakao OAuth2 | 소셜 로그인 (인가코드 → JWT 발급) |
| Kakao 알림톡 | 커뮤니티 참가 확인 발송 |
장애 대응
| 항목 | 내용 |
|---|---|
| 재시도 | Spring Retry — 지수 백오프(Exponential Backoff) 적용 |
| 서킷브레이커 | Resilience4j — 실패율 임계치 기반 OPEN/HALF-OPEN/CLOSED 전환 |
Ablecity(사주 엔진)에만 재시도 + 서킷브레이커를 이중 적용합니다. OpenAI는 비용 이슈로 재시도 없음, Kakao는 인가코드 1회성이므로 재시도 없음.
인프라
| 항목 | 내용 |
|---|---|
| 서버 | AWS EC2 |
| 스토리지 | AWS S3 (정적 리소스·로그) |
| 컨테이너 | Docker Compose (app + db) |
| CI/CD | GitHub Actions (push → 빌드 → 테스트 → Docker 빌드 → EC2 배포) |
스케일아웃 시 전환 계획
현재 단일 인스턴스 MVP 기준. 인스턴스 2대 이상으로 확장 시 Redis 전환이 필요한 항목입니다.
| 기능 | 현재 | 전환 시 | 우선순위 |
|---|---|---|---|
| 장소 키워드 캐시 | Caffeine | Redis | 1순위 — 캐시 설정 교체만으로 가능 |
| Refresh Token 저장 | MySQL | Redis | 1순위 — 보안·성능 모두 Redis 적합 |
| Rate Limiting | 미구현 | Redis sliding window | 2순위 |
| 비동기 콜백 대기 | 인프로세스 | Redis Pub/Sub | 3순위 — 스케일아웃 시 콜백 유실 위험 |