v2.36change journal

POP-SPOT v2.36 (1/8) — 드롭다운 문구를 실제 이동처와 맞춤 — 모달에선 "상세 보기"

김동현223
#백엔드#프론트엔드#회고#트러블슈팅
v2.36 릴리즈에 포함된 Git 기록을 빠짐없이 펼친 기술 기록이다. 전문 용어는 바로 풀어 쓰고, 바뀐 모든 코드 줄을 Before → After로 비교했다.

먼저 쉽게 설명하면

드롭다운 문구를 실제 이동처와 맞춤 — 모달에선 "상세 보기" 작업이 중심이다. 이 릴리즈는 눈에 보이는 결과뿐 아니라 그 결과를 만든 파일과 코드까지 모두 추적했다.

읽는 법

  • Before는 바뀌기 전 줄이다.
  • After는 바뀐 뒤 줄이다.
  • ‘해당 코드 없음’은 새로 추가했거나 완전히 지운 구간이라는 뜻이다.
  • 영상·이미지처럼 글자로 비교할 수 없는 파일은 Git의 추가·수정·삭제 상태로 기록했다.
  • Git 기준 범위

  • 릴리즈: v2.36
  • 기준 날짜: 2026-07-19
  • 커밋: 42개
  • 파일 변경 기록: 190개
  • 추가한 줄: 15070줄
  • 삭제한 줄: 2267줄
  • 검증 ID: 590e20db98242f22e4a45da12224890db871396b7f34af4a61b4afe6a190865c
  • 기준 커밋: 53525ff7b7fd

  • 커밋 66c0ca4 — fix(배경·지도): 라이트 영상을 잔잔한 해안 항공으로 교체 + 지도 핀 라이트 대응변경 파일 2 · 자동 생성·보조 1개

    GitHub에서 이 커밋 보기

    쉬운 설명: 라이트 영상을 잔잔한 해안 항공으로 교체 + 지도 핀 라이트 대응 작업이다.

    바꾼 이유: - 라이트 배경 영상: 밝은 스카이라인이 도심 불빛으로 여전히 소란스러워, 다크(야경)처럼 느리고 차분한 걸로 교체. Pexels 무료(상업용) '미스트 낀 해안 항공'(854752)을 받아 3~12초 구간을 부메랑으로 이어 끊김 없는 18초 루프로 재인코딩(1600x900), 0.5배속 유지. → 반짝이는 요소 없이 느리고 밝은 배경. - 지도 핀: 기본(미선택) 핀이 bg-black/text-white 로 하드코딩돼 라이트 모드에서도 검게 떴음. → 라이트=흰 핀+진한 글씨(text-gray-800)+카테고리 색 테두리, 다크=현행 검은 핀으로 테마 대응. 위치 점 테두리도 라이트에선 회색으로. 선택 핀(라임)은 양 모드 공통.

    파일 수: 2개이다.


    파일 2. popspot-frontend/src/components/Map/InteractiveMap.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    자동 생성·보조 파일 1개 — Git 대조 기록
    파일 1. popspot-frontend/public/light-bg.mp4 — 수정
    Git 이력 대조에는 포함했다. 도구가 자동으로 만들거나 사람이 직접 읽기 어려운 파일이라 본문 코드 비교에서는 접었다.
    커밋 510bc20 — perf·fix(배경): 라이트 영상 크로스페이드 루프(뚝 끊김 제거) + 전체 렉 개선변경 파일 3 · 자동 생성·보조 1개

    GitHub에서 이 커밋 보기

    쉬운 설명: perf·fix(배경): 라이트 영상 크로스페이드 루프(뚝 끊김 제거) + 전체 렉 개선 작업이다.

    바꾼 이유: 영상 루프(뚝 끊김): - 부메랑(정방향+역방향)은 방향이 되감겨 '걸리는/끊기는' 느낌이었음 → 크로스페이드 루프로 교체. 정방향 모션을 유지한 채 끝↔시작을 1초 디졸브로 이어 붙여 끊김 없이 순환. - 잔잔한 해안 항공(Pexels 854752) 2~12초 구간, 1280x720로 재인코딩 → 688K(기존 10MB에서 대폭↓).

    파일 수: 3개이다.


    파일 1. popspot-frontend/app/HomeClient.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-frontend/app/globals.css

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    자동 생성·보조 파일 1개 — Git 대조 기록
    파일 3. popspot-frontend/public/light-bg.mp4 — 수정
    Git 이력 대조에는 포함했다. 도구가 자동으로 만들거나 사람이 직접 읽기 어려운 파일이라 본문 코드 비교에서는 접었다.
    커밋 d2ee0ee — fix(보안): 채팅 sender 서버측 확정 — 무인증 사칭(스푸핑) 차단변경 파일 5

    GitHub에서 이 커밋 보기

    쉬운 설명: 채팅 sender 서버측 확정 — 무인증 사칭(스푸핑) 차단 작업이다.

    바꾼 이유: 취약점: - STOMP 채팅(ChatController·MateChatController)이 클라이언트 payload 의 sender 를 그대로 저장했음. - 로그인/검증 없이 아무 이름으로(심지어 타 회원·운영자 닉네임 사칭) 글을 쓸 수 있었음.

    파일 수: 5개이다.


    파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/ChatController.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-backend/src/main/java/com/example/popspotbackend/controller/MateChatController.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 3. popspot-backend/src/main/java/com/example/popspotbackend/service/ChatIdentityResolver.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 4. popspot-frontend/src/components/ChatRoom.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 5. popspot-frontend/src/components/MateChatModal.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 397e135 — fix(UI 일관성): 카테고리 명칭·순서 통일 + 지도 아이콘 중복 해소 + 로그인 글씨·장소추가 위치변경 파일 6

    GitHub에서 이 커밋 보기

    쉬운 설명: 카테고리 명칭·순서 통일 + 지도 아이콘 중복 해소 + 로그인 글씨·장소추가 위치 작업이다.

    바꾼 이유: - #2 카테고리 명칭 통일: 지금뜨는 카드·상세의 CULTURE "컬처" → "문화" (지도와 일치). - #7 지도 마커 아이콘 중복: BEAUTY·CULTURE 둘 다 Camera 였음 → CULTURE 를 Palette 로 구분. - #8 브라우즈(관심 슬라이스) 카테고리를 지도와 통일: 디저트→푸드, 아트→문화, 순서 캐릭터-패션-뷰티-푸드-문화. slug/code/keywords 는 유지 → 기존 SEO 랜딩 URL 보존. - #6 헤더 로그인/회원가입: size sm(text-xs) → md + font-bold 로 가독성 강화. - #5 코스 '장소 추가하기' 시트 absolute→fixed(z-100): 헤더+X 가 화면 맨 위에 오도록.

    파일 수: 6개이다.


    파일 1. popspot-frontend/app/popup/[id]/page.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-frontend/src/components/Map/InteractiveMap.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 3. popspot-frontend/src/components/layout/Header.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 4. popspot-frontend/src/components/main/PopupCard.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 5. popspot-frontend/src/features/popup/AddPlaceModal.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 6. popspot-frontend/src/lib/popupSlices.ts

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 82ed511 — feat(AI 검색): 서치존에 자연어 'AI로 찾기' 추가 — 검색어 → 지도에 매칭 핀만변경 파일 5

    GitHub에서 이 커밋 보기

    쉬운 설명: 서치존에 자연어 'AI로 찾기' 추가 — 검색어 → 지도에 매칭 핀만 작업이다.

    바꾼 이유: - 기존 Algolia 서치존은 그대로 두고 'AI로 찾기' 바를 추가. 자연어 검색어를 Groq LLM 이 해석해 지도 팝업 목록에서 의도에 맞는 것들의 id 를 선별 → 지도에 그 핀만 표시(처음엔 전체 핀). - 백엔드: - AiSearchService — 후보군은 지도와 동일한 findVisibleMapMarkers, 프롬프트로 id 문자열 JSON 배열 강제, 실재하는 후보 id 로만 필터해 환각 차단(최대 40곳). AiCourseService 패턴 재사용. - AiSearchController — GET /api/search/ai?q= (공개, q 없으면 빈 배열). - 프론트: - SearchBox: AiSearchBar 추가 — LLM 한도 고려해 Enter/버튼 제출 시에만 호출. 결과 수·'전체 지도 보기' 리셋 표시. Algolia 미설정(fallback)에서도 노출. - InteractiveMap: filterIds prop — 지정 시 해당 id 핀만(빈 배열=0곳), null=전체. - HomeClient: mapFilterIds 상태 + 배선. AI 검색 시 지도로 스크롤. - 배포: 프론트 자동. AI 검색 동작은 백엔드(수동) 배포 후 활성화.

    파일 수: 5개이다.


    파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/AiSearchController.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-backend/src/main/java/com/example/popspotbackend/service/AiSearchService.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 3. popspot-frontend/app/HomeClient.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 4. popspot-frontend/src/components/Map/InteractiveMap.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 5. popspot-frontend/src/features/popup/SearchBox.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 c46d7ca — feat(어드민): 중복 팝업 정리 — 이름 완전일치 중복만 대표 1건 남기고 숨김변경 파일 3

    GitHub에서 이 커밋 보기

    쉬운 설명: 중복 팝업 정리 — 이름 완전일치 중복만 대표 1건 남기고 숨김 작업이다.

    바꾼 이유: - 문제: 같은 팝업이 이름까지 똑같이 여러 건 수집돼 지도/검색에 중복 표시됨. - PopupDedupService: 이름 '완전일치'(공백 트림 후 정확히 같은) 그룹만 대상. 표기 변형(피스마이너스원×토이스토리 vs 피마원 X 토이스토리)은 서로 다른 것으로 두고 건드리지 않음. 그룹별 대표 1건(신뢰도 높은 순 → id 낮은 순)만 남기고 나머지는 reviewStatus=DUPLICATE 로 숨김 (하드 삭제 아님 — 되돌리기 가능) + Algolia 색인 제거 + 지도 캐시(visible/hot) 무효화. - 어드민 엔드포인트: GET /api/admin/popups/duplicates(미리보기) + POST /api/admin/popups/dedupe(적용). 어드민 '중복 정리' 버튼 = 미리보기(그룹·건수·샘플 표시) → 확인 → 적용. - 배포: 프론트 자동. 정리 동작은 백엔드 배포 후 활성화.

    파일 수: 3개이다.


    파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/AdminController.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-backend/src/main/java/com/example/popspotbackend/service/PopupDedupService.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 3. popspot-frontend/app/admin/page.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 f570ee0 — feat: 서치바 AI 전환 + 음악 정렬 캡션 + 자동 중복정리 스케줄러변경 파일 6

    GitHub에서 이 커밋 보기

    쉬운 설명: 서치바 AI 전환 + 음악 정렬 캡션 + 자동 중복정리 스케줄러 작업이다.

    바꾼 이유: - 서치바 개편: 기존 Algolia 서치바 제거, 자연어 'AI 검색'을 메인 서치바로 승격 (크게 + 스파클·라임 글로우·AI 배지·예시 칩). 지도 페이지=매칭 핀만 표시(onAiFilter), 글로벌 검색 모달(지도 없음)=결과 목록으로 표시 후 상세 이동. 이에 맞춰 /api/search/ai 가 id·이름·위치를 함께 반환(results). - #4 음악 정렬: MOOD 팝업 목록에 정렬 드롭다운 추가 — 추천순/인기순/마감임박순/카테고리순. - 자동 중복정리: PopupDedupScheduler — 크롤(04·16시 KST) 뒤 05·17시에 이름 완전일치 중복을 자동 정리(대표 1건만 남김). 크롤러 파일(WIP) 미변경, 독립 스케줄로 붙임. 수집 시점의 externalId 해시 dedup 이 위치·날짜 표기 차이로 놓치던 이름중복을 보완. - 배포: 프론트 자동. AI검색·자동중복정리는 백엔드 배포 후 동작.

    파일 수: 6개이다.


    파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/AiSearchController.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-backend/src/main/java/com/example/popspotbackend/service/AiSearchService.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 3. popspot-backend/src/main/java/com/example/popspotbackend/service/PopupDedupScheduler.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 4. popspot-backend/src/main/resources/application.properties

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 5. popspot-frontend/src/components/music/MusicTab.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 6. popspot-frontend/src/features/popup/SearchBox.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 152b15a — feat(어드민): 라이브 댓글 관리 — 실시간 톡방 댓글 조회·삭제변경 파일 4

    GitHub에서 이 커밋 보기

    쉬운 설명: 라이브 댓글 관리 — 실시간 톡방 댓글 조회·삭제 작업이다.

    바꾼 이유: - 어드민에 '라이브 댓글' 탭 추가. 실시간 톡방(ChatMessage) 최근 100건을 보고 부적절한 댓글을 삭제. - 백엔드: - ChatService.findRecentMessages(최근 100건 DTO) / deleteMessage(id) - ChatRepository.findTop100ByOrderBySendTimeDesc - AdminController: GET /api/admin/chat/recent + DELETE /api/admin/chat/{id} (ADMIN 전용) - 프론트: 어드민 '라이브 댓글' 탭 + 목록(작성자·팝업·시간·내용) + 삭제 버튼 + 새로고침. 댓글 내용은 React 이스케이프로 안전 표시(HTML 주입 무력화). - 배포: 프론트 자동. 삭제 동작은 백엔드 배포 후.

    파일 수: 4개이다.


    파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/AdminController.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-backend/src/main/java/com/example/popspotbackend/repository/ChatRepository.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 3. popspot-backend/src/main/java/com/example/popspotbackend/service/ChatService.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 4. popspot-frontend/app/admin/page.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 1e46b1c — feat(어드민): 라이브 댓글 일괄(다중선택) 삭제변경 파일 3

    GitHub에서 이 커밋 보기

    쉬운 설명: 라이브 댓글 일괄(다중선택) 삭제 작업이다.

    바꾼 이유: - 라이브 댓글 관리에 다중 선택 + 일괄 삭제 추가: 행별 체크박스 + '전체 선택' + '선택 삭제(N)' 바. 선택된 행은 라임 테두리로 강조, 선택 0개면 버튼 비활성. - 백엔드: ChatService.deleteMessages(ids) + AdminController POST /api/admin/chat/delete-batch (ADMIN). - 배포: 프론트 자동. 삭제 동작은 백엔드 배포 후.

    파일 수: 3개이다.


    파일 1. popspot-backend/src/main/java/com/example/popspotbackend/controller/AdminController.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-backend/src/main/java/com/example/popspotbackend/service/ChatService.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 3. popspot-frontend/app/admin/page.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 2503c24 — fix(어드민): 라이브 댓글 일괄 삭제 400 수정 — 개별 삭제 병렬 호출로 전환변경 파일 1

    GitHub에서 이 커밋 보기

    쉬운 설명: 라이브 댓글 일괄 삭제 400 수정 — 개별 삭제 병렬 호출로 전환 작업이다.

    바꾼 이유: - POST /api/admin/chat/delete-batch 가 400(GlobalExceptionHandler 가 RuntimeException 을 일괄 400 처리 — @RequestBody/deleteAllById 에서 런타임 예외 시 전체 롤백). - 이미 정상 동작하는 개별 삭제(DELETE /api/admin/chat/{id})를 병렬 반복 호출로 전환. chat 경로는 RateLimit 대상이 아니라 안전하고, 각 요청이 독립이라 일부 실패해도 나머지는 삭제되며 성공/실패 건수를 집계해 안내한다. - 프론트 전용 수정(백엔드 재배포 불필요). 기존 delete-batch 엔드포인트는 미사용으로 남겨둠.

    파일 수: 1개이다.


    파일 1. popspot-frontend/app/admin/page.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 ba195ff — fix(어드민): 댓글 삭제 실패 원인 노출 — 서버 message 를 토스트·콘솔에 표시변경 파일 2

    GitHub에서 이 커밋 보기

    쉬운 설명: 댓글 삭제 실패 원인 노출 — 서버 message 를 토스트·콘솔에 표시 작업이다.

    바꾼 이유: - 라이브 댓글 삭제가 400 인데 UI 가 "삭제 실패"만 띄워 원인 파악이 불가했음. (GlobalExceptionHandler 는 원인 문자열을 응답 body.message 에 담아줌 — 인증/권한은 401/403 으로 따로 처리되므로, 이 400 은 서버 내부 RuntimeException. 무토큰 프로브는 302 로 인증 계층 정상 확인) - apiFetch: !ok 응답의 body 를 콘솔에 그대로 출력(500자 제한) — 모든 API 디버깅에 공통 적용. - 어드민 댓글 개별/일괄 삭제 토스트: 서버 message 를 표시("삭제 실패: <원인>", 일괄은 첫 실패 원인). - 다음 클릭 한 번이면 400 의 실제 원인이 토스트/콘솔에 그대로 드러남.

    파일 수: 2개이다.


    파일 1. popspot-frontend/app/admin/page.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-frontend/src/lib/api.ts

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 af8140d — fix(채팅): 댓글 삭제를 벌크 delete 로 — 중복 id 행("Duplicate row") 에도 안전변경 파일 2

    GitHub에서 이 커밋 보기

    쉬운 설명: 댓글 삭제를 벌크 delete 로 — 중복 id 행("Duplicate row") 에도 안전 작업이다.

    바꾼 이유: - 원인 확정: chat_message 에 같은 id 행이 중복 존재(시퀀스 리셋으로 새 메시지가 옛 id 와 충돌, PK 제약 부재라 저장은 성공). deleteById 는 findById 로 엔티티를 먼저 로드하는데 이때 Hibernate "Duplicate row was found and ASSERT was specified" 가 터져 400 이 났음. (SELECT 목록·INSERT 는 정상이라 증상이 삭제에서만 나타남) - ChatRepository.deleteAllByIdsBulk: @Modifying JPQL 벌크 delete — 엔티티 로드 없이 SQL 로 바로 삭제해 중복 행이 있어도 전부 안전하게 지움. 개별/일괄 삭제 모두 이걸 사용. - 근본 치료는 DB 측: 중복 행 정리 + setval 로 시퀀스 복구 + PK 제약 추가(운영 psql 로 안내). 이 코드는 그 전/후 모두에서 안전하게 동작하는 방어층.

    파일 수: 2개이다.


    파일 1. popspot-backend/src/main/java/com/example/popspotbackend/repository/ChatRepository.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-backend/src/main/java/com/example/popspotbackend/service/ChatService.java

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 da842cb — seo(메인): 헤드 키워드 강화(일정·지도·오늘/이번주) + 방문통계 관리자/본인 제외변경 파일 3

    GitHub에서 이 커밋 보기

    쉬운 설명: 헤드 키워드 강화(일정·지도·오늘/이번주) + 방문통계 관리자/본인 제외 작업이다.

    바꾼 이유: - 방문 통계 정확도: 관리자(JWT role=ADMIN)·/admin 경로·본인 브라우저(한 번 ADMIN 확인 시 notrack 플래그로 이후 계속) 트래픽을 방문 기록에서 제외 → 자체 접속으로 지표가 부풀려지던 문제 해결. - 메인 SEO(구글 트렌드 분석 반영): title/description/SSR sr-only 본문을 메인이 현실적으로 잡을 수 있는 헤드 키워드 중심으로 재작성. · "팝업스토어 일정"(급상승 +120%, 우리가 딱 그 서비스)·"서울 팝업스토어"·"지도"·"오늘/이번주/주말 팝업" 전면 배치. · 더현대 서울·용산 아이파크몰 등 인기 장소 + 패션·뷰티·캐릭터·브랜드·IP 팝업을 자연스럽게 녹여 주제 관련성 확장(키워드 스터핑 아님). · 브라우저 "팝업 차단/해제/허용/설정" 류(검색량은 크나 무관·고이탈)는 철저 배제. · layout keywords 에 더현대·용산아이파크몰·코엑스·잠실 보강(Naver 참고용).

    파일 수: 3개이다.


    파일 1. popspot-frontend/app/layout.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-frontend/app/page.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 3. popspot-frontend/src/components/VisitTracker.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    커밋 0de1714 — feat(SEO): 브랜드·IP·장소별 팝업 랜딩페이지 (구글 트렌드 기반)변경 파일 3

    GitHub에서 이 커밋 보기

    쉬운 설명: 브랜드·IP·장소별 팝업 랜딩페이지 (구글 트렌드 기반) 작업이다.

    바꾼 이유: - 고관심·급상승 IP/캐릭터/장소 24종 브랜드 랜딩 신설: /popups/stellive(스텔라이브)·overwatch·pokemon·sanrio·genshin·toy-story·demon-slayer· jujutsu-kaisen·nikke·project-sekai·hatsune-miku·djmax·roblox·blue-archive·disney· kakao-friends·line-friends·one-piece·t1·the-hyundai(더현대)·yongsan-ipark·coex·starfield·lotte-world-mall. - 매칭: 팝업 이름/위치에 브랜드 키워드가 포함되면 자동 수집 → 목록·지도 유도. 매칭 0곳이면 noindex(thin content 방지 — 해당 IP 팝업이 진행 중일 때만 색인). - 내부링크: 홈 SSR sr-only + 랜딩 SliceCloud 에서 브랜드 페이지로 링크(구글 색인 발견 촉진). - popupSlices.BRANDS(slug·label·keywords) + brandBySlug 추가. Slice 에 brand kind 통합 (generateStaticParams/resolveSlice/filterBySlice/generateMetadata/FAQ 모두 반영). - (별도) 크롤러 SEARCH_KEYWORDS 에 트렌드 IP 추가 — 크롤러 WIP라 커밋 안 함, 다음 백엔드 배포에 포함. - 브라우저 "팝업 차단/해제" 류(무관·고이탈)는 철저 배제.

    파일 수: 4개이다.


    파일 1. popspot-frontend/app/page.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 2. popspot-frontend/app/popups/[slug]/page.tsx

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    파일 3. popspot-frontend/app/sitemap.ts

    파일 전체 문맥

    조각만 보면 알기 어려운 코드를 파일 처음부터 끝까지 보여 준다. 초록은 추가·수정, 빨강은 삭제된 줄이다.

    공유XLinkedIn

    댓글