# 모듈 라우트 규칙 > 이 문서는 모듈의 백엔드 라우트(API/Web)와 프론트엔드 라우트(routes.json) 작성 규칙을 설명합니다. --- ## TL;DR (5초 요약) ```text 1. URL prefix 자동: /api/modules/[vendor-module]/... 2. name prefix 자동: api.modules.[vendor-module].... 3. 활성화된 모듈만 라우트 등록됨 4. 프론트엔드: routes/admin.json, routes/user.json으로 admin/user 분기 5. 레거시 routes.json은 admin으로 폴백 (경고 로그 출력) ``` --- ## 목차 1. [핵심 원칙](#1-핵심-원칙) 2. [라우트 등록 조건](#2-라우트-등록-조건) 3. [자동 적용되는 Prefix](#3-자동-적용되는-prefix) 4. [라우트 파일 작성](#4-라우트-파일-작성) 5. [라우트 네임 컨벤션](#5-라우트-네임-컨벤션) 6. [프론트엔드 라우트 (routes.json)](#6-프론트엔드-라우트-routesjson) 7. [캐시 관리](#7-캐시-관리) 8. [관련 문서](#8-관련-문서) --- ## 1. 핵심 원칙 ``` 중요: ModuleRouteServiceProvider가 URL prefix와 name prefix를 자동 적용 ✅ 필수: 모듈 개발자는 모듈 내부 구조만 정의 ✅ 조건: 활성화된 모듈만 라우트가 등록됨 ``` --- ## 2. 라우트 등록 조건 ### 활성화된 모듈만 라우트 등록 - `ModuleRouteServiceProvider`가 DB에서 `status = 'active'`인 모듈만 조회 - 설치되지 않거나 비활성화된 모듈의 라우트는 등록되지 않음 - 모듈 활성화/비활성화 시 라우트가 자동으로 등록/해제됨 ### 네임스페이스 변환 규칙 ``` 디렉토리명 → 네임스페이스 sirsoft-sample → Modules\Sirsoft\Sample sirsoft-ecommerce → Modules\Sirsoft\Ecommerce vendor-my-module → Modules\Vendor\My\Module ``` --- ## 3. 자동 적용되는 Prefix ### API 라우트 | 항목 | 값 | |------|-----| | URL prefix | `api/modules/{module-name}` | | Name prefix | `api.modules.{module-name}.` | ### 웹 라우트 | 항목 | 값 | |------|-----| | URL prefix | `modules/{module-name}` | | Name prefix | `web.modules.{module-name}.` | > 라우트 이름(`{web\|api}.modules.{module-name}.{name}`)은 확장 미들웨어 타게팅의 1급 키다. `Module::getMiddleware()` 의 `targets` 는 이 라우트명 패턴으로 미들웨어 부착 대상을 지정한다. 상세: [docs/backend/middleware.md "확장 미들웨어 선언 (self-gate)"](../backend/middleware.md#확장-미들웨어-선언-self-gate). --- ## 4. 라우트 파일 작성 ### 라우트 파일 위치 ``` modules/_bundled/{identifier}/src/routes/ ├── api.php # API 라우트 └── web.php # 웹 라우트 ``` ### ✅ DO: 모듈 내부 구조만 정의 ```php // modules/_bundled/sirsoft-ecommerce/src/routes/api.php Route::prefix('admin')->middleware(['auth:sanctum', 'admin'])->group(function () { Route::get('products', [ProductController::class, 'index']) ->name('admin.products.index'); // 최종 Name: api.modules.sirsoft-ecommerce.admin.products.index // 최종 URL: /api/modules/sirsoft-ecommerce/admin/products }); ``` ### ❌ DON'T: prefix 중복 입력 ```php // 잘못된 예시 - prefix가 중복됨 Route::get('products', [ProductController::class, 'index']) ->name('api.modules.sirsoft-ecommerce.admin.products.index'); ``` ### 라우트 파일 주석 템플릿 ```php