AI용 분할본 · 지도 5단계(배포) · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침, PART 7 보안·테스트 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)
핵심 규칙 — AI 는 어느 페이지에서든 이것을 지킨다
node scripts/get-book-code.mjs 가 책 그대로 만든다(첫 실행은 부록 A-2 의 curl 한 줄). AI용 분할본의 코드 자리는 " 경로" 한 줄이다 — 그 파일을 cat 으로 읽는다. 고쳐도 되는 파일은 PART 0 [AI 시작 지침] 5-b 의 목록뿐이다.node scripts/verify-book-code.mjs 를 실행해 "불일치 0개" 출력을 그대로 보인다.이 장까지 해야 완성입니다. push 는 배포가 아닙니다 — push 뒤 RIDM Apps 가 빌드·자동 검사하고, 빌드가 성공해야 새 버전이 뜹니다(첫 배포도 바로 공개됩니다). 지금 떠 있는 버전은 /api/health 의 commit 으로 확인합니다(8-0 Dockerfile 이 빌드한 커밋을 넣어 둠). 시작 조건은 7-3 보안 점검 통과입니다. AI는 브라우저 기능이 있으면 콘솔을 직접 열어 단계별로 안내합니다. 사용자가 직접 하는 일은 약관 동의, GitHub 앱 설치 승인, 앱 주소 확정, (관리자 페이지를 켤 때) 환경변수 값 입력입니다. AI는 비밀번호나 비밀값을 요구·열람·출력하지 않습니다.
RIDM Apps는 저장소 루트의 Dockerfile로 빌드합니다. Next.js를 standalone으로 빌드해 가벼운 이미지로 만들고, 사용자 1000·포트 3000으로 실행합니다. 이 절의 네 파일을 책 그대로 씁니다. package.json의 버전은 이 책을 쓸 때 npm audit이 0건인 조합입니다. 그 뒤 새 취약점이 알려지면 npm run check의 마지막 단계(npm audit --audit-level=high)가 high 이상에서 멈추고, 낮은 등급은 목록만 찍고 통과합니다. 어느 쪽이든 package.json 은 고치지 않는다 — audit 결과를 완료 보고에 그대로 적고 책 개정(get-book-code --force)을 기다린다. package.json은 책 코드라 고치면 대조가 "다름"을 내기 때문입니다(name 줄만 결정서의 앱 이름으로 바꿔도 됩니다). 빌드 검사가 같은 결과를 운영자에게 보여줍니다.
Dockerfile — RIDM Apps 빌드용코드 자리: cat Dockerfile · 없거나 verify 가 "다름"이면 node scripts/get-book-code.mjs · 손으로 고치지 않는다 · 원문(사람용 — AI 는 열지 않는다)
.dockerignore — 이미지에 넣지 않을 것코드 자리: cat .dockerignore · 없거나 verify 가 "다름"이면 node scripts/get-book-code.mjs · 손으로 고치지 않는다 · 원문(사람용 — AI 는 열지 않는다)
next.config.ts — standalone 빌드 + 다른 사이트 프레임 금지코드 자리: cat next.config.ts · 없거나 verify 가 "다름"이면 node scripts/get-book-code.mjs · 손으로 고치지 않는다 · 원문(사람용 — AI 는 열지 않는다)
package.json — 의존성 (외부 서비스 SDK 없음)코드 자리: cat package.json · 고쳐도 되는 곳은 name 줄뿐(5-b) — 결정서의 앱 이름으로. 나머지는 책 그대로 — 없거나 verify 가 "다름"이면 node scripts/get-book-code.mjs · 원문(사람용 — AI 는 열지 않는다)
RIDM Apps 는 GitHub 저장소에서만 코드를 가져갑니다. 결정서에서 "내 컴퓨터 git 만"을 골랐다면 지금 1-3 대로 GitHub 가입과 Private 저장소를 만든 뒤 아래를 진행합니다. 처음 올릴 때 GitHub 로그인 창이 한 번 뜹니다 — 브라우저에서 승인하면 됩니다.
[프롬프트]
이 프로젝트를 GitHub에 올릴 준비를 해 주세요:
1. 보안 점검(7-3) 전 항목을 먼저 통과시켜
2. GitHub 아이디와 저장소 이름을 저에게 물어보고, 이 컴퓨터가 GitHub 에 로그인돼 있는지 확인해 주세요(gh auth status. gh 가 없거나 로그인 전이면 gh auth login 을 실행해 제가 브라우저에서 승인하게 하거나, 쓰는 AI 도구의 GitHub 연결 기능을 안내해 주세요). GitHub 비밀번호는 묻지 마세요
3. push 하기 전에 먼저 로그인된 상태로 git ls-remote https://github.com/{내계정}/my-notes-app 가 성공하는지(저장소가 실제로 있는지) 보여주고, 그다음 로그인하지 않은 요청 curl -s -o /dev/null -w "%{http_code}" https://github.com/{내계정}/my-notes-app 가 404 인지 보여 주세요(있는데 남에게는 안 보임 = Private — 빈 저장소여도 판정된다). 200 이면 Public 이니 멈추고, GitHub 저장소 Settings → Danger Zone → Change visibility 에서 Private 으로 바꾼 뒤 다시 확인해 주세요
4. git status 로 저장소인지 확인(2단계에서 git init -b main 을 했다 — "not a git repository"면 지금 git init -b main) → 전체 커밋(package-lock.json 포함) → 제 저장소 https://github.com/{내계정}/my-notes-app 에 push
5. push 전에 .env.local 이 스테이징에 없는 것과 .env.example 은 포함된 것을 git status 로 증명해 주세요
6. push 후 git remote -v 결과를 보여주고, origin URL 을 결정서 맨 아래 "저장소:" 줄에 기록해 주세요
AI는 브라우저로 콘솔 → 내 앱을 엽니다(없으면 링크 안내). 사용자가 직접 진행하고 각 단계에서 "완료"라고 답하면 다음으로 갑니다. 신청은 이메일 인증을 마친 콘솔 계정에서만 됩니다(1-1) — "호스팅 시작하기"가 막히면 인증 메일부터 확인합니다.
이름.ridm.ai). 입력하면 바로 사용 가능 여부가 나옵니다. 한 번 정하면 바꿀 수 없습니다 — AI가 이 점을 다시 말하고 사용자가 확정합니다my-notes-app만 골라도 됩니다) → 돌아오면 저장소·브랜치(main) 선택. 연결하는 순간 그 브랜치의 최신 커밋으로 첫 빌드가 시작됩니다DATABASE_URL은 플랫폼이 넣어 줍니다(직접 넣으면 예약 이름이라 거부됩니다). 관리자 페이지(B-7)를 켤 때만 ADMIN_PATH·ADMIN_PASSWORD 두 개를 앱 상세 → 환경변수에 사용자가 직접 넣습니다(값은 암호화되어 다시 보이지 않고 이름만 표시). 화면 순서·값을 안전하게 옮기는 법·오류는 부록 Fmain에 push 할 때마다 자동으로 빌드·배포됩니다. AI 는 push 뒤 node scripts/smoke-live.mjs https://이름.ridm.ai 의 첫 줄(실행 중 커밋 = 내 커밋)로 반영을 확인하고, 몇 분이 지나도 다르면 사용자에게 배포 기록 상태·사유를 물어봅니다. 빌드 검사에서 새 외부 호스트(코드 속 http(s):// 주소)나 위험 패턴이 생겨도 자동으로 반영되고 기록에 남습니다 — 예를 들어 폰트를 CDN(cdn.jsdelivr.net)에서 처음 불러오면 그 호스트가 기록됩니다. 운영자가 기록을 보고 문제가 있으면 공개를 중지할 수 있으니, 주석·예시에도 실제처럼 보이는 영문 주소를 쓰지 않습니다. push 없이 다시 빌드하고 싶으면 앱 카드의 지금 배포AI는 콘솔 안내를 지어내지 않고 아래 상자를 그대로 보냅니다(앱 주소·저장소 이름만 바꿔서). 이미 앱 카드가 있으면 1~4를, 저장소까지 연결돼 있으면 5까지 건너뛰고 "push 했으니 배포 기록을 봐 달라"만 보냅니다.
console.hrum.ai 에 로그인해서 "내 앱" 화면으로 가 주세요. 한 단계씩 하고 "완료"라고 알려 주세요.
1. [호스팅 시작하기] → 이용약관·개인정보 처리방침을 읽고 동의 (막히면 콘솔 가입 때 받은 인증 메일을 먼저 눌러 주세요)
2. 플랜: 무료 (무료 플랜 앱이 이미 하나 있으면 알려 주세요 — 파트너당 1개예요)
3. 앱 주소: {영문주소} 입력 → "사용 가능" 확인 (한 번 정하면 바꿀 수 없어요)
4. GitHub 단계: "신청 후 연결" → [신청하기] → 앱 카드 상태가 "첫 배포 전"
5. 앱 카드 [저장소 연결] → GitHub 앱 설치 승인(저장소 {저장소} 선택) → 돌아와서 저장소·main 선택 → 첫 빌드가 바로 시작돼요
6. 환경변수는 지금은 넣지 않아요 (DB 주소는 플랫폼이 넣어 줘요)
7. 배포 기록에서 상태를 봐 주세요: "빌드 중" → "자동 승인 중" → 공개(앱 카드가 "서비스 중") 또는 "실패"(그 줄의 빌드 로그 끝부분을 복사해 주세요)
| 증상 | 원인과 해결 |
|---|---|
빌드 실패 — Dockerfile 없음 | 저장소 루트에 Dockerfile이 있어야 합니다(8-0) |
빌드 실패 — npm ci 오류 | package-lock.json을 커밋하지 않았거나 package.json과 안 맞음. 로컬에서 npm install 후 lock 파일까지 커밋 |
빌드 실패 — secrets found in the repository | 저장소에 비밀값처럼 보이는 줄이 있음. 배포 기록에 파일·줄·규칙이 나옵니다. 흔한 원인은 .env.example에 postgresql://user:password@… 같은 예시 비밀번호까지 채운 주소 — 예시 파일은 DATABASE_URL=처럼 값을 비워 둡니다(7-3) |
| 빌드는 됐는데 "시작 실패" | 시작 후 10초 안에 /가 응답하지 않았거나(무거운 초기화를 첫 요청 뒤로 미룰 것), 파일을 쓰려다 죽음(읽기 전용 — /tmp 말고는 쓰지 말 것), 메모리 초과. 앱 카드의 "시작 실패" 사유와, 같은 Dockerfile로 로컬에서 docker run --read-only 실행해 재현 |
| 운영자가 공개를 중지함(사유가 붙음) | 외부 접속 호스트·위험 패턴은 사유를 읽고 고쳐서 push — 새 빌드도 같은 검사를 거칩니다. npm audit 경고는 package.json을 고치지 않고 운영자 판단과 책 개정을 기다립니다(8-0) |
한 줄로 끝납니다: node scripts/smoke-live.mjs https://이름.ridm.ai (부록 A-2 의 책 코드). 브라우저처럼 접속해서 ① 실행 중 커밋 = 내 마지막 커밋 ② 가입·복구 코드 ③ 로그인 상태 ③-2 다른 사이트·JSON 아닌 로그인·가입 요청 403(쿠키 없음) ④ 메모 만들기 ⑤ 목록 맨 위에 보임 ⑥ 메모 고치기 ⑦ Origin 없는 메모 요청 403 ⑧ 로그아웃 → 비로그인 401(메모 목록 포함) ⑨ 재로그인 뒤 메모 그대로 ⑩ 다른 회원 격리(목록에 없고, 그 id 로 GET·PATCH·DELETE 모두 404) ⑪ 메모 지우기 → 404 ⑫ 로그인 실패 제한(틀린 비밀번호 5회 401·6회째 429 — 스모크의 버리는 회원 이름만 잠김) ⑬ 복구 코드로 재설정(옛 비밀번호 401·새 비밀번호 200·새 복구 코드) ⑭ 90초 동안 계속 정상 ⑮ 회원 탈퇴(틀린 비밀번호 403 · 탈퇴 뒤 옛 쿠키 401 · 같은 아이디 로그인 401) — 을 차례로 확인하고 항목마다 PASS/FAIL 을 찍습니다. 관리자 페이지를 켰으면 끝에 --admin <ADMIN_PATH 값> 을 붙여 관리자 문도 같이 봅니다(B-7). 버리는 테스트 회원(smoke_…) 2명이 생겼다가 끝에 스스로 탈퇴하고(남지 않음), 앱의 가입 제한(같은 IP 1시간 5회) 중 2회를 쓰니 한 시간에 두 번 정도까지만 돌립니다. 크레딧은 들지 않습니다.
명령줄로 직접 확인할 때 주의: RIDM Apps 관문은 HEAD 요청과 도구(curl·헤드리스 브라우저 기본값 등)의 User-Agent 로는 잠든 무료 앱을 깨우지 않고 503 "앱이 대기 중입니다"를 돌려줍니다(정상). curl -s -A "Mozilla/5.0" https://이름.ridm.ai/api/health 처럼 일반 브라우저 User-Agent 를 붙이세요 — {"ok":true,"commit":"…"} 의 commit 이 git rev-parse HEAD 와 같으면 내 push 가 떠 있는 것입니다. 무료 플랜은 15분 동안 방문이 없으면 잠들어 첫 방문이 몇 초 걸립니다.
이름.ridm.ai/api/...로만 나가는지 확인 (다른 주소로 나가는 요청이 보이면 책에 없는 코드가 들어간 것)__Host-session이 보이고 HttpOnly·Secure인지 확인console.error)가 필요하면 contact@float.do로 앱 주소와 시각을 보내 주세요. 그래서 오류는 화면에도 사람 말로 보여주도록 만듭니다("로그인이 필요해요", "메모를 찾을 수 없어요")이름.ridm.ai 입니다. 가진 도메인 연결(베이직 이상)과 콘솔에서 도메인 사기를 쓸 수 있습니다 — 8-6이 책의 기본 출시는 ① 웹입니다 — 8-1~8-4 를 마쳤다면 이미 끝났습니다. ②·③은 웹 출시가 된 뒤에 고를 수 있는 다른 출구입니다. 둘 다 회원·DB 가 있는 서버는 지금 RIDM Apps 에 올린 것을 그대로 쓰지만, 로그인 방식이나 요청을 받는 규칙 같은 서버 코드를 일부 고쳐야 할 수 있습니다. 결정서 범위 밖이므로 AI 는 사용자가 원할 때만 안내하고, 시작 전에 할 일과 비용을 먼저 보여 줍니다.
| 방법 | 무엇 | 필요한 것 | 결제를 붙인다면 |
|---|---|---|---|
| ① 웹으로 직접 출시(기본) | <이름>.ridm.ai 주소로 누구나 브라우저에서 접속 | HRUM(흐름) 콘솔, GitHub Private 저장소 | 카드 결제 대행사(PG)와 직접 계약해 붙입니다(9-2). 앱 마켓 수수료 없음 |
| ② AI 로 앱으로 포장해 스토어에 | 웹앱을 Capacitor 같은 도구로 감싸 아이폰·안드로이드 앱으로 만들어 App Store·Google Play 심사를 받는다 | Apple Developer Program(연 99달러)과 Mac·Xcode(아이폰용), Google Play 개발자 계정(1회 25달러) | 앱 안에서 파는 디지털 상품은 애플·구글 인앱결제 정책 대상(수수료 15~30%) |
| ③ 토스 앱인토스 미니앱 | 토스 앱 안에서 설치 없이 열리는 미니앱 | 사업자 등록(부가세 면세 사업자는 불가), 앱인토스 콘솔, 입점 심사 | 디지털 상품은 인앱결제만(앱 마켓 수수료(현재 15%, 오를 수 있음) + 토스 수수료 5%), 실물 상품은 토스페이만 |
②·③ 안에서 파는 디지털 상품은 PG 대신 스토어·토스의 인앱결제를 써야 합니다 — 그래서 표의 수수료가 붙습니다.
비용 출처(2026-10-09 확인): Apple Developer Program 연 99달러 — Apple 공식 안내 · Google Play 개발자 계정 1회 25달러 — Play Console 고객센터 · 애플 수수료 15%는 전년도 수익 100만 달러 이하 개발자가 신청하는 App Store Small Business Program 기준이며, 그 외에는 30% — Apple 공식 안내. 금액과 수수료는 각 회사가 바꿀 수 있으니 시작 전에 링크에서 다시 확인하세요.
② 앱으로 포장할 때
③ 토스 미니앱으로 낼 때 바뀌는 것
②·③은 이 책의 범위 밖이라 책 코드(로그인·요청 검사 등)를 고치게 됩니다. 그러면 verify-book-code 가 그 파일을 "다름"으로 표시하고, 책 개정 때 get-book-code --force 를 쓰면 고친 내용이 되돌아갑니다. 그래서 웹 버전 폴더는 그대로 두고, 새 폴더(또는 새 git 브랜치)에서 작업하세요.
2026년 10월 공식 문서 기준 요약입니다. 수수료·정책은 바뀔 수 있으니 시작 전에 공식 페이지를 확인하세요: 앱인토스 개발자센터 · Apple Developer Program · Google Play Console
앱 주소는 이름.ridm.ai 로 충분하고, 이 주소는 무료로 계속 씁니다. 내도메인.com 같은 주소로도 열고 싶을 때만 이 절을 봅니다. 결정서 범위 밖이므로 AI 는 사용자가 원할 때만 안내하고, 콘솔 화면은 사용자가 직접 누릅니다. 코드는 고치지 않습니다.
이 절은 실제로 walkingintovangogh.com 을 콘솔에서 사서 앱에 붙인 과정을 그대로 따라갑니다. 화면은 휴대폰 폭에서 찍었고, 금액·잔액·개인 정보는 가렸습니다. 금액은 늘 콘솔 화면에 나온 값을 봅니다.
지금 되는 것: 도메인 구매와 앱 연결은 모든 계정에서 쓸 수 있습니다. 왼쪽 메뉴 도메인 화면의 도메인 구매 칸에 "등록기관 연결을 점검하고 있어 지금은 구매할 수 없어요."가 보이면 잠시 점검 중이니 나중에 다시 봅니다. AI 는 짐작하지 말고 사용자에게 화면에 무엇이 보이는지 묻습니다.
이름.ridm.ai 는 그대로 열립니다. 로그인 쿠키는 주소마다 따로라, 새 주소에서는 회원이 한 번 다시 로그인합니다① 도메인 검색 — 콘솔 → 도메인
도메인 구매 칸에 원하는 이름을 넣고 검색을 누릅니다. 상태가 "등록 가능"이면 선택을 누릅니다. 아래에 다른 확장자도 함께 나오는데, 철자가 비슷한 이름에는 "혹시 찾으신 이름이 …인가요?" 경고가 붙습니다. 내가 찾던 이름이 맞는지 한 번 더 봅니다.

