v2.38change journal

POP-SPOT v2.38 (7/9) — 스톡 이미지 제거·크롤 근거 검증 보강

김동현240
#백엔드#프론트엔드#회고#트러블슈팅
v2.38 변경 기록의 이어지는 부분이다. 같은 검증 ID 71b00f11cf3a33de38428dc687299e367b8dd68be1e9712bb01ad0e75be6aaa9를 사용한다.
커밋 700f95a — feat(수집): 쿼터 계측·429 분리·URL 선중복제거 + 단위 테스트 44개변경 파일 14

GitHub에서 이 커밋 보기

파일 1. popspot-backend/src/main/java/com/example/popspotbackend/entity/CrawlSourceLedger.java

파일 전체 문맥

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

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

파일 전체 문맥

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

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

파일 전체 문맥

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

파일 4. popspot-backend/src/main/java/com/example/popspotbackend/service/ai/LlmFailureKind.java

파일 전체 문맥

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

파일 5. popspot-backend/src/main/java/com/example/popspotbackend/service/ai/LlmQuotaExhaustedException.java

파일 전체 문맥

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

파일 6. popspot-backend/src/main/java/com/example/popspotbackend/service/ai/LlmUsageTracker.java

파일 전체 문맥

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

파일 7. popspot-backend/src/main/java/com/example/popspotbackend/service/crawler/CrawlSourceLedgerService.java

파일 전체 문맥

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

파일 8. popspot-backend/src/main/java/com/example/popspotbackend/service/crawler/PopupCrawlOrchestrator.java

파일 전체 문맥

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

파일 9. popspot-backend/src/main/java/com/example/popspotbackend/service/crawler/PopupNormalizationService.java

파일 전체 문맥

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

파일 10. popspot-backend/src/main/java/com/example/popspotbackend/service/crawler/SourceUrlNormalizer.java

파일 전체 문맥

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

파일 11. popspot-backend/src/main/resources/db/migration/V18__crawl_source_ledger.sql

파일 전체 문맥

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

파일 12. popspot-backend/src/test/java/com/example/popspotbackend/service/ai/LlmErrorsTest.java

파일 전체 문맥

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

파일 13. popspot-backend/src/test/java/com/example/popspotbackend/service/ai/LlmUsageTrackerTest.java

파일 전체 문맥

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

파일 14. popspot-backend/src/test/java/com/example/popspotbackend/service/crawler/SourceUrlNormalizerTest.java

파일 전체 문맥

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

커밋 c90c69b — fix(수집): ledger 유니크 인덱스 누락·재개 커서 부재로 매 회차 사망하던 크롤 복구변경 파일 8

GitHub에서 이 커밋 보기

쉬운 설명: ledger 유니크 인덱스 누락·재개 커서 부재로 매 회차 사망하던 크롤 복구 작업이다.

바꾼 이유: 프로덕션이 dev 프로파일(ddl-auto=update)로 떠 Flyway 가 실행되지 않았고, 엔티티에 source_url_hash 유니크 매핑이 없어 V18 의 유니크 인덱스가 생성되지 않았다. 그 결과 upsert 의 ON CONFLICT 가 매칭 실패해 크롤이 저장 직전마다 통째로 롤백됐다(수확 0).

파일 수: 8개이다.


파일 1. popspot-backend/src/main/java/com/example/popspotbackend/entity/CrawlCursor.java

파일 전체 문맥

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

파일 2. popspot-backend/src/main/java/com/example/popspotbackend/entity/CrawlSourceLedger.java

파일 전체 문맥

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

파일 3. popspot-backend/src/main/java/com/example/popspotbackend/repository/CrawlCursorRepository.java

파일 전체 문맥

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

파일 4. popspot-backend/src/main/java/com/example/popspotbackend/service/crawler/CrawlCursorService.java

파일 전체 문맥

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

파일 5. popspot-backend/src/main/java/com/example/popspotbackend/service/crawler/PopupCrawlOrchestrator.java

파일 전체 문맥

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

파일 6. popspot-backend/src/main/java/com/example/popspotbackend/service/crawler/PopupNormalizationService.java

파일 전체 문맥

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

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

