1주일일만에 서비스 오픈하기 | ColdRain
Post

1주일일만에 서비스 오픈하기

신규 서비스를 기획해서 오픈했다. 카카오톡 채팅 기반으로 AI가 분석 후 리포트를 만들어주는 서비스다.

내가 필요해서 만든것도 있고, 시장에 의외로 특화된 앱들이 잘 안보이기도 하고, 틈새시장도 털어볼겸 결제도 붙여서 한번 나가봤다.

이번에도 개발은 대부분 클로드한테 맡겼고, 스택은 아래와 같다.

  • 프론트: Vue3, Vuetify, Pinia, PWA, Cloudflare Pages
  • 백엔드: FastAPI, Google Cloud Run, Cloud Tasks
  • DB/스토리지: Supabase(Postgres + private Storage)
  • AI: Gemini Flash-Lite (컨텍스트 캐싱)
  • 결제: 그로블
  • 모니터링: Sentry

그래도 내가 디버깅이 가능한 프론트 프레임워크가 뷰였고, 백엔드는 심플심플하게 가고 싶어서 파이썬으로 작성해봤다. 그리고 제미나이 콜을 제외한 모든 인프라를 비용 없이 운영 가능하도록 세팅해놨다. 수파베이스가 무료 티어라 일정시간 요청이 없으면 잠들기 때문에, 스케줄러를 통해 주기적으로 요청을 보내도록 설정했다. 백엔드에 구글 클라우드 스케줄러? 라는걸 사용한 것 같은데, 클로드가 설정해놔서 잘 기억이…. 과금이 발생한다면 깃헙 액션으로 돌려도 충분할 것 같다.

개발 중에 클라우드 태스크를 사용해야 한다고 클로드랑 gpt가 권유해서 논의를 해봤다. 이게 굳이 필요한 리소스인가 생각했는데 클라우드 런의 작동 구조상 필요한 듯 하다. 나는 ‘파이썬 비동기 태스크로 빼놓으면 알아서 처리되지 않겠니?’ 라고 물어봤고, 그에 대한 클로드의 응답은 다음과 같다.

1
2
3
4
5
6
7
8
9
10
asyncio.create_task()나 FastAPI BackgroundTasks로 던지고 응답을 먼저 주자는 거죠.
로컬에서는 완벽하게 돌아갑니다. Cloud Run에서는 두 가지 이유로 죽습니다:

1. CPU 스로틀링. Cloud Run(요청 기반 과금)은 처리 중인 요청이 있을 때만 CPU를 보장합니다.
응답을 반환하는 순간 인스턴스의 CPU가 사실상 0으로 조여져요. 백그라운드 태스크는 죽는 게 아니라 얼어붙습니다
— Gemini 호출 16개가 허공에 매달린 채로요. 하필 BackgroundTasks가 실행되는 시점이 정확히 "응답 이후"라, 이 함정에 정조준으로 걸립니다.

2. 인스턴스 소멸. 응답이 끝난 인스턴스는 플랫폼이 언제든 회수할 수 있습니다(스케일 다운, 배포, 그냥 재배치).
회수되면 진행 중이던 잡은 흔적도 없이 사라져요. 우리 상품은 19,000원을 이미 받은 상태에서 5분을 돌립니다
— "가끔 리포트가 조용히 증발함"은 환불+후기 참사지 엣지케이스가 아닙니다.

요약해보면 http 요청 단위로 리소스가 할당되는 것 같고, 해당 요청에서 생성한 태스크들은 생존 여부가 불투명해서 그런듯하다. 클라우드 태스크에 생성한 보고서의 아이디를 전달해주고, 우리쪽 서버로 http 요청을 보낸다. 일종의 http 클라이언트처럼 작동하는듯 하다. 만약 내 백그라운드 태스크가 도는 동안 우연히 다른 사용자의 요청이 들어와 있으면 CPU가 살아 있어 태스크가 처리된다. 단일 인스턴스가 계속 구동되고 있는 구조면 크게 고민할 게 없는데, 인스턴스가 껏다 켜졌다하면서 오토스케일링도 되기 때문에 안정적인 결과물 생성을 위해서는 클라우드 태스크가 필요했다.

