프로젝트
iOS · 2인 협업 · LangPickle

LangPickle코드 밖의 문제까지 출시 책임으로

내 영상으로 영어 따라 말하기를 하는 iOS 앱입니다. 제품 기능은 공동 개발자가, 출시와 운영은 제가 맡았습니다. 2026년 8월에 합류해 결함뿐 아니라 요금제와 콘텐츠 공급 구조까지 다시 짰습니다.

영상 추가 화면
영상 추가
한 문장씩 받아쓰기 화면
한 문장씩 받아쓰기
즐겨찾기 문장 화면
즐겨찾기 문장
소리 내 말하기 화면
소리 내 말하기
학습 기록 화면
학습 기록
배운 표현으로 대화 화면
배운 표현으로 대화
  • 7 → 3해외 영어 팟캐스트에 연락해 받은 서면 사용 허락
  • 월 20편편당 원가를 재고 흑자가 유지되는 선에서 정한 구독 상한
  • 22 → 7합류 직후 감사에서 제기한 결함을 반론 검증으로 걸러 확정

2인 협업 · 출시 · 운영 책임 · PR 75건2026.08 합류 · 1.0 2026.09.02 · 1.1.0 2026.09.18Swift · Cloudflare Workers · D1 · Queues · Claude API

TL;DR

문제

합류해 보니 앱의 약속은 아이폰에서 지킬 수 없었고 원가를 모르는 무제한 구독과 조용한 결함이 남아 있었습니다.

한 일

출시 책임자로 콘텐츠 공급 구조 · 요금제 · 결함을 다시 짜고 1.0과 1.1.0을 출시했습니다.

결과

해외 팟캐스트 7곳 중 3곳에서 서면 허락 · 월 20편 상한 · 결제와 캐시 결함 수정. 코드 밖의 문제까지 출시 범위로 다뤘습니다.

대표 사례

면접에서 가장 먼저 이야기하고 싶은 세 가지

구조 문제

앱의 약속을 아이폰에서 합법적으로 지킬 수 없었다

앱은 "좋아하는 영상이 영어 교재가 된다"고 약속했습니다. 하지만 아이폰에서는 영상 자막을 복사할 공식 경로가 없었고 서버가 대신 가져오는 길은 심사 지침으로 막혀 있었습니다. 조사한 경쟁 앱 8종 중 사용자가 자막을 가져오는 모델은 하나도 없었습니다.

선택지걸리는 점판정
현상 유지 + PC 안내합법이지만 아이폰 앱에서 PC를 쓰라는 안내기각
운영자가 자막 제작남의 영상에 붙인 자막은 2차 저작물이라 권리가 불분명기각
사용자 파일 가져오기합법이고 아이폰만으로 되지만 틈새 수요보류
크리에이터 서면 허락주 경로허락서가 곧 심사가 요구한 권리 증빙. 대신 연락 비용이 듦채택
팟캐스트 공개 자막백업제작자가 자막을 이미 공개 배포하고 있어 요청 비용이 낮음채택

연락 결과 · 2026.09

  1. 7연락 · 영상 채널 겸업 3 · 팟캐스트 4
  2. 4회신
  3. 3서면 허락 · 1곳 더 동의서 확인 대기

판정선은 보내기 전에 정했습니다

기준은 회신율이 아니라 서면 허락 2건이었습니다. 7곳으로는 비율을 추정할 수 없어 "받아 낼 수 있는가"만 묻는 시험으로 설계했습니다. 영상 채널은 응답이 없었고 팟캐스트는 3곳이 허락해 판정선에 따르면 팟캐스트 쪽입니다. 이어서 오디오 레슨 서버를 배포했습니다(2026.09.22).

권리를 증빙할 수 있는 콘텐츠로 공급 구조 전환 · 허락 범위와 철회를 서버 스키마에 반영 · 오디오 레슨 서버 배포

BM 검증

원가를 모른 채 무제한 구독을 약속하고 있었다

합류했을 때 요금제는 "무제한"이었고 편당 원가를 아는 사람이 없었습니다. 운영 DB의 문장 수와 호출 단가로 원가를 내고 가격 구조를 다시 짰습니다.

  • 표본을 의심했다처음 낸 편당 $0.34는 문장이 많은 상위 8편에서 뽑은 값이었습니다. 완료된 22편을 전수 집계해 편당 174문장, $0.29로 고쳤습니다.
  • 상한은 흑자가 유지되는 마지막 지점사용자마다 LLM을 호출하는 구조라 "무제한"은 쓸수록 적자입니다. 연간 요금제까지 흑자가 유지되는 월 20편을 상한으로 정했습니다. 저가 모델 없이 성립하는 선이라 A/B 결과에 기대지 않습니다.
  • 팩이 구독보다 싸면 안 된다구독에 든 영상 몫을 편당 값으로 환산해 낱개 팩 가격의 하한으로 삼았습니다.
  • 원가를 모르면 높게 시작실측이 없는 음성 기능은 가격을 높게 시작하고 첫 사용분으로 재기로 했습니다. 인하는 쉽고 인상은 기존 구매자에게 부담이기 때문입니다.
