손가락을 따라오는 달력 — 「식단서랍」의 월간 식단과 함께 쓰는 달력
달력을 옆으로 밀었는데 아무 일도 없다가, 손을 떼는 순간 갑자기 다음 달로 넘어갔다. 동작은 맞았지만 손에 붙지 않았다. 손가락을 따라 움직이다 넘어가거나 되돌아오는 달력을 만들고, 그 달력을 가족과 함께 쓰게 되기까지의 이야기다.
애드소프트 기술블로그
애드소프트 박재호입니다. IIS·ASP.NET 웹 서비스와 메일서버를 직접 운영하고, Unity 게임과 데스크톱 앱을 만들며 겪은 문제와 해결 과정을 기록합니다.
달력을 옆으로 밀었는데 아무 일도 없다가, 손을 떼는 순간 갑자기 다음 달로 넘어갔다. 동작은 맞았지만 손에 붙지 않았다. 손가락을 따라 움직이다 넘어가거나 되돌아오는 달력을 만들고, 그 달력을 가족과 함께 쓰게 되기까지의 이야기다.
오래된 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 가 아니었다.