② 견적 확인
선택을 누르면 그 자리에서 실시간 가격을 다시 확인해 견적 카드가 뜹니다. 등록 가격과 갱신 예정가가 따로 나옵니다. 견적은 잠깐만 유효합니다. 시간이 지나 "견적이 만료됐어요"가 보이면 다시 확인하기를 누르거나 다시 선택해서 새 견적을 받습니다.
③ 등록자 정보
이름·주소는 영문(로마자)으로 넣습니다. 등록기관에 그대로 올라갑니다. 칸은 이름, 회사·단체명(선택), 이메일, 전화번호, 도로명 주소, 시, 시·도·주 순서입니다. 그다음 동의 항목을 모두 읽고 체크합니다.

④ 확인 창 — 이름을 직접 입력
구매 버튼을 누르면 "도메인을 구매할까요?" 창이 뜹니다. 이름·확장자·금액을 다시 봅니다. 그리고 도메인 이름을 칸에 직접 똑같이 입력합니다. 똑같이 입력해야 결제 버튼이 켜집니다(대소문자는 구분하지 않음). 철자가 하나 틀린 이름을 사는 일을 막는 장치입니다.

⑤ 결제
결제를 누르면 크레딧에서 차감되고 등록이 시작됩니다. 크레딧이 모자라면 먼저 콘솔 → 빌링에서 충전합니다. 등록이 끝나면 내 도메인 목록에 "사용 중"으로 보입니다.
환불 안내: 도메인은 등록하는 순간 되돌릴 수 없어서, 등록이 끝나면 어떤 경우에도 환불되지 않습니다(회사 과실로 잘못 등록된 경우 제외). 등록되지 않은 것이 확인되면 크레딧으로 전액 돌려받습니다. 결제 전에 이름을 한 번 더 봅니다.
Cloudflare 에서 등록자 이메일 확인 메일이 오면 꼭 누릅니다. 정해진 기간 안에 안 누르면 도메인이 정지될 수 있습니다. 이미 확인을 마친 이메일이면 확인 메일 없이 "등록 완료" 메일만 올 수도 있습니다.
⑥ 앱 만들기 · 저장소 연결 — 콘솔 → 내 앱
붙일 앱이 없으면 앱 추가로 만듭니다. 약관 → 플랜 → 이름 → 깃허브 → 검토 순서입니다. 깃허브 단계에서는 GitHub 앱 설치 화면이 새 창으로 열립니다. 아무 창도 안 뜨면 브라우저의 팝업 차단을 풀고 다시 누릅니다. 설치가 끝나면 저장소 연결 창에서 저장소와 브랜치를 고르고 연결을 누릅니다. 배포가 끝나고 첫 배포가 승인되면 이름.ridm.ai 가 먼저 열립니다. 이 주소가 열리는지 확인한 뒤 다음으로 갑니다.

