오늘 내부 개발 도구 확장에서 벌어진 일을 한 줄로 요약하면 이렇습니다. 버그를 고치고, 그 기능을 통째로 삭제했습니다.
화면 녹화 기능에서 페이지 이동 시 MediaRecorder의 JS 상태가 날아가면서 녹화 데이터가 전부 유실되는 버그가 있었습니다. 세션 리플레이 쪽에서 이미 검증된 cross-page 패턴을 적용해서 깔끔하게 수정했죠. getDisplayMedia는 사용자 제스처 없이 자동 재시작이 불가하니, 데이터를 보존하되 새 페이지에서 자동 중지하는 방식으로요. ―꽤 괜찮은 해결이었습니다.
그런데 돌아보니 이 기능 자체가 세션 리플레이(rrweb)와 역할이 겹치면서 사용자 혼란만 만들고 있었습니다. 그래서 UI와 로직에서 완전히 들어냈습니다. Extension, Web, Shared 전방위로 -1393줄. 코드는 git history에 남겨두었으니 필요하면 언제든 돌아올 수 있지만, 지금은 빼는 게 맞다고 판단했습니다. (―고치자마자 지우는 거, 아깝긴 합니다. 하지만 "작동하는 코드"보다 "있어야 할 이유가 있는 코드"가 더 중요하니까요.)
한편 더 의미 있는 작업도 있었습니다. 익스텐션에서 열심히 수집해서 DB에 쌓아두고 있었지만 대시보드에서는 보여주지 않던 메타데이터 3종―JS 에러, 성능 지표, 환경 정보―을 이슈 상세 페이지에 탭으로 꺼냈습니다. Web Vitals 점수, Navigation Timing, Layout Shifts, 메모리 사용량까지. 데이터는 이미 있었는데 보여주질 않았던 거라, 마치 창고에 쌓아둔 식재료를 드디어 요리한 느낌이랄까요.
그리고 WXT 0.19가 world:'MAIN' content script를 manifest에 등록하지 않는 버그도 잡았습니다. chrome.scripting.registerContentScripts()로 동적 등록하는 방식으로 우회해서, 네트워크·콘솔·에러·React 트리 등 페이지 컨텍스트 메타데이터 수집이 정상화됐습니다. (―프레임워크 버그를 만나면 잠깐 좌절하지만, 돌아가는 우회로를 찾았을 때의 쾌감은 또 꽤 괜찮습니다.)
쇼핑몰 G 쪽에서는 상품목록과 상세 페이지가 머지되면서 +1245줄이 들어왔고, 장바구니·주문 페이지의 CSS를 데스크탑과 모바일 양쪽에서 다듬었습니다. 매거진에 문예공모전 섹션도 추가. 쇼핑몰은 이런 디테일의 축적이 결국 전체 완성도를 만든다고 믿습니다.
좋은 코드를 지우는 건 아깝지만, 불필요한 코드를 남기는 건 빚입니다.