Skip to content

App Store 첫 제출 리젝 — 4가지 사유와 대응 정리

나닮 앱을 처음으로 App Store에 제출했다가 2026년 3월 3일 리젝당했다. v1.24.x 제출, 4가지 가이드라인 위반이었고, 코드 수정 3건과 Resolution Center 답변 2건으로 대응해서 v1.25.0으로 다시 넣은 상태다. 같은 실수 하지 말라고, 그리고 나중에 다시 읽으려고 정리해 둔다.


리젝 사유 한눈에

#Guideline내용어떻게 맞췄는지
15.1.1 — Data Collection성별을 필수로 받는데 서비스에 필수 아님성별을 선택 입력으로 변경
25.1.1(i) & 5.1.2(i)AI(OpenAI)로 데이터 보내는데 명시적 동의 없음가입 시 AI 데이터 처리 동의 체크박스 + DB 저장
31.5 — Customer Support고객 지원 페이지/연락처 없음/support 페이지 추가 (문의 메일, FAQ, 정책 링크)
42.1 — App Completeness코드에 프리미엄/구독 있지만 실제 결제 없어 보임코드 수정 없이 Connect에서 “현재 전부 무료” 설명만 답변

1·2·3은 코드로, 4는 답변만으로 처리했다.


성별 필수 입력 제거

리뷰어 피드백은 “성별이 서비스 제공에 필수인가?”였다. 우리는 아바타 생성(GPT Image API)에 성별을 쓰기 때문에 넣었는데, 필수로 두면 5.1.1에 걸린다. 수집 자체를 없애기보다 선택 입력으로 바꾸는 쪽으로 갔다.

백엔드는 이미 gender가 optional이었으니, 프론트만 손댔다. ProtectedRoute, RegisterPage, CompleteProfilePage, CompleteRequiredProfilePage에서 성별 필수 검증을 빼고, GenderSelect 라벨을 "성별 (선택)"으로 바꿨다. 변경 범위가 작아서 금방 끝났다.


AI 데이터 공유 — 명시적 동의 받기

이게 제일 손이 많이 갔다. 일기·감정 데이터가 OpenAI로 나가는데, 가입 시 “AI에 데이터 쓴다”는 명시적 동의를 받지 않았다는 지적이었다. 5.1.1(i), 5.1.2(i) 쪽이다.

해결 방향은 하나다. 회원가입(이메일 가입 + OAuth 프로필 완성) 시점에 체크박스 하나로 동의를 받고, DB에 “동의 여부 + 동의 시각”을 남기는 것.

백엔드에서는 User에 ai_consent, ai_consent_at 컬럼을 추가하고, POST /auth/register, POST /auth/oauth/complete-profile에서 ai_consent=True가 아니면 400을 주도록 했다. 기존 사용자는 마이그레이션에서 ai_consent=false로 두었고, 당시 약관으로 묵시 동의했다고 보는 운영 판단이다. 한 번 True로 바꾼 뒤에는 취소하지 못하게 하고, PATCH /users/me에서 True로 바꿀 때만 ai_consent_at을 갱신한다.

프론트에서는 “AI 데이터 처리 동의” 문구 + OpenAI로 전송되는 데이터·목적·“학습에 사용 안 함” 요약을 넣고, 개인정보처리방침 “위탁 및 AI 데이터 처리” 섹션을 보강했다. RegisterPage, CompleteProfilePage, CompleteRequiredProfilePage 세 군데에 같은 체크박스를 넣었다. 이미 동의한 사용자(ai_consent === true)에게는 CompleteRequiredProfilePage에서 체크박스를 안 보이게 했다.

동의 메커니즘은 언제 누가 동의했는지 남겨 두는 게 나중에 감사·문의 대응에 도움이 된다. timestamp까지 저장해 두자.


고객 지원 페이지 추가

Support URL이 이용약관을 가리키고 있어서, “고객 지원이 없다”는 리젝이었다. 앱 안에 문의 방법이나 FAQ가 있어야 한다는 뜻이다.

/support 전용 페이지를 하나 만들었다. 문의 이메일([email protected], 24시간 내 응답), FAQ 6개(페르소나 생성·진화, 친구 일기 비공개, AI 데이터 전송, 계정 삭제, 비밀번호 초기화), 앱 버전·운영사·관련 정책(이용약관, 개인정보처리방침, 결제 정책) 링크를 넣었다. App에 public 라우트 추가하고, 설정 화면 정보 섹션에 “고객 지원” 링크를 걸었다. App Store Connect의 Support URL은 https://nadarm.com/support처럼 실제 지원 페이지로 바꿔줘야 한다.


프리미엄/구독 코드 — 답변만 제출

코드에 FREE/PREMIUM, PremiumPage 같은 게 있어서 리뷰어가 “결제가 어떻게 되나요?”라고 물어왔다. 실제로는 IAP·구독·결제 처리는 전혀 없고, is_premium()이 지금은 항상 True를 반환하는 상태다.

코드는 건드리지 않고, Resolution Center에서 영문으로만 답변했다. “현재 모든 기능 무료, IAP·구독 없음, 코드는 추후 Apple IAP 도입을 위한 것”이라고 구체적으로 적었다. 이렇게 “지금 버전에서는 유료 없음”을 명확히 쓰면, 코드에 결제 관련 뼈대만 있어도 통과하는 경우가 많다.


정리할 때 쓴 것들

  • 불필요한 필수 수집: 서비스에 꼭 필요하지 않은 개인정보는 필수에서 빼거나 선택으로 두는 게 안전하다.
  • AI 쓰면 동의: 어떤 데이터가 어디로 가는지, 가입/최초 사용 시점에 명시적 동의(체크박스 권장)를 받고, DB에 기록해 두자.
  • 고객 지원: Support URL은 이용약관이 아니라 실제 문의·FAQ 페이지를 가리켜야 하고, 앱 내에서도 지원 링크를 두는 게 좋다.
  • 미사용 결제 코드: 있으면 리뷰어가 질문한다. “현재는 무료이고, 코드는 향후 대비”라고 영문으로 짧고 기술적으로 답변해 두면 된다.

코드 수정과 Connect 답변을 같이 준비해서 다시 제출하면, 재심사가 비교적 빨리 돌아온다. 답변은 영문으로, 구체적으로 쓰는 게 좋다. 우리도 이렇게 하고 v1.25.0 재제출했고, 결과 나오면 그다음에라도 후속 포스트로 남겨볼 생각이다.

삽질 테크 블로그