축 · 실문장 15개기존 모델 · Sonnet저가 모델 · Haiku
문체존댓말 / 평서체14 / 06 / 9 · 한 영상 안에서 섞임
핵심 어휘관용구 비율60%13% · No big deal → deal
원문 복원실패 수0 / 151 / 15
편당 원가추정$0.29 · 유지$0.10

무제한 → 월 20편 상한 · 저가 모델은 세 축에서 탈락해 기존 모델 유지 · 가격 4종 확정 · 원가는 실청구 대조 전 추정

결함

오류 화면 없이 조용히 틀리던 세 곳

세 곳 모두 화면에는 문제가 없었고 테스트도 통과했습니다.

결제

실제 영수증 100% 거부

Apple 루트 인증서 핀 지문이 틀려 결제한 사람만 실패했습니다. 테스트 3개는 위조 영수증 거부만 보고 있어 통과했습니다. 지문을 고치고 반대 방향 테스트를 붙였습니다.

LLM 캐시

5개월간 0행 → 194건

한 번에 바인딩 550개를 보내 D1 한도 100을 넘겼는데 예외가 경고로 삼켜지고 있었습니다. 배치 행 수를 한도에서 역산하게 고쳤습니다.

LLM 출력

누락이 15의 배수

배치 크기 15와 맞물려 JSON 형식 위반 하나가 배치 전체를 버린다고 특정했습니다. 복구는 3종으로 한정하고 잘린 응답은 실패로 처리합니다.

결제 · 비용 · 데이터 품질의 실패를 각각 테스트가 잡도록 전환

일하는 방식

기록은 원본으로 답할 수 있게

합류하자마자 Lunarc에서 쓰던 운영 체계를 옮겨 심었습니다. 연락으로 받은 허락도 같은 방식으로 기록합니다. 나중에 누가 물어도 원본으로 답할 수 있게 하는 것이 목적입니다.

기록 체계 이식 · 2026.08.12

티켓 코드 하나로 추적

Obsidian 보드 · 티켓 · 데일리 노트를 그대로 이식했습니다. 티켓 코드를 커밋과 PR에 남기고 완료는 제 승인으로만 닫습니다.

허락 대장

증빙은 메일 원본

발신자 · 날짜 · 서명 헤더가 남는 원본을 보관합니다. 모호한 승낙은 확인 회신까지 받아 왕복 두 통을 한 단위로 삼고 철회 요청은 7일 안에 반영합니다. 대상 선정과 판정은 제가, 문안 초안과 일부 발송은 승인을 거쳐 에이전트가 맡았습니다.

합류 감사

22 → 7 → 5

기능을 더하기 전에 코드부터 감사했습니다. 제기한 22건을 반론 검증으로 7건까지 거르고 출시 전에 5건을 고쳤습니다. 인계 문서 6편도 코드와 대조해 누락 3건과 사실 오류 5건을 바로잡았습니다.

그 밖의 결정

문제 → 결정 → 결과

  • 보안인증 없는 호출에 영상 23편이 노출되던 목록에 소유자 경계
  • 가용성안 쓰는 시크릿을 요구한 부트 가드가 영상 추가를 2주 멈춘 원인 특정 · 복구
  • 관측크래시를 한 건도 수집하지 못하던 출시 빌드에 Sentry 연결
  • 심사리젝 사유를 문구가 아니라 원인으로 대응 · 1.0과 1.1.0 출시
  • 테스트백엔드 테스트 65 → 256

한계

제 몫과 아직 확인하지 않은 것

  • 역할 범위제품 기능은 공동 개발자가 만들었습니다. 제 몫은 합류 뒤 감사 · 결함 수정 · 결제 · BM · 콘텐츠 공급 · 심사 · 관측입니다.
  • 원가편당 $0.29는 운영 DB의 문장 수와 단가로 낸 추정치입니다. 실제 청구액과는 아직 대조하지 않았습니다.
  • 표본연락 7곳은 허락률을 말할 수 있는 크기가 아닙니다. 허락을 받아 낼 수 있는지만 확인했습니다. 상대의 이름과 내용은 동의 없이 공개하지 않습니다.
연락
김성재 사진

함께 일할 팀을 찾고 있습니다

AI 엔지니어 · AX 엔지니어 정규직 포지션에 지원하고 있습니다. 편하게 메일 주세요.