POP-SPOT v2.36 (2/8) — 드롭다운 문구를 실제 이동처와 맞춤 — 모달에선 "상세 보기"
v2.36 변경 기록의 이어지는 부분이다. 같은 검증 ID 590e20db98242f22e4a45da12224890db871396b7f34af4a61b4afe6a190865c를 사용한다.
커밋 0de1714 — feat(SEO): 브랜드·IP·장소별 팝업 랜딩페이지 (구글 트렌드 기반)변경 파일 2개
파일 3. popspot-frontend/app/sitemap.ts
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-frontend/src/lib/popupSlices.ts
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 b7c9109 — feat(방문통계): 봇 User-Agent 필터 + 오늘 방문 경로 진단(어드민)변경 파일 5개
쉬운 설명: 봇 User-Agent 필터 + 오늘 방문 경로 진단(어드민) 작업이다.
바꾼 이유: - 봇 제외: /api/visits 가 요청 User-Agent 를 검사해 검색엔진 크롤러(Googlebot/Yeti/Daumoa 등)·헤드리스· Lighthouse·HTTP 클라이언트(python/curl/okhttp 등)·UA 없는 스크립트는 기록하지 않는다. 봇이 JS 로 비콘을 쏴 방문자 수를 뻥튀기하던 문제 해결. - 오늘 방문 경로: AdminVisitController GET /api/admin/visits/today-paths + VisitService.getTodayPaths (VisitLogRepository.pathBreakdownSince) — 경로별 총 뷰 · 회원 뷰 · 게스트/봇 뷰. - 어드민 방문통계 탭에 '오늘 방문 경로' 카드: 경로마다 회원/게스트 배지로 표시 → 방문이 본인(로그인)인지 외부·검색인지 즉시 진단. (/login·/admin·/oauth 회원=본인, /popups 게스트=외부 유입) - 배포: 프론트 자동. 봇 필터·today-paths 동작은 백엔드 배포 후.
파일 수: 5개이다.
파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/AdminVisitController.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-backend/src/main/java/com/example/popspotbackend/controller/VisitController.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-backend/src/main/java/com/example/popspotbackend/repository/VisitLogRepository.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-backend/src/main/java/com/example/popspotbackend/service/VisitService.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 5. popspot-frontend/app/admin/page.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 252df88 — feat(방문자): 어드민 '방문자 목록' — 게스트/회원 visitorId 단위 집계변경 파일 5개
쉬운 설명: 어드민 '방문자 목록' — 게스트/회원 visitorId 단위 집계 작업이다.
바꾼 이유: - 게스트는 이미 VisitLog 에 저장 중 → 회원(User) 테이블 오염 없이 별도 목록으로 노출. - AdminVisitController GET /api/admin/visits/visitors?days=7 (기본 7·최대 30) + VisitService.getRecentVisitors + VisitLogRepository.recentVisitors (visitorId 단위: 방문수·다녀간 경로·최근 시각·순수 게스트 여부 BOOL_AND). - 어드민 새 '방문자' 탭: 게스트/회원 배지 · 다녀간 경로 · 방문수 · 최근 시각 + 게스트/회원 수 요약. - VisitController javadoc 줄바꿈 spotless 정리(로직 무변경). - 배포: 프론트 자동. 방문자 목록 동작은 백엔드 배포 후.
파일 수: 5개이다.
파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/AdminVisitController.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-backend/src/main/java/com/example/popspotbackend/controller/VisitController.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-backend/src/main/java/com/example/popspotbackend/repository/VisitLogRepository.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-backend/src/main/java/com/example/popspotbackend/service/VisitService.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 5. popspot-frontend/app/admin/page.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 a60e218 — feat(랜딩전환): SEO 랜딩 상단 히어로 CTA + 마감임박 훅 — 원페이지 이탈 방지변경 파일 2개
쉬운 설명: 검색 결과 노출 랜딩 상단 히어로 CTA + 마감임박 훅 — 원페이지 이탈 방지 작업이다.
바꾼 이유: - /popups/[slug] 자연유입(성수 등)이 30개 목록을 스크롤해야 지도 CTA를 보던 문제 → intro 바로 아래 히어로 블록으로 끌어올림: 진행중 N곳 · 오늘 오픈 · 마감임박(7일 내) + 큰 지도 CTA. - "로그인 없이 무료로 위치·영업시간·마감일 확인" 문구로 로그인 망설임 해소. - 마감임박/오늘오픈은 filtered 마커 startDate/endDate 로 계산(popupSlices.parseDate·startOfDay export 재사용), ISR revalidate=3600 로 매시 갱신. 약관 §10-2 준수(집계·지도유도만, 크롤 상세 노출 X). - 로컬 검증: 성수 랜딩 "35곳 진행 중 · 마감임박 14 · 지도 CTA · 로그인 없이 무료" 정상 렌더.
파일 수: 2개이다.
파일 1. popspot-frontend/app/popups/[slug]/page.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-frontend/src/lib/popupSlices.ts
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 94d50c2 — fix(배경영상): 끊김 없는 크로스페이드 루프 (라이트/다크 공통)변경 파일 2개
쉬운 설명: 끊김 없는 크로스페이드 루프 (라이트/다크 공통) 작업이다.
바꾼 이유: - 네이티브 loop 는 끝→시작 프레임이 튀어 "뚝" 끊겨 보였음(영상이 seamless 하지 않아서). - LoopingBgVideo: 두 개의 <video> 를 핑퐁 크로스페이드 — 활성 영상이 끝나기 ~1.2초 전 반대편을 0초부터 재생하며 opacity 를 교차해 끝 프레임을 시작 프레임으로 부드럽게 녹임. - opacity 는 CSS transition 대신 requestAnimationFrame 으로 직접 제어(이 프로젝트 Tailwind important:true + GPU 레이어 조합에서 opacity transition 이 진행 안 되는 문제 회피). - 백그라운드 탭 등 rAF 정지 상황엔 setTimeout 폴백으로 최종 상태 보장. - 검증: 재생 중인 영상이 항상 표시되고(48/50), A→B→A 핑퐁·무블랭크 확인. (부드러운 페이드 자체는 rAF 특성상 보이는 탭에서만 동작 — 실서비스에서 확인 필요)
파일 수: 2개이다.
파일 1. popspot-frontend/app/HomeClient.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-frontend/src/components/LoopingBgVideo.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 73b6a4c — feat(음악개인화): 유튜브식 개인화 추천 (이력 기반)변경 파일 4개
쉬운 설명: 유튜브식 개인화 추천 (이력 기반) 작업이다.
바꾼 이유: 백엔드 - MusicService.recommendNext(seed, limit, userId) — 시드 곡 무드 유사도(x2)에 유저 재생 이력의 무드 취향·선호 아티스트를 블렌드. 로그인 유저마다 같은 곡에서도 다른 다음곡이 나온다. - MusicService.forYou(userId, limit) — 재생 이력 무드 프로필 기반 '당신을 위한' 피드(이미 들은 곡 제외). 무이력/게스트는 인기곡 폴백. 무드 키워드 고정 쏠림을 유저별 취향으로 보완. - userTaste 헬퍼(무드 빈도순·아티스트·들은 곡 집계) + rankByProfile. DB만 사용해 외부 API quota 0. - MusicController: /{id}/next 에 @AuthenticationPrincipal 전달, GET /for-you 신설.
파일 수: 4개이다.
파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/MusicController.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-backend/src/main/java/com/example/popspotbackend/service/music/MusicService.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-frontend/src/components/music/MusicPlayerProvider.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-frontend/src/components/music/MusicTab.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 534a12b — fix(방문통계): 봇 필터 강화 + User-Agent 기록/표시 (잔여 봇 식별)변경 파일 6개
쉬운 설명: 봇 필터 강화 + User-Agent 기록/표시 (잔여 봇 식별) 작업이다.
바꾼 이유: - 문제: SEO 랜딩(/popups/*)을 하나씩 훑는 크롤러가 봇 키워드 없는 UA로 필터를 통과해 게스트 방문자 수를 부풀림(서로 다른 슬라이스를 1회씩 찍는 수십 명). - VisitController.isBot 강화: (1) 실제 브라우저는 모두 UA에 "mozilla" → 없으면 봇 간주, (2) 블랙리스트 대폭 확장(google/bing/yandex/baidu/sogou/perplexity·소셜프리뷰·헤드리스/ puppeteer/playwright/selenium/webdriver·모니터링·HTTP 라이브러리 등). - VisitLog.userAgent 컬럼 추가 + record 에서 저장(봇 식별용, 브라우저·기기 종류라 개인식별 불가). recentVisitors 쿼리에 MAX(user_agent), 어드민 방문자 목록에 UA 표시 + '봇?' 배지(흔한 브라우저 토큰 없을 때) → 남는 봇을 눈으로 확인해 필터를 계속 다듬을 수 있음. - 스키마: 운영 ddl-auto=validate 라 Flyway V16__visit_log_user_agent.sql 로 컬럼 추가(없으면 부팅 실패). - 배포: 프론트 자동. 필터 강화·UA 기록은 백엔드 배포 후(UA는 배포 후 방문부터 채워짐).
파일 수: 6개이다.
파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/VisitController.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-backend/src/main/java/com/example/popspotbackend/entity/VisitLog.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-backend/src/main/java/com/example/popspotbackend/repository/VisitLogRepository.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-backend/src/main/java/com/example/popspotbackend/service/VisitService.java
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 5. popspot-backend/src/main/resources/db/migration/V16__visit_log_user_agent.sql
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 6. popspot-frontend/app/admin/page.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
커밋 2ee125f — chore: Vercel 재배포 트리거 (UA 표시 반영)변경 파일 0개
쉬운 설명: Vercel 재배포 트리거 (UA 표시 반영) 작업이다.
바꾼 이유: 커밋 제목에 적힌 문제를 해결하기 위해 코드를 바꿨다.
파일 수: 0개이다.
커밋 447b86a — feat(앱): popspot 모바일 앱 MVP — RN+Expo 팝업 목록·상세변경 파일 16개 · 자동 생성·보조 7개
쉬운 설명: popspot 모바일 앱 MVP — RN+Expo 팝업 목록·상세 작업이다.
바꾼 이유: - popspot-app: React Native + Expo(SDK 57) 신규 앱. 기존 Spring Boot API 그대로 재사용(백엔드 0 재작업). - 팝업 목록(/api/map/markers · 마감임박 순 정렬 · 당겨서 새로고침 · 로딩/에러/재시도) → 상세(위치·기간·카테고리·D-day + 지도앱 열기). React Navigation native-stack. - 브랜드 테마(라임/잉크/크림), 카테고리 라벨·D-day·지역 축약 헬퍼(src/lib.ts). - 검증: Expo 웹으로 렌더·D-day 정렬·목록↔상세 내비게이션·상세 E2E 확인(실데이터 형태 목킹). 실 백엔드 호출은 네이티브(폰)에서 동작 — 웹 프리뷰만 CORS로 막힘(정상). - 목표: Google Play 스토어. 다음 단계: 지도·위시+마감푸시·로그인·EAS 빌드·스토어 등록(README 로드맵).
파일 수: 24개이다.
파일 1. popspot-app/.claude/settings.json
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 2. popspot-app/.gitignore
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 3. popspot-app/AGENTS.md
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 4. popspot-app/App.tsx
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 5. popspot-app/CLAUDE.md
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 6. popspot-app/LICENSE
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 7. popspot-app/README.md
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 8. popspot-app/app.json
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.
파일 15. popspot-app/index.ts
파일 전체 문맥
조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.