파일 전체 문맥

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

파일 8. popspot-backend/src/test/java/com/example/popspotbackend/service/crawler/CrawlCursorServiceTest.java

파일 전체 문맥

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

커밋 fbcd7d3 — fix(보안): takedown 신고자 이메일이 무인증 공개 API 로 노출되는 경로 차단변경 파일 2

GitHub에서 이 커밋 보기

쉬운 설명: takedown 신고자 이메일이 무인증 공개 화면과 서버가 데이터를 주고받는 통로 로 노출되는 경로 차단 작업이다.

바꾼 이유: GET /api/popups/{id} 는 DTO 없이 엔티티를 통째로 직렬화한다(result.put("data", popup)). takedown 필드는 평소 reviewStatus=TAKEDOWN 게이트에 가려 안 보이지만, admin 이 악성 신고로 판단해 승인하면 reviewStatus 만 APPROVED 로 바뀌고 필드는 그대로 남아 신고자 이메일이 공개된다. 권리침해를 신고한 사람의 신원이라 노출 대가가 특히 크다.

파일 수: 2개이다.


파일 1. popspot-backend/src/main/java/com/example/popspotbackend/entity/PopupStore.java

파일 전체 문맥

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

파일 2. popspot-backend/src/test/java/com/example/popspotbackend/entity/PopupStoreSerializationTest.java

파일 전체 문맥

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

커밋 9b63003 — feat(SEO): 팝업 상세 조건부 noindex + 랜딩 목록 상세 링크변경 파일 5

GitHub에서 이 커밋 보기

쉬운 설명: 팝업 상세 조건부 noindex + 랜딩 목록 상세 링크 작업이다.

바꾼 이유: 팝업 상세 URL 에는 회원이 남긴 글(ChatRoom)이 같이 산다. 약관 §14(회원 콘텐츠 비색인)를 지키려면 이 URL 을 색인할 수 없다 — 채팅을 별도 URL 로 떼기 전까지는. - app/popup/[id]/layout.tsx 신설: 무조건 noindex + self-canonical(홈 canonical 상속 차단). 데이터로 조건 분기하지 않는다 — 채팅이 같은 URL 에 있는 한 어떤 조건도 index 를 못 켠다. - 랜딩 목록(popups/[slug]) 각 행을 /popup/[id] 로 링크. 홈 BrowseSection 이 같은 데이터의 같은 최소 목록을 이미 상세로 링크하고 있어 랜딩만 빠져 있었다. 오버레이 링크 + aria-label. - §10-2 를 "상세 노출 금지"로 잘못 읽던 주석들 정정(sitemap·AuthGuard·admin layout). 약관 원문은 오히려 상세페이지에 출처 링크 노출을 요구한다.

파일 수: 5개이다.


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

파일 전체 문맥

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

파일 2. popspot-frontend/app/popup/[id]/layout.tsx

파일 전체 문맥

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

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

파일 전체 문맥

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

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

파일 전체 문맥

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

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

파일 전체 문맥

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

커밋 43b577c — feat(AI): 사용자 AI 3종 호출 계측 — Role.USER 토큰·모델명 로깅변경 파일 5

GitHub에서 이 커밋 보기

쉬운 설명: 사용자 AI 3종 호출 계측 — Role.USER 토큰·모델명 로깅 작업이다.

바꾼 이유: AI 검색·코스·음악은 각자 chatLanguageModel.generate(String) 을 직접 불렀는데, 그 방식은 TokenUsage 를 안 줘서 사용자 AI 의 토큰 소비가 계측되지 않았고, 어떤 호출이 실제로 어떤 모델을 썼는지 로그에 남지 않았다. 크롤러 모델 격리가 실제로 걸렸는지 확인하려면 사용자 쪽에서도 "이 호출이 gpt-oss-120b 로 나갔다" 는 런타임 증거가 필요하다.

파일 수: 5개이다.


파일 1. popspot-backend/src/main/java/com/example/popspotbackend/service/AiCourseService.java

파일 전체 문맥

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

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

파일 전체 문맥

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

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

파일 전체 문맥

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

파일 4. popspot-backend/src/main/java/com/example/popspotbackend/service/music/MusicMoodAnalysisService.java

