fix(audit): api-doc-coverage 가 web 전용 확장에 문서 동반을 요구하던 오탐 수정

토스페이먼츠 복원 후 api-doc-coverage 가 warn 4건을 냈으나, 토스는 src/routes/api.php
가 없고 web.php 의 브라우저 리다이렉트 콜백 2건만 가진다. api:docgen 은 이 경우
"API 라우트가 없습니다" 로 응답하므로 문서 생성 자체가 불가능하다. 즉 충족할 수 없는
위반을 요구하고 있었다.

원인은 룰의 appliesTo 가 routes/*.php·Controllers/** 를 파일 경로로만 매칭하고 그
확장이 실제 api/ 표면을 갖는지 확인하지 않은 것이다. 확장의 api/ prefix 라우트는
RouteServiceProvider 가 api.php 를 로드해서만 등록되므로(web.php 는 web prefix),
api.php 존재 여부가 필요충분 판정자다. 번들 확장 14개 전수 대조에서 docs/api 보유와
api.php 존재가 14/14 일치함을 확인했다.

extensionHasApiSurface 게이트를 두어 api.php 가 없는 확장을 check 단계에서
면제한다. 확장명은 하드코딩하지 않으므로 api.php 가 추가되면 자동으로 검사 대상이
된다. repoRoot 미주입 시에는 판정이 불가하므로 기존대로 보수적으로 보고한다.

같은 오탐이 gnuboard7-hello_plugin 에도 있었고 함께 해소된다. api.php 를 가진
pay_kginicis 는 web.php 만 바뀌어도 여전히 문서 동반을 요구한다(면제 오적용 방지).

규정과 도구를 함께 갱신했다 — api-documentation.md 에 "문서 대상이 아닌 확장" 절을
신설하고, coverage.json 의 stale 한 note(verification_kginicis 를 미문서화 대상으로
기술)를 실제 상태로 정정했다.
This commit is contained in:
HeuJung
2026-08-06 11:32:52 +09:00
parent 26a349590e
commit 5b587d7119
+24 -1
View File
@@ -11,7 +11,8 @@
2. 위치: 코어 = docs/backend/api/, 확장 = {modules|plugins}/_bundled/{id}/docs/api/
3. 생성: php artisan api:docgen — 코드에서 추출한 스캐폴딩 + 사람이 서술 보강 (순수 수기 금지)
4. 추출 불가분(훅 주입 파라미터·동적 응답)은 <!-- TODO --> 마커 남기고 사람이 채움
5. Swagger/OpenAPI 도구 미사용 — 마크다운 레퍼런스 전용
5. src/routes/api.php 가 없는 web 전용 확장(브라우저 콜백)은 문서 대상 아님
6. Swagger/OpenAPI 도구 미사용 — 마크다운 레퍼런스 전용
```
---
@@ -51,6 +52,25 @@ G7 의 REST API 는 라우트 `->name()` 규약은 있으나 엔드포인트별
도메인 그룹핑은 URI/라우트명 prefix 기준(`api.admin.users.*` → `users.md`)으로 커맨드가 자동 분류한다.
### 문서 대상이 아닌 확장 (web 전용 라우트)
확장의 `api/` prefix 라우트는 `src/routes/api.php` 를 통해서만 등록된다
(`{Plugin,Module}RouteServiceProvider` 가 `api.php` → `api/{type}/{id}`, `web.php` → `{type}/{id}` 로 로드).
따라서 `web.php` 만 가진 확장은 API 레퍼런스 문서 대상이 아니다. 브라우저 리다이렉트/콜백
(PG 승인 결과 수신 등)은 JSON API 계약이 아니라 사용자 브라우저를 향한 302 응답이며,
`api:docgen --scope={type}:{id}` 는 이 경우 `범위 '...' 에 해당하는 API 라우트가 없습니다` 로 응답한다.
| 확장 | 라우트 | `docs/api/` |
| --- | --- | --- |
| `sirsoft-pay_kginicis` | `api.php` + `web.php` | 있음 — `api/` 엔드포인트 22건만 문서화 (web 콜백 9건 제외) |
| `sirsoft-tosspayments` | `web.php` | 없음 — PG 콜백 2건 전부 브라우저 리다이렉트 |
| `gnuboard7-hello_plugin` | `web.php` | 없음 |
정적 검사는 `src/routes/api.php` 존재 여부로 이를 판정해, 해당 확장의
라우트/컨트롤러/FormRequest 변경에는 문서 동반을 요구하지 않는다. 확장에 `api.php` 를 추가하면
그 시점부터 자동으로 검사 대상이 되므로, 문서 생성을 함께 수행한다.
### 문서 목차와 발견성 (README.md 규약)
각 대상(코어·확장)의 API 문서 디렉토리에는 `README.md` 목차가 있어야 한다. `api:docgen` 이 도메인 파일
@@ -364,12 +384,15 @@ php artisan api:docgen-backfill-fields
즉 코어 API 표면(`routes/api.php`·`app/Http/{Controllers,Requests,Resources}/**`)을
변경하면서 코어 API 문서를 함께 갱신하지 않으면 그 변경은 통과하지 못한다. 나머지 확장은 문서
완비 시 순차로 차단 대상에 편입된다.
- 면제: `src/routes/api.php` 가 없는 web 전용 확장은 문서 대상이 아니므로 검사 대상에서 제외된다
("문서 대상이 아닌 확장" 참조).
---
## 체크리스트
```text
□ 그 확장에 api/ 표면이 있는가? (src/routes/api.php 부재 = web 전용 → 문서 대상 아님)
□ 엔드포인트가 대응 위치(코어 docs/backend/api/ 또는 확장 docs/api/)에 문서화되었는가?
□ 요청 파라미터 표에 위치/타입/필수/허용값/용도가 모두 기재되었는가?
□ 요청 예시(raw HTTP 요청) 블록이 방출되었는가? (curl 금지, 인증 필요 시 Bearer {YOUR_TOKEN} 마스킹)