클로드와 대화중에 클라우드 런이 서버리스라길래 aws 람다같은건가 하고 물어봤는데 또 그건 아니란다. 나도 헷갈려서 표로 정리해달라고 했다. 리소스 할당, 해제 정책에서 차이가 제법 있는 것 같다.

 AWS LambdaCloud Run (요청 기반, 우리)Cloud Run (CPU 상시 할당)
배포 단위함수(+ 레이어)컨테이너컨테이너
코드 형태핸들러 시그니처 / 어댑터 필요FastAPI 그대로FastAPI 그대로
동시성인스턴스 1개 = 요청 1개인스턴스 1개 = 요청 여러 개(기본 80)동일
실행 환경 재사용✅ 웜 스타트(순차)✅ (동시 공유)
응답 후 CPU동결(freeze)거의 0으로 조임(throttle)계속 할당
다른 요청이 CPU를 살리나❌ 겹칠 수가 없음같은 인스턴스면 풀림해당 없음
백그라운드 작업 결과항상 실패가끔 성공 ← 제일 위험대체로 성공하나 보장 아님
스케일 투 제로✅ (인스턴스 도는 동안 과금)
최대 실행 시간15분60분(우리 960초)60분
과금호출 × 실행시간요청 처리 중에만인스턴스 살아있는 내내

내가 생각하던 기획이 어느정도 있어서 개발은 클로드랑 티키타카 하면서 원활하게 잘 진행되었는데, 하나 고생했던 부분이 앱간 파일 공유 처리였다.

image

하단의 공유할 앱에 내가 만든 어플이 떠야하는데, 클로드도 며칠을 해결을 못했다. 그와중에 어떻게든 이 문제를 해결해보겠다고 자꾸 네이티브 앱개발을 하자는 헛소리(?)를 하길래 혼을 좀 냈다. 나도 인터넷 글들을 여러개 찾아봤는데, 매니페스트의 share_target쪽 action을 상대경로로 쓰지 말고 절대경로로 썼더니 해결되었다는 글들이 보여서 시도해봤다.

1
2
action: '/share-target' ## xxx
action: 'https://도메인.com/share-target' ## ooo

공유가 일부 해결은 되었는데, .txt 파일만 죽어도 공유가 안뜨길래 어쩔수 없이 accept: ‘/‘을 때려버렸다. 채팅 파일 공유가 앱에서 바로 뜨지 않으면 안드로이드는 사용성이 너무 불편해져서 어쩔 수 없었다.

DB는 수파베이스 썼다. 무료 플랜에서 상업적 용도로 사용해도 별말 안하고, 1주일동안 요청이 없으면 강제로 샷다 내린다고 해서 숙면 금지를 위해 스케줄러로 요청 가게 걸어놨다.

결제, 특히 단가 책정 부분이 민감하긴 한데 내가 여기에 서비스명을 공개하지는 않을거니까 적어도 괜찮겠지 싶다??? ai 보고서 생성하는데 대략 200원 정도 든다. Gemini 3.5 Flash Lite 사용중이고, 16번정도 콜이 나간다. 채팅 원문을 매번 어떻게 참조해야 토큰 비용을 세이브할까 고민이 깊었는데, 클로드가 자신있게 자기가 캐싱처리해서 비용 절감 가능하대서 맡겨봤다. 대략 흐름은 이렇다.

  1. 대화를 Files API로 올림 (_upload_transcript)
    1
    2
    3
    
    file_resource = await self._client.aio.files.upload(
     path=tmp_path, config={"mime_type": "text/plain"}
    )
    
  2. 그 파일 + 페르소나를 캐시로 굳힘 (_create_cache)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    cache = await self._client.aio.caches.create(
     model=self._settings.gemini_model,
     config={
         "system_instruction": PERSONA_PROMPT,
         "contents": [{"role": "user", "parts": [file_part, {"text": context_text}]}],
         "ttl": f"{_CACHE_TTL_SECONDS}s",
     },
    )
    return cache.name   # ← 이 이름이 열쇠
    
  3. 16번의 호출은 지시문만 보내고 캐시를 이름으로 지목
