공개 저장소 이슈 gnuboard/g7 (@bigmsg) 제보에서 출발한 작업이다. 브라우저가 화면을 그리려고 제3자 CDN 에 도달해야 하면, 그 도달 실패는 예외도 로그도 남기지 않고 화면 기능만 조용히 사라진다. 폐쇄망·방화벽·광고차단기에서 재현되는데 자체 서버 로그에는 흔적이 없어 운영자가 원인을 특정할 수 없다. 제보된 것은 편집기 하나였지만 같은 구조가 아이콘·글꼴·코드편집기·압축 라이브러리·설치 마법사·개발 대시보드에 똑같이 있었으므로, 번들 확장과 템플릿 전체를 자체 제공으로 옮겼다. 런타임에 외부로 나가는 것은 주소 검색 서비스 하나만 남았다. 자체 제공만으로는 부족하다 — 자기 서버에서 받는 파일도 실패할 수 있고, 종전에는 그 실패가 무음이었다. CSS 경로에 재시도 계층을 세우고(스크립트 경로와 동형), 서버가 HTML 에 직접 심는 externals 까지 실패를 붙잡아 안내 배너와 [다시 시도]로 표면화했다. 편집기·코드편집기는 확보 실패 시 평문 입력으로 내려앉되 저장 계약을 유지한다. 두 번째 축은 운영자가 CSS 를 덧붙일 자리가 없던 문제다(sir.kr 문의). 확장 디렉토리의 custom/ 을 운영자 소유로 정해, 확장 교체가 그 디렉토리만은 보존하게 했다. 출처에 의존하지 않는 서술자로 해석하므로 나중에 다른 출처가 붙어도 소비자는 바뀌지 않는다. 확장 자산과 같은 메커니즘으로 정적 게시되어 CSS 내부 상대 url 도 해석되고, 파일을 고치면 그 변경을 감지해 재게시까지 예약된다. FTP 접근이 없는 운영자에게는 그 자리도 없는 것과 같으므로 레이아웃 편집기에서 직접 넣고 고칠 수 있게 했다. 모듈·플러그인·템플릿이 한 엔드포인트를 공유한다 — 타입별로 나누면 같은 검증이 세 벌로 갈리고 그중 약한 하나가 우회로가 된다. 여기서 올린 스크립트는 그 레이아웃 한 장이 아니라 사이트 전 화면에서 실행되므로 레이아웃 편집과 분리된 전용 권한으로 연다. 운영자 CSS 가 화면을 조작 불능으로 만들면 그것을 고칠 화면에도 같은 CSS 가 실려 스스로 갇히므로, 서버가 목록을 비우는 탈출구(?custom=off)를 함께 뒀다. 동봉 자산은 재생성 경로에 버전 대조 가드를 붙였다. 선언과 다른 버전을 버전 디렉토리에 써 넣는 조용한 거짓말은 배포된 뒤에는 드러나지 않는다.
그누보드7 문서 인덱스
그누보드7 오픈소스 CMS 플랫폼의 개발 가이드 문서입니다.
카테고리별 통계
| 카테고리 | 문서 수 | 링크 상태 |
|---|---|---|
| 백엔드 | 36개 | 정상 |
| 프론트엔드 | 51개 | 정상 |
| 확장 시스템 | 31개 | 정상 |
| 공통 | 20개 | 정상 |
| AI 도구 | - | 정상 |
API 레퍼런스
G7 이 제공하는 REST API 의 엔드포인트별 요청 파라미터·응답 필드·요청/응답 예시입니다.
템플릿의 data_sources 를 작성하거나 외부에서 G7 을 연동할 때 참고하세요.
| 문서 | 설명 |
|---|---|
| backend/api/README.md | API 레퍼런스 진입점 — 공통 규약(인증·응답 봉투·페이지네이션·에러) + 코어/확장 전체 목차 |
| backend/api-documentation.md | API 문서 작성·갱신 규정 (기여자용) |
작업 유형별 필수 문서
레이아웃 JSON 작성
| 순서 | 문서 | TL;DR 핵심 |
|---|---|---|
| 1 | 레이아웃 JSON 스키마 | HTML 태그 직접 사용 금지 → 기본 컴포넌트 사용 (Div, Button, Span) |
| 2 | 레이아웃 JSON - 컴포넌트 | if: 조건부 렌더링 (type: "conditional" 사용 금지!) |
| 3 | 레이아웃 JSON - 기능 | classMap: 조건부 CSS 클래스 (key → variants 매핑) |
| 4 | 레이아웃 JSON - 상속 | extends: 베이스 레이아웃 상속 (type: "slot" 위치에 삽입) |
| 5 | 컴포넌트 개발 규칙 | HTML 태그 직접 사용 금지 |
| 6 | 컴포넌트 Props 레퍼런스 | - |
| 7 | sirsoft-admin_basic 컴포넌트 | Basic (37개), Composite (66개), Layout (8개) |
| 8 | 데이터 바인딩 및 표현식 | API 데이터: {{user.name}}, URL 파라미터: {{route.id}} |
| 9 | 데이터 바인딩 - 다국어 처리 | - |
| 10 | 액션 핸들러 가이드 | 구조: type 또는 event(이벤트), handler(핸들러명), params(옵션) |
| 11 | 액션 핸들러 - 핸들러별 상세 사용법 | navigate: 페이지 이동 (path, query, mergeQuery 옵션) |
| 12 | 전역 상태 관리 | 전역 상태: _global.속성명 (앱 전체 공유, 페이지 이동 시 유지) |
| 13 | 데이터 소스 | data_sources 배열에 API 정의: id, endpoint, method |
| 14 | 다크 모드 지원 | Tailwind dark: variant 사용 |
컨트롤러 작성
| 순서 | 문서 | TL;DR 핵심 |
|---|---|---|
| 1 | 컨트롤러 계층 구조 | AdminBaseController / AuthBaseController / PublicBaseController |
| 2 | 라우트 네이밍 및 경로 | 모든 라우트는 name() 필수 |
| 3 | 검증 (Validation) | FormRequest 사용 필수 (Service에 검증 로직 금지) |
| 4 | API 응답 규칙 (ResponseHelper) | 모든 API 응답은 ResponseHelper 사용 |
Service/Repository 작성
| 순서 | 문서 | TL;DR 핵심 |
|---|---|---|
| 1 | Service-Repository 패턴 | RepositoryInterface 주입 필수 (구체 클래스 직접 주입 금지) |
| 2 | 훅 시스템 | Action 훅: doAction() - 부가 작업 (로그, 알림, 캐시) |
마이그레이션 작성
| 순서 | 문서 | TL;DR 핵심 |
|---|---|---|
| 1 | 데이터베이스 개발 가이드 | 마이그레이션: 한국어 comment 필수, down() 구현 필수 |
모듈 개발
| 순서 | 문서 | TL;DR 핵심 |
|---|---|---|
| 1 | 모듈 개발 기초 | 디렉토리: vendor-module (예: sirsoft-ecommerce) |
| 2 | 모듈 라우트 규칙 | URL prefix 자동: /api/admin/[vendor-module]/... |
| 3 | 모듈 레이아웃 시스템 | modules/_bundled/vendor-module/resources/layouts/ |
| 4 | 모듈 다국어 시스템 | 백엔드: /lang/{locale}/*.php |
| 5 | 훅 시스템 | Action 훅: doAction() |
테스트 작성
| 순서 | 문서 | TL;DR 핵심 |
|---|---|---|
| 1 | 테스트 가이드 | 테스트 통과 = 작업 완료 (작성만으로 불충분!) |
| 2 | 레이아웃 렌더링 테스트 가이드 | createLayoutTest()로 테스트 헬퍼 생성 |
API 리소스 작성
| 순서 | 문서 | TL;DR 핵심 |
|---|---|---|
| 1 | API 리소스 | BaseApiResource 상속 필수 |
| 2 | API 응답 규칙 (ResponseHelper) | 모든 API 응답은 ResponseHelper 사용 |
FormRequest 작성
| 순서 | 문서 | TL;DR 핵심 |
|---|---|---|
| 1 | 검증 (Validation) | FormRequest 사용 필수 (Service에 검증 로직 금지) |
| 2 | Custom Exception 다국어 처리 | 예외 메시지 하드코딩 금지 → __() 함수 필수 |
권한/메뉴 추가
| 순서 | 문서 | TL;DR 핵심 |
|---|---|---|
| 1 | 권한 시스템 | 구조: User → Role → Permission (기능 레벨) |
| 2 | 메뉴 시스템 | 구조: User → Role → role_menus 피벗 → Menu |
다국어 추가
| 순서 | 문서 | TL;DR 핵심 |
|---|---|---|
| 1 | 모듈 다국어 시스템 | 백엔드: /lang/{locale}/*.php |
| 2 | 데이터베이스 개발 가이드 | 마이그레이션: 한국어 comment 필수, down() 구현 필수 |
| 3 | 데이터 바인딩 - 다국어 처리 | - |
카테고리별 전체 문서 목록
백엔드 (36개)
| 문서 | 제목 |
|---|---|
| activity-log-hooks.md | 활동 로그 훅 레퍼런스 (Activity Log Hooks Reference) |
| activity-log.md | 활동 로그 시스템 (Activity Log System) |
| admin-settings-access.md | Admin 환경설정 값 접근 (g7_core_settings vs config()) |
| api-documentation.md | API 레퍼런스 문서 규정 (API Documentation) |
| api-resources.md | API 리소스 |
| authentication.md | 인증 및 세션 처리 |
| benchmark.md | 성능 계측 시스템 (Benchmark) |
| broadcasting.md | Broadcasting (실시간 이벤트) |
| console-confirm.md | 콘솔 yes/no 프롬프트 (ConsoleConfirm) |
| controllers.md | 컨트롤러 계층 구조 |
| core-config.md | 코어 설정 (config/core.php) |
| core-update-system.md | 코어 업데이트 시스템 (Core Update System) |
| data-sync-helpers.md | 데이터 동기화 Helper (Data Sync Helpers) |
| dto.md | DTO (Data Transfer Object) 사용 규칙 |
| enum.md | Enum 사용 규칙 |
| exceptions.md | Custom Exception 다국어 처리 |
| geoip.md | GeoIP 시스템 (MaxMind GeoLite2) |
| identity-messages.md | 본인인증 메시지 템플릿 시스템 (Identity Messages) |
| identity-policies.md | 본인인증 정책 시스템 (Identity Policies) |
| identity-providers.md | IDV Provider 작성 가이드 (Identity Verification Providers) |
| language-pack-service.md | LanguagePackService (백엔드 Service 레이어) |
| middleware.md | 미들웨어 등록 규칙 |
| notification-system.md | 알림 시스템 (Notification System) |
| pagination.md | 대용량 목록 페이지네이션 (Pagination) |
| README.md | 백엔드 개발 가이드 |
| response-helper.md | API 응답 규칙 (ResponseHelper) |
| routing.md | 라우트 네이밍 및 경로 |
| search-system.md | Scout 검색 엔진 시스템 (Search System) |
| seo-system.md | SEO 페이지 생성기 시스템 (SEO Page Generator) |
| service-provider.md | 서비스 프로바이더 안전성 |
| service-repository.md | Service-Repository 패턴 |
| settings-multilingual-enrichment.md | Settings 카탈로그 다국어 자동 보강 |
| static-asset-publishing.md | 부트스트랩 리소스 정적 게시 (Static Asset Publishing) |
| translatable-seeders.md | 다국어 시더 인터페이스 (Translatable Seeders) |
| user-overrides.md | 사용자 수정 보존 (HasUserOverrides Trait) |
| validation.md | 검증 (Validation) |
프론트엔드 (51개)
| 문서 | 제목 |
|---|---|
| actions-g7core-api.md | 액션 시스템 - G7Core API (React 컴포넌트용) |
| actions-handlers-navigation.md | 액션 핸들러 - 네비게이션 |
| actions-handlers-state.md | 액션 핸들러 - 상태 관리 |
| actions-handlers-ui.md | 액션 핸들러 - UI 인터랙션 |
| actions-handlers.md | 액션 핸들러 - 핸들러별 상세 사용법 |
| actions.md | 액션 핸들러 가이드 |
| auth-system.md | 인증 시스템 (AuthManager) |
| component-props-composite.md | 컴포넌트 Props 레퍼런스 - Composite |
| component-props.md | 컴포넌트 Props 레퍼런스 |
| components-advanced.md | 컴포넌트 고급 기능 |
| components-patterns.md | 컴포넌트 패턴 및 다국어 |
| components-types.md | 컴포넌트 타입별 개발 규칙 |
| components.md | 컴포넌트 개발 규칙 |
| dark-mode.md | 다크 모드 지원 (engine-v1.1.0+) |
| data-binding-i18n.md | 데이터 바인딩 - 다국어 처리 |
| data-binding.md | 데이터 바인딩 및 표현식 |
| data-sources-advanced.md | 데이터 소스 - 고급 기능 |
| data-sources.md | 데이터 소스 (Data Sources) |
| editors.md | 에디터 컴포넌트 가이드 |
| g7core-api-advanced.md | G7Core 전역 API 레퍼런스 - 고급 |
| g7core-api.md | G7Core 전역 API 레퍼런스 |
| g7core-helpers.md | G7Core 헬퍼 API |
| identity-guard-interceptor.md | IdentityGuardInterceptor — 코어 본인인증 인터셉터 레퍼런스 |
| identity-verification-ui.md | 본인인증(IDV) 공통 UI 가이드 |
| layout-json-components-loading.md | 레이아웃 JSON - 데이터 로딩 및 생명주기 |
| layout-json-components-rendering.md | 레이아웃 JSON - 조건부/반복 렌더링 |
| layout-json-components-slots.md | 레이아웃 JSON - 슬롯 시스템 |
| layout-json-components.md | 레이아웃 JSON - 컴포넌트 (반복 렌더링, Blur, 생명주기, 슬롯) |
| layout-json-features-actions.md | 레이아웃 JSON - 초기화, 모달, 액션, 스크립트 |
| layout-json-features-error.md | 레이아웃 JSON - 에러 핸들링 |
| layout-json-features-styling.md | 레이아웃 JSON - 스타일 및 계산된 값 |
| layout-json-features.md | 레이아웃 JSON - 기능 (에러 핸들링, 초기화, 모달, 액션) |
| layout-json-inheritance.md | 레이아웃 JSON - 상속 (Extends, Partial, 병합) |
| layout-json.md | 레이아웃 JSON 스키마 |
| layout-testing.md | 그누보드7 레이아웃 파일 렌더링 테스트 가이드 |
| modal-usage.md | Modal 컴포넌트 사용 가이드 |
| README.md | 그누보드7 프론트엔드 개발 가이드 |
| responsive-layout.md | 반응형 레이아웃 개발 (engine-v1.1.0+) |
| security.md | 보안 및 검증 |
| state-management-advanced.md | 상태 관리 - 고급 기능 |
| state-management-forms.md | 상태 관리 - 폼 자동 바인딩 및 setState |
| state-management.md | 전역 상태 관리 |
| tailwind-safelist.md | Tailwind Safelist 가이드 |
| template-development.md | 템플릿 개발 가이드라인 |
| template-handlers.md | 템플릿 전용 핸들러 |
| components.md | sirsoft-admin_basic 컴포넌트 |
| handlers.md | sirsoft-admin_basic 핸들러 |
| layouts.md | sirsoft-admin_basic 레이아웃 |
| components.md | sirsoft-basic 컴포넌트 |
| handlers.md | sirsoft-basic 핸들러 |
| layouts.md | sirsoft-basic 레이아웃 |
확장 시스템 (31개)
| 문서 | 제목 |
|---|---|
| cache-driver.md | 캐시 드라이버 시스템 (CacheInterface) |
| changelog-rules.md | Changelog 규칙 (Changelog Rules) |
| editor-spec.md | 편집기 스펙 (editor-spec.json) |
| extension-manager.md | ExtensionManager (확장 관리자) |
| extension-update-system.md | 확장 업데이트 시스템 (Extension Update System) |
| hooks.md | 훅 시스템 (Hook System) |
| language-packs.md | 언어팩 시스템 (Language Packs) |
| layout-extensions.md | 레이아웃 확장 시스템 (Layout Extensions) |
| menus.md | 메뉴 시스템 |
| module-assets.md | 모듈 프론트엔드 에셋 시스템 |
| module-basics.md | 모듈 개발 기초 |
| module-commands.md | 모듈 Artisan 커맨드 |
| module-i18n.md | 모듈 다국어 시스템 |
| module-identity-settings.md | 모듈/플러그인 본인인증(IDV) 설정 통합 가이드 |
| module-layouts.md | 모듈 레이아웃 시스템 |
| module-routing.md | 모듈 라우트 규칙 |
| module-settings.md | 모듈 환경설정 시스템 개발 가이드 |
| permissions.md | 권한 시스템 |
| plugin-development.md | 플러그인 개발 가이드 |
| README.md | 그누보드7 확장 시스템 개발 가이드 |
| sample-extensions.md | 학습용 샘플 확장 (Sample Extensions) |
| storage-driver.md | 스토리지 드라이버 시스템 (StorageInterface) |
| template-basics.md | 템플릿 시스템 기초 |
| template-caching.md | 템플릿 캐싱 전략 |
| template-commands.md | 템플릿 Artisan 커맨드 |
| template-idv-bootstrap.md | 템플릿 IDV launcher 등록 가이드 |
| template-routing.md | 템플릿 라우트/언어 파일 규칙 |
| template-security.md | 템플릿 보안 정책 |
| template-workflow.md | 템플릿 개발 워크플로우 |
| upgrade-step-guide.md | 업그레이드 스텝 작성 가이드 (Upgrade Step Guide) |
| vendor-bundle.md | Vendor 번들 시스템 (Vendor Bundle System) |
공통 (20개)
| 문서 | 제목 |
|---|---|
| README.md | 그누보드7 Multi-Agent System |
| README.md | 그누보드7 DevTools MCP 서버 |
| README.md | 그누보드7 AI 도구 |
| create-module.md | 모듈 스캐폴딩 (create-module) |
| create-plugin.md | 플러그인 스캐폴딩 (create-plugin) |
| create-template.md | 템플릿 스캐폴딩 (create-template) |
| extract-i18n-keys.md | 다국어 키 추출 (extract-i18n-keys) |
| run-tests.md | 테스트 실행 (run-tests) |
| validate-backend.md | 백엔드 코드 패턴 검증 (validate-backend) |
| validate-frontend.md | 프론트엔드 검증 (validate-frontend) |
| validate-hook.md | 훅 패턴 검증 (validate-hook) |
| validate-i18n.md | 다국어 검증 (validate-i18n) |
| validate-migration.md | 마이그레이션 검증 (validate-migration) |
| cheatsheet.md | 그누보드7 자주 쓰는 명령어 치트시트 |
| database-guide.md | 그누보드7 데이터베이스 개발 가이드 |
| README.md | 그누보드7 문서 인덱스 |
| requirements.md | 그누보드7 시스템 요구사항 (System Requirements) |
| SECURITY.md | 그누보드7 템플릿 엔진 보안 가이드 |
| testing-guide.md | 그누보드7 테스트 가이드 |
| e2e-testing.md | 그누보드7 Playwright E2E 테스트 가이드 |
AI 도구
| 문서 | 설명 |
|---|---|
| ai-tools/README.md | AI 도구 개요 |
| ai-tools/skills/ | AI 코딩 도구 스킬 |
| ai-tools/agents/ | 멀티에이전트 시스템 소스 |