기능이 늘어날수록 앱이 진짜처럼 느껴진다

5편에서 Gemini API 연동에 성공하면서 재료 인식과 레시피 추천이 작동하기 시작했다. 하지만 그것만으로는 반쪽짜리 앱이었다. 레시피를 추천받아도 재료를 사러 어디를 가야 하는지, 추천받은 요리를 다음에 또 보려면 어떻게 해야 하는지, 냉장고 속 재료가 언제 상하는지 알 수 없었다. 처음 기획했던 6가지 기능 중 아직 절반이 남아 있었다.

6편에서는 k냉털을 진짜 앱으로 완성하는 과정을 담는다. 쿠팡 파트너스 연동으로 수익 구조를 만들고, 유통기한 관리로 재료 낭비를 줄이고, 장보기 리스트와 레시피 저장 기능을 추가하면서 처음 기획했던 모든 기능이 완성되기까지의 과정이다. Gemini API 연동 과정은 5편에서 자세히 다뤘다.

k냉털의 핵심 기능 완성은 크게 4가지입니다

5편까지 구현된 재료 인식과 레시피 추천에 이어 이번 편에서 추가할 기능은 크게 네 가지다. 각각의 기능이 단순히 추가되는 것이 아니라 앱 전체의 흐름을 완성하는 역할을 한다.

첫 번째 — 쿠팡 파트너스 연동

레시피를 추천받았을 때 부족한 재료를 바로 구매할 수 있는 기능이다. 사용자 입장에서는 앱을 벗어나지 않고 필요한 재료를 바로 살 수 있어 편리하고, 개발자 입장에서는 쿠팡 파트너스 수수료로 수익이 생기는 구조다. 앱의 실용성과 수익화를 동시에 해결하는 기능이었다.

두 번째 — 유통기한 관리

k냉털을 만들게 된 출발점이 냉장고 재료를 버리는 일을 줄이는 것이었다. 재료를 등록할 때 유통기한을 함께 입력하면 만료가 임박한 재료를 상단에 표시하고 색상으로 경고해주는 기능이다. D-3일은 노란색, D-1일은 주황색, 만료된 재료는 빨간색으로 표시해서 한눈에 파악할 수 있게 했다.

세 번째 — 장보기 리스트

레시피를 추천받고 나면 집에 없는 재료들이 생긴다. 그 재료들을 탭 한 번으로 장보기 리스트에 추가하고, 마트에서 구매하면 체크해서 지울 수 있는 기능이다. 냉장고 재료 관리부터 요리 추천, 장보기까지 하나의 흐름으로 연결되는 것이 k냉털이 목표로 하는 방향이었다.

네 번째 — 레시피 저장

AI가 추천한 레시피 중 마음에 드는 것을 저장해두고 나중에 바로 꺼내볼 수 있는 기능이다. 매번 재료를 입력해서 추천받을 필요 없이 자주 만드는 요리를 저장해두면 된다. 저장된 레시피는 날짜순으로 정렬해서 보여준다.

k냉털 핵심 기능 4가지 완성 화면

쿠팡 파트너스 연동 과정은 크게 3단계입니다

쿠팡 파트너스 연동은 기술적으로 어렵지 않았다. 하지만 처음 해보는 과정이라 생각보다 시간이 걸렸다. 세 단계로 나눠서 진행했다.

첫 번째 단계 — 가입과 링크 발급

쿠팡 파트너스는 쿠팡 계정이 있으면 바로 신청할 수 있다. 심사 없이 즉시 가입되고 링크를 바로 발급할 수 있다는 점이 좋았다. 앱에서 사용할 재료별 대표 상품 링크를 미리 발급해두는 방식으로 진행했다. 닭고기, 두부, 계란, 당근 등 자주 등장하는 재료들의 베스트셀러 상품 링크를 미리 준비했다.

두 번째 단계 — 레시피 화면에 구매 버튼 연결

Claude에게 "레시피 결과 화면에서 재료 목록을 보여줄 때, 각 재료 옆에 쿠팡 구매 링크 버튼을 추가해달라"고 요청했다. 단순히 링크를 붙이는 것이 아니라 사용자가 입력한 재료 목록과 레시피에 필요한 재료를 비교해서 집에 없는 재료에만 구매 버튼이 표시되도록 구현했다. 모든 재료에 링크가 달리면 광고처럼 보일 수 있기 때문이었다.

세 번째 단계 — 수익이 생기는 구조

