Repasta v2.0 개발기 — 역변환과 Vision OCR
인스타그램 → 블로그 역변환, Vision OCR, 카카오 로그인까지. Repasta v2.0에서 무엇을 만들었고 어떤 결정을 내렸는지.
v1에서 v2로
Repasta v1은 블로그 → 인스타그램 단방향 변환 도구였다. 출시 후 가장 많이 받은 피드백은 “반대로도 되나요?”였다. 인스타그램 캡션과 이미지를 블로그 글로 변환하고 싶다는 수요가 확인됐다.
v2의 목표는 단순했다. 양방향 변환을 완성하는 것.
역변환이 어려운 이유
블로그 → 인스타는 정보를 압축하는 작업이다. 3,000자 글에서 핵심을 뽑아 500자 캡션으로 만든다. 반대로 인스타 → 블로그는 정보를 확장해야 한다. 500자 캡션에서 1,500자 블로그 글을 만들려면 원문에 없는 맥락을 채워야 한다.
해결 방법:
- 여러 캡션 종합 — 같은 주제의 캡션 여러 개를 입력받아 정보량 확보
- Vision OCR — 이미지 속 텍스트를 추출해 추가 컨텍스트로 활용
- 프롬프트에 톤/구조 가이드 삽입 — 사용자가 원하는 블로그 스타일을 명시
Vision OCR 구현
인스타그램 캐러셀 이미지에는 텍스트가 많다. 정보성 계정일수록 이미지에 핵심 내용을 담는다. 이 텍스트를 캡션만으로는 알 수 없다.
const extractTextFromImage = async (imageUrl: string) => {
const model = genAI.getGenerativeModel({ model: 'gemini-2.5-flash' });
const result = await model.generateContent([
{ text: '이 이미지에서 모든 텍스트를 추출하세요. 레이아웃 순서대로 줄바꿈으로 구분.' },
{ inlineData: { mimeType: 'image/jpeg', data: base64Image } },
]);
return result.response.text();
};
Gemini 2.5 Flash의 멀티모달 기능을 사용했다. 한국어 텍스트 인식 정확도가 높고, 배경이 복잡한 인스타 이미지에서도 안정적으로 동작한다. 다만 비용이 텍스트 전용보다 높아서 Pro 전용 기능(월 10회)으로 제한했다.
카카오 로그인 추가
v1은 Google OAuth만 지원했다. 한국 사용자 비율이 높은 서비스에서 Google 로그인만 제공하는 건 진입 장벽이다. Supabase Auth에 카카오 provider를 추가했다.
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'kakao',
options: {
redirectTo: `${origin}/auth/callback`,
},
});
Supabase가 카카오 OAuth를 네이티브로 지원해서 구현 자체는 간단했다. 다만 카카오 비즈앱 등록과 브랜드 가이드라인 준수(로그인 버튼 색상, 로고 규격)에 더 많은 시간이 들었다.
Sentry 도입
v1에서는 에러를 Vercel 로그로만 추적했다. 사용자가 “변환이 안 돼요”라고 할 때 어떤 에러인지 파악하기 어려웠다. Sentry를 붙이고 나서 에러 재현 → 수정 사이클이 크게 단축됐다.
실제로 도입 직후 발견한 버그: 5MB 이상 이미지를 업로드하면 서버 사이드에서 조용히 실패하는 문제. Sentry 없었으면 사용자 리포트 없이는 찾기 어려웠을 것이다.
수치로 보는 v2
- 역변환 기능 출시 후 일일 변환 횟수 40% 증가
- Vision OCR 사용률: Pro 사용자 중 35%가 첫 주에 사용
- 카카오 로그인: 전체 신규 가입의 45% 차지
배운 점
역변환은 단순히 “방향을 바꾸는 것”이 아니었다. 정보 확장이라는 근본적으로 다른 문제를 풀어야 했고, Vision OCR이라는 새 입력 채널이 핵심이었다. 사용자 피드백(“반대로도 되나요?”)이 제품 방향을 결정한 좋은 사례다.