파일 전체 문맥

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

파일 5. popspot-backend/src/main/java/com/example/popspotbackend/service/music/MusicQueryNormalizationService.java

파일 전체 문맥

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

커밋 4d61a26 — fix(빌드): 운영에서 API_URL 누락 시 localhost 폴백 차단 — fail-fast변경 파일 2

GitHub에서 이 커밋 보기

쉬운 설명: 운영에서 화면과 서버가 데이터를 주고받는 통로_URL 누락 시 localhost 폴백 차단 — fail-fast 작업이다.

바꾼 이유: env.apiUrl 은 SSR 서버 요청·이미지 업로드·특수 경로에서 절대 URL 로 쓰인다. 운영에서 NEXT_PUBLIC_API_URL 이 없을 때 localhost 로 폴백하면 SSR 서버는 자기 localhost 로, 브라우저 업로드는 사용자 PC 의 localhost 로 향해 조용히 실패한다.

파일 수: 2개이다.


파일 1. popspot-frontend/.env.example

파일 전체 문맥

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

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

파일 전체 문맥

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

커밋 ee9d56f — fix(수집): crawl_cursor V19 마이그레이션 + 크롤 env 문서화변경 파일 2

GitHub에서 이 커밋 보기

쉬운 설명: crawl_cursor V19 마이그레이션 + 크롤 env 문서화 작업이다.

바꾼 이유: CrawlCursor 엔티티는 crawl_cursor 테이블을 요구하는데 마이그레이션이 없었다. 현재 운영은 dev 프로파일(ddl-auto=update)이라 Hibernate 가 자동 생성하지만, prod 프로파일(validate) 전환이나 새 환경에서는 기동이 실패한다. V18(crawl_source_ledger)과 일관되게 V19 로 추가한다.

파일 수: 2개이다.


파일 1. popspot-backend/.env.example

파일 전체 문맥

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

파일 2. popspot-backend/src/main/resources/db/migration/V19__crawl_cursor.sql

파일 전체 문맥

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

커밋 984fa57 — fix(보안): 회원 콘텐츠 API 에 X-Robots-Tag noindex — 약관 §14 구조적 보장변경 파일 1

GitHub에서 이 커밋 보기

쉬운 설명: 회원 콘텐츠 화면과 서버가 데이터를 주고받는 통로 에 X-Robots-Tag noindex — 약관 §14 구조적 보장 작업이다.

바꾼 이유: 동행·의견 API(/api/mates, /api/feedback)가 인증 없이 열려 있고 X-Robots-Tag 가 없어, 약관 §14(회원 콘텐츠 비색인)가 "홈 안 클라이언트 렌더" 라는 우연에만 기대고 있었다. 새 조회 경로나 SSR 이 생기면 언제든 노출될 수 있다.

파일 수: 1개이다.


파일 1. popspot-backend/src/main/java/com/example/popspotbackend/config/WebConfig.java

파일 전체 문맥

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

커밋 f4377b5 — feat(사진): photoOrigin 으로 실사진·스톡 구분 + 상세 '분위기 이미지' 라벨변경 파일 3

GitHub에서 이 커밋 보기

쉬운 설명: photoOrigin 으로 실사진·스톡 구분 + 상세 '분위기 이미지' 라벨 작업이다.

바꾼 이유: 크롤은 이미지를 저장하지 않아 크롤 팝업은 전부 상수 폴백(Unsplash)으로 떨어지고, 프론트는 그걸 감지해 카테고리별 큐레이션 Pexels 스톡을 배정해 왔다. 결과적으로 모든 커버가 스톡인데 실사진처럼 보여 방문자가 오해할 수 있었다.

파일 수: 7개이다.


파일 1. popspot-backend/src/main/java/com/example/popspotbackend/entity/PopupImage.java

파일 전체 문맥

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

파일 2. popspot-backend/src/main/java/com/example/popspotbackend/entity/PopupStore.java

파일 전체 문맥

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

파일 3. popspot-backend/src/main/java/com/example/popspotbackend/repository/PopupImageRepository.java

파일 전체 문맥

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

공유XLinkedIn

댓글