계획된 동기화 오류 수정(faultInfo 감지, return 누락, GetKey fallback, Laravel 장애 격리, 뷰 방어)을 완료하고, 사용자 추가 요청으로 영화사 목록/상세 페이지 + 메뉴를 신설했다. 로컬 Docker 스택(nginx/php-fpm) + 로컬 기동 crawler로 실사이트 end-to-end 검증까지 통과.
| Metric | Predicted (Plan) | Actual |
|---|---|---|
| Complexity | Medium (12 files) | Medium+ (21 files — 영화사 기능 추가 스코프) |
| Confidence | 8/10 | 구현 완료, 전 검증 통과 |
| Files Changed | 12 | 21 (신규 8, 수정 13) |
| # | 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) |
| 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위) 표시, 영화사 메뉴 네비게이션 노출 |
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(컨테이너 내)
@isset($row->Detail->MainImg) 패턴을 desktop에도 적용 (계획 edge case 목록에 있던 실버그).82ca741a...)는 여전히 무효 — KOBIS_API_3/apiKey_3 자리는 실키 발급 후 교체 권장 (현재 사이트 동작에는 무영향).go build → start.exe 교체) 후 재시작/code-review 및 커밋 (/prp-commit)