쿠팡 파트너스는 링크를 클릭한 후 24시간 이내에 구매가 이루어지면 수수료가 발생한다. 상품 카테고리마다 수수료율이 다르지만 식품 카테고리는 보통 2~3% 수준이다. 앱 사용자가 레시피를 보고 재료를 구매하는 흐름이 자연스럽게 연결되기 때문에 전환율이 다른 플랫폼보다 높을 것이라고 기대했다. 실제 수익은 앱이 출시된 후에야 확인할 수 있었다.

유통기한·장보기·저장 기능 구현하기

세 가지 기능을 한꺼번에 구현하려다 보니 코드가 복잡해졌다. Claude에게 한 번에 다 만들어달라고 하지 않고 기능 하나씩 순서대로 요청하는 방식으로 진행했다.

유통기한 D-day 표시

재료를 등록할 때 유통기한 날짜를 입력하면 오늘 날짜와 비교해서 D-day를 자동으로 계산하는 기능이다. Claude에게 "재료 목록에 유통기한 입력 필드를 추가하고, 오늘 날짜와 비교해서 D-3 이하는 노란색, D-1 이하는 주황색, 만료된 것은 빨간색으로 표시해달라"고 요청했다. 코드 자체는 간단했지만 날짜 계산 로직에서 시간대 오류가 발생해서 수정하는 데 시간이 걸렸다. 한국 시간대(UTC+9)를 명시적으로 설정하고 나서야 정상적으로 작동했다.

장보기 리스트 자동 생성

레시피 화면에서 재료를 탭하면 장보기 리스트에 추가되는 기능이다. 리스트에 추가된 재료는 별도의 장보기 탭에서 확인할 수 있고, 구매한 재료는 체크해서 지울 수 있다. Claude에게 이 흐름을 설명하고 코드를 요청했더니 로컬스토리지를 활용한 간단한 구조로 구현해줬다. 앱을 껐다 켜도 리스트가 유지되는 점이 중요했다.

레시피 저장과 불러오기

AI가 추천한 레시피를 저장하는 기능은 생각보다 구현이 까다로웠다. 레시피가 매번 AI가 생성하는 텍스트 형태라 구조화된 데이터로 저장하기 위한 파싱 작업이 필요했다. Claude에게 "AI 응답에서 요리 이름, 재료 목록, 조리 순서를 각각 분리해서 JSON 형태로 저장하는 코드를 만들어달라"고 요청했다. 몇 번의 수정 끝에 저장과 불러오기가 안정적으로 작동하기 시작했다.

k냉털 유통기한 장보기 레시피저장 기능 화면

모든 기능이 완성된 날

유통기한 관리, 장보기 리스트, 레시피 저장, 쿠팡 파트너스 연동까지 마지막 기능이 작동하는 것을 확인한 날은 처음 기획했던 6가지 기능이 모두 완성된 날이었다. 노트에 적었던 기능 목록에 하나씩 체크 표시를 해나가다가 마지막 항목에 체크를 하던 그 순간이 기억난다.

하지만 이 과정이 순탄하지만은 않았다. 기능이 늘어날수록 코드가 복잡해졌고, Claude 사용량 한도가 가장 중요한 순간에 차는 경우가 반복됐다. 한 기능을 완성하고 다음 기능으로 넘어가려는 순간 한도가 차면 몇 시간을 기다렸다가 다시 시작해야 했다. 다시 시작할 때마다 이전 코드 구조와 맥락을 Claude에게 처음부터 설명하는 과정이 반복됐다. 3개월이라는 개발 기간이 길어진 이유 중 상당 부분이 바로 이 대기 시간이었다. 기획 단계에서 정했던 6가지 기능 목록은 3편에서 확인할 수 있다.

k냉털 모든 기능 완성 화면

기능은 완성됐다, 이제 앱으로 만들어야 한다

k냉털의 핵심 기능은 크게 네 가지였다. 쿠팡 파트너스 연동, 유통기한 관리, 장보기 리스트, 레시피 저장. 이 네 가지가 완성되면서 처음 기획했던 모든 기능이 웹앱 형태로 구현됐다.

하지만 웹앱은 브라우저에서만 실행된다. 구글 플레이스토어에 올리려면 안드로이드 앱 형태가 필요했다. 당시 선택한 방법이 TWA(Trusted Web Activity)였다. 웹앱을 그대로 앱처럼 포장하는 방식이라 추가 개발 없이 빠르게 앱을 만들 수 있다는 장점이 있었다. 하지만 이 선택이 예상치 못한 문제로 이어졌다. 다음 편에서는 TWA로 앱을 만들고 구글 플레이에 제출했다가 거부당한 과정을 솔직하게 담을 예정입니다.