⑦ 「www 없는 주소」 연결 — 콘솔 → 도메인 → 내 도메인 목록에서 도메인을 누름 → 앱 연결 탭
앱에 연결 칸에서 앱을 고르고, www 없는 주소를 고른 뒤 연결하기를 누릅니다. DNS 레코드와 인증서는 RIDM 이 자동으로 만듭니다. 내가 DNS 를 만질 일은 없습니다.
www 주소는 함께 따라옵니다. www 없는 주소를 연결하면 www.walkingintovangogh.com 도 같이 연결되고, www 로 들어온 방문자는 www 없는 주소로 넘어갑니다. www 를 따로 연결할 필요가 없고, 연결 개수도 따로 쓰지 않습니다.

⑧ 소유 확인 · 인증서 대기
"연결된 앱" 칸에 주소가 생기고, 상태가 "소유 확인 대기"에서 인증서 발급을 거쳐 "연결됨"으로 바뀝니다. 몇 분 걸릴 수 있습니다. 버튼을 누른 뒤 "연결을 시작하는 중…"에서 오래 멈춰 보이면 페이지를 새로고침합니다. 연결은 이미 시작돼 있어서 상태가 제대로 보입니다.

⑨ 연결됨
상태가 "연결됨"이 되면 끝입니다. 오래 기다려도 바뀌지 않으면 운영팀에 도메인 이름과 화면에 보이는 상태를 알려 줍니다.

