고치지 않고 밀어 두었다 — MVC 5 앱을 .NET 9 로 옮긴 아홉 걸음
오래된 MVC 5 앱을 고쳐 쓰는 대신 통째로 legacy/ 폴더에 밀어 두고 빈 솔루션부터 다시 시작했다. 옮기는 길에 테이블 이름 하나가 시드 SQL 을 깨뜨렸고, MySQL 은 인증 방식을 바꿨고, 별표 하나가 패키지 버전을 메이저째 끌어올렸다.
오래된 MVC 5 앱을 고쳐 쓰는 대신 통째로 legacy/ 폴더에 밀어 두고 빈 솔루션부터 다시 시작했다. 옮기는 길에 테이블 이름 하나가 시드 SQL 을 깨뜨렸고, MySQL 은 인증 방식을 바꿨고, 별표 하나가 패키지 버전을 메이저째 끌어올렸다.
미뤄 둬도 결국 다시 돌아오는 질문이 있다. "오늘은 뭐 먹지?" 그 질문을 기록으로 바꿔 보려고 만든 「식단서랍」은 레시피, 월간 식단 달력, 장보기 목록 세 갈래로 되어 있다. 첫 편은 그 세 갈래를 잇는 데이터 모델 이야기다.
「무슨 재미가 있는 건지 모르겠다」고 말한 바로 다음, 나는 「웹에서도 플레이 가능하도록 할 수 있어?」라고 물었다. □□□로 깨지는 한글, 가로로 누운 캔버스, 탭을 닫으면 사라지는 세이브를 고쳐 브라우저로 직접 해 본 날, 「호구마트」는 거기서 멈췄다. 연재의 마지막 편.
흰 사각형 열두 줄이 나무 바닥 상점으로 바뀌던 순간은 이 프로젝트에서 가장 신났던 장면이다. AI 가 추천한 에셋을 사고, 코드로 상점을 짓고, 5,600장 아이콘에서 40개를 골라 붙였다. 한참 뒤 세어 보니 들여온 이미지 6,303장 중 화면에 나온 건 51장이었다.
다른 창을 클릭했더니 내 가게가 멈췄다. 손님도, 매출도, 시간도. 직접 플레이하다 찾은 이 버그는 "온라인도 오프라인도 아닌 죽은 시간"이었다. 방치형의 심장인 '자리 비운 사이 번 돈'을 공식 한 번으로 정산하는 코드, AI 가 짠 그 코드를 믿을 수 있게 해 준 규칙 한 줄과 테스트 이름, 그리고 '원자적'이라는 주석 뒤에 숨은 틈을 따라간다.
가상의 플레이어에게 30일을 시켰더니 환생을 1,521번 했다. 하루 쉰 번꼴이다. 원인을 둘로 쪼개 9번까지 끌어내리는 과정은 꽤 그럴듯한 추리극이었다. 그런데 범인을 잡고 나서 보니, 그 밸런스를 통과시킨 플레이어는 규칙 몇 줄짜리였다.
구조에 대해 한 마디도 하지 않았는데, 「호구마트」의 코드 구조는 처음 모습 그대로 끝까지 버텼다. 규칙 파일의 한 줄이 컴파일러에게 넘어갔기 때문이다. Unity 없이 도는 시뮬레이션, 3600초를 한 번에 돌려도 같은 결과, 가상 30일을 1초에 끝내는 테스트, 그리고 그 초록불이 끝내 말해 주지 않은 것.
지나가듯 던진 한 마디에 광고와 인앱 상점이 생겼다. Claude Code 는 수익화는 재미를 확인한 뒤에도 늦지 않다며 멈추자고 했고, 나는 거기에 답하지 않았다. 그래도 코드는 단단했다. 규칙 한 줄이 지킨 구조, 미뤄 둔 골드를 잃지 않는 법, 그리고 세 경로 중 두 곳에서 빠진 1.25배.
기획 문서에서 가장 좋아한 문장은 "싸구려 장비를 비싸게 팔면 용사가 죽는다"였다. 그 문장을 코드에서 찾아 나섰다가 손님 네 종류가 평균 한 명으로 녹아 있는 시뮬레이션, 가격표를 보지 않는 손님, 가격이 빠진 사망 확률 식을 만났다. 그리고 범인은 AI 가 아니었다.
테스트는 전부 통과했고, 세이브는 암호화까지 돼 있었다. 그런데 나는 내 게임에 "보석으론 뭘 할 수 있는 거지?"라고 묻고 있었다. Claude 와 기획하고 Claude Code 로 만든 첫 게임 「호구마트」가 출시되지 못한 이야기를 시작한다.