1
2
3
4
5
6
if cache_name:
    # 캐시에 페르소나·대화·지표가 이미 들어있으므로 섹션 지시문만 보낸다.
    return [{"role": "user", "parts": [{"text": prompt}]}]
## ...
if cache_name:
    config["cached_content"] = cache_name  

사실 보고서 가격이 원가 생각하면 좀 깡패같긴 한데 ㅋㅋㅋㅋ 19,000원으로 책정했다. 난 아예 39,000원이나 9,900원으로 생각중이었다. 고급화로 가던지 저렴이로 가던지. 근데 내가 마케팅이나 홍보는 문외한이다 보니, 어떤 방법으로 어떻게 접근해야 유저들에게 최대한의 효용을 뽑아낼지를 모르겠어서 클로드 팀을 꾸렸다. 마케팅, 시장조사, 그리고 우리 서비스를 리뷰해줄 소비자 팀들을 꾸려서 피드백 루프를 돌려봤고 19,000원을 추천해주더라.

카카오톡 분석 카테고리로 가면 우리가 9,900원을 받아도 시장 경쟁력이 아예 없을거고(이미 무료로 어느정도 분석해주는 서비스들 존재), 차라리 상담 카테고리로 포함되게 하면 오히려 저렴해 보일수 있다는 의견이었다. 보통 전문가에게 상담을 받는다면 단가가 시간대비 엄청나기 때문에 설득력있게 들렸다. 허점이 있다면 상담은 양방향이지만, 우리는 단방향 소통이라는점?? 뭐 그래서 가격도 반쪽만 받으니까.

결제 플랫폼 붙인 얘기도 쓰고싶긴한데 이건 지금 내 상황에서 문제가 될 소지가 다분한 방식이라… 일단 말을 아끼겠다. 만약 이 글을 읽고 궁금하다면 연락 바람. 상세히 설명 가능.

홍보는 인스타 광고로 진행할 예정이다. 관련 컨텐츠도 물론 클로드에게 시켰다. 릴스도 만들어보려고 제미나이 tts랑 이미지 생성 짬뽕해서 시켜봤는데 퀄리티가 아쉬웠다. 역시 동영상에는 ai라도 사람 형상이 나오는게 설득력있는것 같다.

image

대략 이런 느낌의 시나리오 이미지들로 구성했다. 썸, 재회같은 카테고리가 잘 먹힌다길래 그쪽 위주로 만들었다.

이번에 느낀건데, 작은 창업의 황금기가 열린 것 같다. 물론 내가 개발자니까 조금 더 빨리 끝난걸수도 있지만, 아이디어를 구체화해서 개발, 운영 인프라를 띄우는데까지 정말 시간이 말도안되게 줄었다. 같은 1인 개발인 맵샷 개발해서 운영하던 때를 생각해보면 정말 말도 안되는 속도, 퀄리티다. 너무나도 빠른 시간에 그럴싸한 결과물을 내놓을 수 있었다.

코드를 짜는게 즐거워서 개발자가 되었다고 생각했는데, 어쩌면 나는 뭔가를 만드는게 더 즐거웠던 것일수도?? 그 과정에 코딩이 있다보니 배우게 된거지, 내가 정말 깊이 몰입하던 순간은 기능, 서비스, 프로덕트의 코드를 치는 그 순간이라기보다 기획, 개발, 운영을 하며 내 손을 거쳐간 무엇인가가 잘 작동하는, 그 순간에 즐거움을 느꼈나보다.

인스타 홍보 잘 되서 떼돈 벌면 좋겠다~~

This post is licensed under CC BY 4.0 by the author.

© . Some rights reserved.

Using the Jekyll theme Chirpy