최신 OpenSSH scp(SFTP 모드)의 'open: no such file' 경로 이슈 회피.
ssh stdin 으로 jar 전송, 배포 전 SSH 접속 체크 추가.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
dev push 시 서버에서 git reset --hard origin/dev + docker compose up -d --build dev-api.
시크릿: DEPLOY_HOST/USER/SSH_KEY/PATH/COMPOSE_FILE/PORT.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Redis 한 인스턴스를 공용할 때 체크인 키(spot:checkin:*) 충돌 방지.
spring.data.redis.database 를 프로파일별로 지정.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
멀티스테이지(JDK 빌드→JRE 런타임), bootJar -x test 로 실행가능 jar 하나 생성.
프로파일/포트는 런타임 env(SPRING_PROFILES_ACTIVE)로 결정 → dev/prod 이미지 공용.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
StatsSeedData 가 통계용 스팟을 먼저 넣어 데모 메이트가 안 보이던 문제.
프론트가 기본 선택하는 min-id 스팟에 콩이·보리 체크인 → 앱 열자마자 확인.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
체크인한 스팟의 활성 강아지(Redis 24h) 중 내 강아지와 사이좋게 지낼 만한
강아지만 Gemini 로 골라 궁합점수·이유와 함께 반환.
GET /api/spots/{id}/ai-mates?dogId=...
- GeminiClient: responseSchema 로 구조화 JSON 강제(gemini-flash-latest)
- MateAiService: 후보 성향/크기로 프롬프트 구성, 후보 밖 dogId(환각) 필터, 점수 내림차순
- application.yml: app.ai.gemini (env GEMINI_API_KEY, 미설정 시 503)
- 키 없이도 컨텍스트/테스트 통과 → CI 안전
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
이 인스턴스는 Gitea → .gitlab-ci.yml 미사용. sb_bt 컨벤션 따라 .gitea/workflows/ci.yaml.
테스트는 H2 인메모리라 서비스 컨테이너 불필요.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SPRING_PROFILES_ACTIVE 로 활성화. local 은 기존 8080 유지.
DB 등 나머지 설정은 application.yml 환경변수 주입을 그대로 사용.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 스팟별 채팅방(/topic/spots/{id}), 전송 /app/spots/{id}/chat, 엔드포인트 /ws
- STOMP CONNECT Bearer 토큰 인증(ChannelInterceptor) → 미인증 전송 무시
- ChatRoom/ChatMessage 도메인, 방 없으면 최초 메시지 시 생성, 발신자 닉네임 포함
- GET /api/chat/spots/{id}/messages 히스토리(보호), 전역 WebSocket 브로커(인메모리)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- GET/POST/PUT/DELETE /api/dogs (로그인 필요, 소유권 검증 → 403)
- GET /api/trait-tags 성향 태그 마스터 (공개)
- Dog-TraitTag 다대다(dog_trait_tags), @EntityGraph 로 지연로딩 예외 방지
- V4 마이그레이션: 성향 태그 시드 / local 시드에 태그+대표견 성향 부여
- /api/dogs/** 인증 인터셉터 보호
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- auth_session 에 'dev-local-token' 시드 (local 프로파일 전용)
- 프론트가 실제 소셜 토큰 없이 로그인→/me→로그아웃 플로우를 로컬 검증 가능
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- password_hash 제거, role/provider 컬럼 반영 (V3 이후 컬럼 불일치로 local 기동 실패하던 문제)
- local 프로파일 기동 및 시드 정상화 확인
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- users: 소셜 전용 전환(password_hash 제거) + role/provider/google_id/apple_id/profile_image (V2 마이그레이션)
- auth_session 테이블: Redis 없이 DB 세션(슬라이딩 만료), Bearer 토큰
- 소셜 로그인: 구글 tokeninfo(aud) · 애플 JWKS(iss/aud/exp) 검증 → 이메일 계정연결/신규가입
- AuthInterceptor(세션)+AdminInterceptor(role=ADMIN) 2단 보호, 관리자 페이지는 웹 전용
- /api/admin/members: 목록·상태·티어·역할·삭제 (본인 잠금방지, 정지/삭제/역할변경 시 세션 무효화)
- 예외는 기존 ApiExceptionHandler로 통합(ApiException 매핑 추가)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- GET /api/spots, POST /{id}/checkins, GET /{id}/mates, GET·POST /{id}/reviews
- Spot/CheckIn/SpotReview 엔티티·서비스 (체크인 2시간 TTL, 만료 비노출)
- CORS 허용(Vite dev, Capacitor iOS/AOS)
- local 프로파일: Postgres 없이 H2로 기동 + 시드 데이터 (연동 검증용)
- V2 마이그레이션: spots 위경도 컬럼 추가, geom NOT NULL 완화
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- POST /api/matches (신청), /{id}/accept·/reject (응답), GET /received/{dogId}
- 티어 가드: PREMIUM 무제한, FREE/AD_FREE 하루 3회 소진 시 429
- 자기신청/중복신청 차단, 전역 예외 핸들러(404/409/400/429)
- Dog/MatchingRequest 엔티티 및 리포지토리, 통합 테스트 4건 추가(총 7건 통과)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- PostgreSQL/PostGIS 초기 스키마(users/dogs/성향태그/스팟/체크인/한줄평/채팅/구독/매칭쿼터)
- 매일 자정(KST) 무료·광고제거 유저 매칭 3회 초기화 스케줄러(벌크 UPDATE, PREMIUM 제외)
- 매칭 소진/차단 서비스 및 통합 테스트(H2) 3건 통과
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>