kobis-crawler-movie-sync-report.md 5.0 KB

Implementation Report: KOBIS Crawler ↔ Movie 동기화 수정 + 영화사 페이지 신설

Summary

계획된 동기화 오류 수정(faultInfo 감지, return 누락, GetKey fallback, Laravel 장애 격리, 뷰 방어)을 완료하고, 사용자 추가 요청으로 영화사 목록/상세 페이지 + 메뉴를 신설했다. 로컬 Docker 스택(nginx/php-fpm) + 로컬 기동 crawler로 실사이트 end-to-end 검증까지 통과.

Assessment vs Reality

Metric Predicted (Plan) Actual
Complexity Medium (12 files) Medium+ (21 files — 영화사 기능 추가 스코프)
Confidence 8/10 구현 완료, 전 검증 통과
Files Changed 12 21 (신규 8, 수정 13)

Tasks Completed

# Task Status Notes
1 KOBIS 키 동기화 ✅ 사용자 수행 Laravel KOBIS_API_1/2 = crawler apiKey_1/2 (유효 확인). KOBIS_API_3/apiKey_3 = 공식 샘플 키 — 여전히 무효(320010), 라이브 재검증됨. 사이트는 KOBIS_API_1만 사용하므로 무영향
2 crawler GetKey() fallback 하드코딩 무효 키 → config.Movie.Kobis.ApiKey_3
3 crawler faultInfo 감지 checkFault() 신설, 5개 API 함수 적용(KCISA 포함, 무해)
4 crawler return 누락 3곳 daily/weekly/list 오류 분기
5 Laravel 장애 격리 Rank/Search/Company 컨트롤러 Http::timeout(5) + ConnectionException catch + abort(?: 500)
6 누적 매출/관객 표시 방어 ✅ 변경 불필요 편차: search/show 뷰(desktop/mobile)에 @if($detail->SaleAcc) 가드가 이미 존재 — 계획이 구버전 가정
7 SearchController 정리 죽은 ListParams 주입/임포트 제거
8 문서/운영 crawler docs에 구현 매트릭스·키 정책·운영 절차 추가
+ 영화사 페이지 (추가 스코프) crawler /company/* 2종(프록시, DB 캐싱 없음) + Laravel /movie/company index/show + desktop/mobile 뷰 4개 + tb_menu 메뉴(id=8)

Validation Results

Level Status Notes
Static Analysis (Go) ✅ Pass go build ./... 무오류. go vet 경고는 전부 기존 파일(G2A/movieInfo/movieSearch/telegram) 사전 존재분
Static Analysis (PHP) ✅ Pass docker php-fpm으로 6개 파일 php -l 무오류 (로컬 PHP 없음 → docker 사용)
Unit Tests N/A 양쪽 리포 모두 기존 테스트 인프라 부재 (movie tests/ 는 Laravel 기본 스켈레톤)
Integration ✅ Pass 로컬 crawler 기동 후: ①company list ②company info ③무효 키→HTTP 400 + KOBIS fault 320010 ④DB 캐시 daily ⑤신규 날짜(20260721) KOBIS→DB 실시간 적재
E2E (실사이트) ✅ Pass https://local-movie.web.or.kr/movie/company 200 + 목록/상세 렌더, /movie/rank 어제 데이터(호프 1위) 표시, 영화사 메뉴 네비게이션 노출

Files Changed

crawler (8): model/kobis.go(faultInfo+company API), model/company.go(신규), controller/company.go(신규), controller/movie.go(return×3), controller/cron.go(GetKey), config/constants.go(COMPANY URL), route/api.go(company 라우트), docs/KOBIS-영화API.md(구현현황)

movie (13): config/constants.php(COMPANY_LIST/INFO), routes/web.php(company resource), app/Http/Controllers/Movie/RankController.php, SearchController.php, CompanyController.php(신규), app/Models/DTO/Movie/CompanyParams.php(신규), 뷰 6개(rank/index desktop+mobile 수정, company index/show desktop+mobile 신규)

DB (로컬): tb_menu에 영화사 메뉴 INSERT(id=8, link=/movie/company) + php artisan cache:clear(컨테이너 내)

Deviations from Plan

  1. Task 6 무변경: search/show의 SaleAcc/AudiAcc 가드가 이미 코드에 존재.
  2. desktop rank/index Detail null 가드 추가: mobile에만 있던 @isset($row->Detail->MainImg) 패턴을 desktop에도 적용 (계획 edge case 목록에 있던 실버그).
  3. 메뉴 삽입 방식: nested-set 중간 삽입(UPDATE shift)이 권한 정책으로 차단되어 끝에 INSERT(공지사항 뒤). 위치 조정은 관리자 > 메뉴 관리에서 가능.
  4. 브랜치 미생성: 사용자 워크플로(main 직커밋 + 진행 중 미커밋 변경 존재)에 맞춰 main에서 작업, 커밋하지 않음.

Issues Encountered

  • 샘플 키(82ca741a...)는 여전히 무효 — KOBIS_API_3/apiKey_3 자리는 실키 발급 후 교체 권장 (현재 사이트 동작에는 무영향).
  • crawler dev/prod 서버(192.168.0.10/.100:1050)는 세션 시작 시 무응답이었음 — 운영 반영 시 crawler 재빌드·재시작 필요 (start.exe는 구버전 바이너리).

Next Steps

  • 운영 crawler 재빌드/배포 (go build → start.exe 교체) 후 재시작
  • 운영 DB tb_menu에 영화사 메뉴 추가 (관리자 > 페이지 > 메뉴) + 캐시 클리어
  • KOBIS_API_3/apiKey_3 실키 발급·교체 (선택)
  • /code-review 및 커밋 (/prp-commit)