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






- 7 → 3해외 영어 팟캐스트에 연락해 받은 서면 사용 허락
- 월 20편편당 원가를 재고 흑자가 유지되는 선에서 정한 구독 상한
- 22 → 7합류 직후 감사에서 제기한 결함을 반론 검증으로 걸러 확정
TL;DR
문제
합류해 보니 앱의 약속은 아이폰에서 지킬 수 없었고 원가를 모르는 무제한 구독과 조용한 결함이 남아 있었습니다.
한 일
출시 책임자로 콘텐츠 공급 구조 · 요금제 · 결함을 다시 짜고 1.0과 1.1.0을 출시했습니다.
결과
해외 팟캐스트 7곳 중 3곳에서 서면 허락 · 월 20편 상한 · 결제와 캐시 결함 수정. 코드 밖의 문제까지 출시 범위로 다뤘습니다.
대표 사례
면접에서 가장 먼저 이야기하고 싶은 세 가지
구조 문제
앱의 약속을 아이폰에서 합법적으로 지킬 수 없었다
앱은 "좋아하는 영상이 영어 교재가 된다"고 약속했습니다. 하지만 아이폰에서는 영상 자막을 복사할 공식 경로가 없었고 서버가 대신 가져오는 길은 심사 지침으로 막혀 있었습니다. 조사한 경쟁 앱 8종 중 사용자가 자막을 가져오는 모델은 하나도 없었습니다.
연락 결과 · 2026.09
- 7연락 · 영상 채널 겸업 3 · 팟캐스트 4
- 4회신
- 3서면 허락 · 1곳 더 동의서 확인 대기
판정선은 보내기 전에 정했습니다
기준은 회신율이 아니라 서면 허락 2건이었습니다. 7곳으로는 비율을 추정할 수 없어 "받아 낼 수 있는가"만 묻는 시험으로 설계했습니다. 영상 채널은 응답이 없었고 팟캐스트는 3곳이 허락해 판정선에 따르면 팟캐스트 쪽입니다. 이어서 오디오 레슨 서버를 배포했습니다(2026.09.22).
권리를 증빙할 수 있는 콘텐츠로 공급 구조 전환 · 허락 범위와 철회를 서버 스키마에 반영 · 오디오 레슨 서버 배포
BM 검증
원가를 모른 채 무제한 구독을 약속하고 있었다
합류했을 때 요금제는 "무제한"이었고 편당 원가를 아는 사람이 없었습니다. 운영 DB의 문장 수와 호출 단가로 원가를 내고 가격 구조를 다시 짰습니다.
- 표본을 의심했다처음 낸 편당 $0.34는 문장이 많은 상위 8편에서 뽑은 값이었습니다. 완료된 22편을 전수 집계해 편당 174문장, $0.29로 고쳤습니다.
- 상한은 흑자가 유지되는 마지막 지점사용자마다 LLM을 호출하는 구조라 "무제한"은 쓸수록 적자입니다. 연간 요금제까지 흑자가 유지되는 월 20편을 상한으로 정했습니다. 저가 모델 없이 성립하는 선이라 A/B 결과에 기대지 않습니다.
- 팩이 구독보다 싸면 안 된다구독에 든 영상 몫을 편당 값으로 환산해 낱개 팩 가격의 하한으로 삼았습니다.
- 원가를 모르면 높게 시작실측이 없는 음성 기능은 가격을 높게 시작하고 첫 사용분으로 재기로 했습니다. 인하는 쉽고 인상은 기존 구매자에게 부담이기 때문입니다.
무제한 → 월 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곳은 허락률을 말할 수 있는 크기가 아닙니다. 허락을 받아 낼 수 있는지만 확인했습니다. 상대의 이름과 내용은 동의 없이 공개하지 않습니다.
