project_key 도입 — 로그와 임팩트가 프로젝트에 하나도 안 붙던 버그를 잡다
발견
포트폴리오 상세를 모달에서 전용 페이지(/portfolio/[key])로 옮기는 작업을 하다가, 대부분의 프로젝트에 Dev Log도 Impact 수치도 하나도 안 붙어 있다는 걸 발견했다.
원인
logs.project와 impact_stats[].project는 짧은 코드네임("Timeslot", "RoundWait" 등)을 썼는데, 매칭 기준은 projects.title(전체 표시용 제목)이었다. 코드네임과 전체 제목이 애초에 같을 수 없으니 거의 모든 프로젝트가 조용히 매칭 실패 상태였다. 화면에는 에러가 뜨지 않고 그냥 "없음"으로만 보여서 한동안 몰랐다.
해결
project_key라는 안정적인 짧은 식별자를 도입해서 display title과 분리했다. 대소문자 무시로 매칭하고, 동시에 /portfolio/[key]의 URL 세그먼트로도 재사용한다. project_key가 아직 없는 기존 프로젝트는 id로 폴백.
부수로 admin write/impact 폼에 project_key 자동완성을 붙였다(하드코딩된 프로젝트 목록 대신 실제 등록된 값 기준), 포트폴리오 admin에 PDF 업로드를 추가했고(기존엔 URL만 가능), 저장·렌더링 시 태그 중복도 제거했다.
그 사이
7/9에 ESLint 정리를 마무리했고, 7/14에는 자체 방문자 Analytics 대시보드(관리자 접속은 자동 제외, 오늘/주간/월간 통계 + 7일 차트 + 유입경로)를 추가했다.
교훈
필드 이름이 같아 보여도("project") 실제로 매칭에 쓰이는 값의 성격(코드네임 vs 표시용 제목)이 다르면 조용히 다 깨진다.