Modularized It, Then Put It Back
The day
하루에 26커밋. 커밋 제목만 순서대로 읽어도 무슨 일이 있었는지 보인다. · Restore original single-file version · Add complete modular components with enhanced services · Add main component and update dependencies — build issues remain · Work in progress: evaluationService syntax issue on line 192 · Restore to previous single-file version with all features 모듈로 나눴다가 되돌렸다.
Why I split it
가설은 흔한 것이었다. 한 파일에 다 들어 있으면 나중에 못 고친다. Firebase 를 붙이려면 서비스 층을 떼어내는 게 맞다고 봤다. 실제로 분리 계획 문서까지 썼다. 기능 체크리스트, 비교 분석, 배포 이슈 분석. 코드보다 문서를 먼저 만들었다.
Why it did not work
빌드가 깨졌다. 그것도 한 번이 아니라 계속. 마지막엔 evaluationService.js 192번 줄에서 막혀 커밋 제목에 그대로 적었다. 원인은 모듈화 자체가 아니었다. 한 파일 안에서 서로를 자유롭게 참조하던 것들이 파일 경계를 넘으면서 순환 참조와 초기화 순서 문제로 바뀐 것이다. 한 파일일 때는 그런 구조가 문제가 아니었으니 드러나지도 않았다. 구조를 나누기 전에 의존을 먼저 정리했어야 했다. 파일을 나누는 건 결과지 방법이 아니다.
되돌릴 수 있게 해두면 되돌리는 것도 선택지가 된다.
What I kept
되돌렸지만 그날이 헛되진 않았다. 같은 날 Gemini 평가를 붙이면서 로컬 평가를 폴백으로 남겼다. AI 가 죽어도 채점은 된다. 수업 중에 멈추면 안 되는 물건이라 그렇게 했다. Firebase 백엔드와 Firestore 보안 규칙, GitHub Actions 자동 배포도 그날 들어갔다. 분리하려던 서비스 층은 되돌렸지만, 그걸 만들면서 정리한 인프라는 남았다.
Would I do it again
다음에 같은 상황이면 파일을 먼저 나누지는 않을 것 같다. 의존 관계를 먼저 그려보고, 실제로 끊어지는 자리가 보이면 그때 나눈다. 안 보이면 한 파일로 두는 게 낫다. 142커밋짜리 프로젝트에 모듈 경계가 꼭 필요했는지는 지금도 모르겠다.