⑩ 실제 사이트 확인
브라우저로 https://walkingintovangogh.com 을 엽니다. 주소창에 자물쇠가 보이고 내 앱 화면이 뜨면 됩니다. www.walkingintovangogh.com 도 열어 보면 www 없는 주소로 넘어갑니다. 명령줄로도 node scripts/smoke-live.mjs https://내도메인.com 을 돌려 실패가 없는지 봅니다.

팁 — 무료 플랜 앱은 잠듭니다: 무료 플랜 앱은 한동안 방문이 없으면 잠들고, 다음 방문이 깨웁니다. 그래서 처음 열 때 잠깐 느릴 수 있습니다. 업타임 모니터·검색 로봇·curl같은 도구는 앱을 깨우지 않아서 "앱이 대기 중입니다" 안내 페이지를 볼 수 있습니다. 고장이 아닙니다. 확인은 브라우저로 합니다. 늘 깨어 있어야 하면 베이직 이상으로 올립니다.
산 뒤에 관리하기 — 도메인 상세의 탭
이미 가진 도메인을 붙일 때 (가비아·Cloudflare·Njalla 등 어디서 샀든 · 베이직 이상)
www.내도메인.com → 연결 시작_ridm-challenge.www.내도메인.com = ridm-verify=…(콘솔 값 그대로), CNAME www.내도메인.com → connect.ridm.ai. 이름 칸에 도메인을 뺀 앞부분(www, _ridm-challenge.www)만 받는 회사가 많습니다. Cloudflare 라면 CNAME 의 프록시를 끕니다(회색 구름)내도메인.com)는 DNS 가 CNAME 평탄화(ALIAS)를 지원해야 합니다. 모르면 www 를 연결하고, 도메인 회사의 포워딩으로 www 없는 주소를 www 로 보냅니다앱이 열렸다고 검색에 바로 잘 나오지는 않습니다. SEO(검색엔진 최적화 — 구글·네이버 같은 검색이 내 앱을 제대로 읽고 보여 주게 다듬는 일)는 대부분 "검색이 읽는 이름표"를 채우는 일입니다. 직접 하나하나 찾지 않아도 됩니다. AI 코딩 도구에 SEO 점검 스킬(AI 에게 SEO 점검 방법을 가르쳐 두는 추가 기능)을 설치하고 한 줄로 시키면, 무엇이 빠졌는지 목록으로 알려 줍니다.
결정서 범위 밖이므로 AI 는 사용자가 원할 때만 안내합니다. 스킬 설치·점검은 사용자 컴퓨터에서 돌고, 앱 코드는app/layout.tsx(고쳐도 되는 파일 — PART 0 의 5-b)와 새로 만드는app/robots.ts·app/sitemap.ts만 고칩니다. 책의 [완전 코드] 파일은 건드리지 않습니다. 검색 순위는 누구도 보장할 수 없고, 반영까지 며칠~몇 주 걸릴 수 있습니다.
이 책의 앱에서 검색이 볼 수 있는 것: 로그인하지 않은 사람은 바로 로그인 화면으로 갑니다. 메모는 회원에게만 보입니다. 그래서 이 책의 앱에서 SEO 는 "첫 화면의 제목·설명·미리보기를 제대로 채우고, 검색이 길을 찾게 안내 파일 두 개를 두는 것"이 거의 전부입니다. 회원 화면은 원래 검색에 나오지 않는 것이 맞습니다.
① 스킬 설치 — 한 번만
여기서는 깃허브에서 널리 쓰이는 공개 SEO 스킬 claude-seo(MIT 라이선스)를 씁니다. HRUM 팀도 같은 스킬을 씁니다.
Claude Code 를 쓴다면 (Mac · Windows · Linux 똑같음) — Claude Code 입력창에 한 줄씩 넣습니다. 터미널 명령이 아니라 Claude Code 안에서 치는 명령입니다.
/plugin marketplace add AgriciDaniel/claude-seo /plugin install claude-seo@agricidaniel-claude-seo /seo setup
/seo setup 은 점검에 필요한 도구(파이썬 실행 환경과 화면을 열어 보는 브라우저)를 스킬 전용 폴더에 한 번 준비합니다. 다른 프로그램은 건드리지 않습니다python3 --version(Windows 는 py --version)으로 확인합니다/seo doctor 로 봅니다 — 아무것도 바꾸지 않고 준비 상태만 보여 줍니다GPT Codex · Cursor 등 다른 도구라면: 이 스킬은 Claude Code 용으로 만들어졌고, 다른 도구는 스킬 폴더를 직접 받아서 씁니다. 터미널에서 스킬을 받을 새 폴더로 이동한 뒤(앱 폴더 말고):
git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git
받은 claude-seo 폴더를 AI 코딩 도구로 열고 "이 폴더의 AGENTS.md 를 읽고 SEO 스킬로 https://<이름>.ridm.ai 첫 화면을 점검해 주세요"라고 합니다. 도구마다 되는 정도가 다릅니다 — 잘 안 되면 아래 「스킬 없이 시키기」 문장을 그대로 쓰세요.
② 한 줄로 돌리기
점검 결과 파일이 지금 열린 폴더에 생길 수 있습니다. 앱 폴더가 아닌 빈 폴더(예: seo-check)에서 AI 코딩 도구를 열고 시키세요 — 앱 저장소에 점검 결과가 섞여 올라가지 않게 하려는 것입니다.
/seo page https://<이름>.ridm.ai/seo audit 주소)은 여러 AI 가 나눠서 오래 돌기 때문에 AI 도구 사용량이 훨씬 많이 듭니다. 이 책의 앱은 공개 화면이 거의 한 장이라 /seo page 로 충분합니다. 일부 추가 기능은 외부 유료 서비스에 연결하는데, 기본 점검에는 필요 없습니다 — 도구에 따라 비용이 들 수 있어요스킬 없이 시키기 (스킬 설치가 안 될 때) — AI 코딩 도구에:
https://<이름>.ridm.ai 의 첫 화면 HTML 과 /robots.txt, /sitemap.xml 을 직접 받아 보고, title · meta description · Open Graph 태그 · canonical · robots.txt · sitemap.xml 이 있는지, 내용이 앱을 제대로 설명하는지 표로 알려 주세요. 고칠 순서도 정해 주세요. 아직 코드는 고치지 마세요.
③ 결과에서 먼저 고칠 것 고르기
점검 결과에는 항목이 많이 나옵니다. 처음에는 아래 여섯 가지만 봅니다. 나머지(구조화 데이터 · 백링크 · 콘텐츠 품질 · AI 검색 대응 등)는 공개 소개 화면을 따로 늘릴 때 다시 보면 됩니다.
| 순서 | 항목 | 쉽게 말하면 | 이 책의 앱에서 고치는 곳 |
|---|---|---|---|
| 1 | title(페이지 제목) | 검색 결과에 파란 글씨로 나오는 제목. 브라우저 탭에도 보입니다 | app/layout.tsx 의 metadata.title — 지금은 「회원 메모장」 |
| 2 | description(설명) | 제목 밑 회색 두세 줄. 누가 무엇을 할 수 있는 앱인지 한 문장으로 | 같은 파일 metadata.description |
| 3 | robots.txt | 검색 로봇에게 "여기는 와도 돼요"를 알려 주는 안내 파일 | 새 파일 app/robots.ts → 주소 /robots.txt |
| 4 | sitemap.xml(사이트맵) | 검색에 보여 줄 페이지 주소 목록 | 새 파일 app/sitemap.ts → 주소 /sitemap.xml. 첫 화면 주소만 넣습니다 |
| 5 | OG(Open Graph — 카톡·SNS 에 링크를 붙였을 때 뜨는 미리보기 제목·설명·그림) | 링크 공유 때 보이는 카드 | metadata.openGraph + 미리보기 그림(app/opengraph-image.png, 가로 1200 · 세로 630) |
| 6 | canonical(대표 주소) | 같은 화면이 주소 두 개로 열릴 때 "이게 진짜 주소"라고 정해 주는 표시 | 내 도메인을 연결했을 때만(아래 주의 1). metadata.alternates.canonical |
속도(Core Web Vitals — 화면이 얼마나 빨리 뜨고 덜 흔들리는지)는 점수가 낮게 나와도 처음엔 미뤄도 됩니다. 구글 연결 없이 돌리면 실제 방문자 기록이 아니라 추정치이기 때문입니다. 큰 그림 파일이 원인으로 나오면 그것만 줄입니다.
④ AI 에게 고치게 시키기
이제 앱 폴더에서 AI 코딩 도구를 열고, 점검 결과를 붙여 넣으며 이렇게 시킵니다:
아래 SEO 점검 결과에서 title · description · OG · robots.txt · sitemap.xml 만 고쳐 주세요. app/layout.tsx 의 metadata 와 새 파일 app/robots.ts · app/sitemap.ts 만 바꾸고, 책의 [완전 코드] 파일은 건드리지 마세요. 앱 주소는 https://<이름>.ridm.ai 예요. sitemap 에는 첫 화면 주소만 넣고, 관리자 주소는 어떤 파일에도 쓰지 마세요. 고치기 전에 바꿀 문구를 먼저 보여 주세요.
npm run check → node scripts/verify-book-code.mjs 가 "불일치 0개" → push → 배포 기록에서 새 빌드가 끝나고 /api/health 의 commit 이 내 마지막 커밋과 같아질 때까지 기다립니다⑤ 다시 돌려 확인
/seo page https://<이름>.ridm.ai 를 다시 돌려, 고친 여섯 항목이 해결로 바뀌었는지 봅니다https://<이름>.ridm.ai/robots.txt 와 /sitemap.xml 이 글자로 보이면 됩니다node scripts/smoke-live.mjs https://<이름>.ridm.ai 로 앱 자체가 여전히 "실패 0개"인지도 확인합니다이름.ridm.ai 주소는 DNS 를 직접 고칠 수 없으니 소유 확인은 HTML 태그(메타 태그) 방식을 고르고, 받은 값을 AI 에게 주어 app/layout.tsx 의 metadata.verification 에 넣게 합니다. 내 도메인이면 DNS(TXT) 방식도 됩니다흐름 · RIDM Apps 에 올린 앱이면 주의
이름.ridm.ai 는 그대로 열립니다(8-6). 같은 화면이 주소 두 개로 보이므로, 검색에 보일 주소(보통 www.내도메인.com)를 정해 metadata.metadataBase 와 alternates.canonical, sitemap · robots.txt 안의 주소를 모두 그 주소로 맞춥니다ADMIN_PATH, 부록 B-7)를 알려 주는 셈입니다. 관리자 주소가 파일에 들어가면 verify-book-code 가 "관리자 주소가 코드에 들어갔어요"로 잡습니다/api/… 주소는 넣지 않습니다app/robots.ts · app/sitemap.ts 로 앱 안에 둡니다여기서 막히면:
/plugin 이 없는 명령이라고 나옴: Claude Code 가 오래된 것입니다. 터미널에서 claude update 후 Claude Code 를 다시 엽니다(1.0.33 이상 필요)/seo setup 에서 파이썬 오류: python.org 에서 3.11~3.14 를 설치합니다. Windows 는 설치 첫 화면에서 "Add python.exe to PATH"를 체크합니다. 설치 뒤에는 터미널과 Claude Code 를 닫았다가 새로 열고 /seo setup 을 다시 칩니다/seo audit 대신 /seo page 로 한 장만 봅니다/api/health 의 commit 이 내 마지막 커밋과 같은지 먼저 봅니다2026년 10월 claude-seo 공개 저장소 안내 기준입니다. 설치 방법은 바뀔 수 있으니 막히면 저장소 README를 확인하세요.
AI용 분할본 · 지도 5단계(배포) · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침, PART 7 보안·테스트 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)