abb0c6a9f7b8be602991fba6fc279763ad8e3e0e
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
산책갈개 · dognation_BT (Backend)
우리 강아지 성향에 맞는 동네 산책 메이트를 안전하게 찾는 서비스의 백엔드 API.
스택
- Spring Boot 3.3 / Java 17 / Gradle
- PostgreSQL + PostGIS (운영/개발) · H2 (로컬)
- Flyway (스키마 마이그레이션,
validate) - Redis (Lettuce) — 체크인 활성 메이트(24h TTL), 논리 DB로 dev/prod 격리
- STOMP over WebSocket — 실시간 알림/채팅
- Gemini API (
gemini-flash-latest) — AI 궁합 추천
프로파일 · 포트
| 프로파일 | DB | Flyway | 포트 | Redis DB |
|---|---|---|---|---|
local |
H2(create-drop) | 비활성 | 8080 | 3 |
dev |
Postgres | validate+migrate | 9091 | 3 |
prod |
Postgres | validate+migrate | 9090 | 4 |
# 로컬 실행 (H2 + 시드 + dev 로그인 토큰)
SPRING_PROFILES_ACTIVE=local GEMINI_API_KEY=... ./gradlew bootRun
도메인 구조 (domain/)
auth— 소셜 로그인(Apple 네이티브, aud=번들ID) · 세션 토큰user— 회원 · 구독 티어(FREE / AD_FREE / PREMIUM)dog— 강아지 프로필 · 성향 태그(댕비티아이) · 중성화 여부spot— 산책 스팟 · 체크인(Redis+Postgres) · 한줄평 · '자주 오는 견종' 통계 · AI 궁합 추천matching— 매칭 신청/수락/거절 · 쿼터 · 20분 자동만료 · 피드백 알림chat— 매칭 1:1 채팅방affinity— 찰떡지수(우리 1:1 / 동네 1:N) · 산책 후 피드백billing— 구독 ·report— 신고/블랙리스트
배포
- CI = Gitea Actions (
.gitea/workflows/, GitHub Actions 문법) - dev:
devpush → 빌드 → jar를 SSH(cat)로 전송 → 컨테이너 재기동(경로 자가치유) - prod:
mainpush → 동일 방식으로api컨테이너 배포 - 컨테이너는 JRE 이미지에
app.jar를 볼륨 마운트, 호스트 Redis는host.docker.internal
오늘 진행 내역 (2026-07-11 ~ 07-12)
인증
- Apple 로그인(네이티브
@capacitor-community/apple-sign-in) 백엔드 검증 — aud=번들IDkr.sblog.dognation
스팟 · 체크인 · 통계
- 체크인 → Redis(24h TTL, 활성 메이트) + Postgres(통계용) 동시 저장
- 스팟 활성 메이트 조회(본인 강아지 제외)
- '이 시간대 자주 오는 견종' 통계 API — 접속 요일·시간대 기준 체크인 집계
AI 궁합 추천 (Gemini)
- 스팟 활성 강아지 중 내 강아지와 사이좋게 지낼 메이트를 궁합점수·이유와 함께 추천
- 크기/성향 충돌(대형견 무서움 등) 고려, 후보 밖 dogId(환각) 방지
- 중성화 조건 필터(상관없음/완료/안함), 추천 사유 친근한 말투(~해요/~예요)
- 찰떡지수 반영 — 프롬프트에
pastAffinity(우리 호감도)·neighborhood(동네 사교성) 주입
매칭 플로우
- 신청 시 무료 쿼터 차감(FREE/AD_FREE 하루 3회, PREMIUM 무제한), 중복 신청 방지
- 진행중 상태 · 상대에게 STOMP 실시간 알림(
/topic/users/{id}) - 수락 → 1:1 채팅방 생성 + 결과 메시지, 거절 → 불발 알림
- 20분 미수락 자동 만료 스케줄러
찰떡지수 피드백 (신규)
- 산책 후 피드백(잘 놀았어요/안 맞았어요) → 우리 찰떡지수(1:1) GOOD +1 / BAD -2, 동네 찰떡지수(1:N) GOOD +0.5 / BAD -1 (0 미만 차감 없음)
- BAD 사유 수집(성향/간식·장난감/입질·공격성/보호자 매너 + 추가입력)
- 우리 찰떡지수는 매칭 이력 쌍 + 유료회원만 노출(무료는 "유료회원 전용")
- 수락 2시간 후 피드백 요청 알림(
FEEDBACK_REQUEST) 스케줄러 - 마이그레이션
V9__affinity.sql(V8 리포트와 버전 충돌 → V9로 조정)
운영 · 인프라
- 신고(피신고자 관리) + 블랙리스트 + Redis 내성 (
V8__reports_blacklist.sql) - 프로파일 분리(local/dev/prod), 포트 dev=9091 / prod=9090
- Redis 논리 DB 격리(dev=3, prod=4)
- Dockerfile +
.dockerignore, Gitea Actions jar 자동배포(dev/prod), 배포 경로 자가치유 - dev 프로파일 테스트 데이터 시더
프론트엔드: dognation_PT · 관리자: dognation_AT
Description
Languages
Java
99.9%
Dockerfile
0.1%