세 갈래의 결함을 한 브랜치에서 정리한다.
## 목록 컨텍스트 왕복 시 URL 상태 소실 ( @jiwonpapa 님께서 제보해주셨습니다.)
목록에서 상세·형제 상세(이전/다음)·작성/수정 폼에 다녀오면 보고 있던
page/search/category/filters 가 사라지던 문제를 전 도메인에서 수정했다.
- 엔진(engine-v1.54.2): `mergeQuery: true` 만 적고 `query` 를 생략하면 병합이
통째로 건너뛰어지던 함정을 교정 — `ActionDispatcher.handleNavigate`/`handleReplaceUrl`.
- 게시판·이커머스·페이지·회원·마이페이지·gdpr 등 9개 확장 레이아웃의 왕복 leg 전수
적용(mergeQuery: true). 의도적 리셋(검색/필터 초기화·탭 전환·프리셋)은 면제 주석으로 구분.
- 무한스크롤 목록(브랜드·상품 공통정보·고시정보)의 새로고침이 URL 검색·정렬을 떨구던
결함 수정.
- 재발 차단: audit 룰 `layout-list-context-navigate-merge-query`(목록 클러스터 자동 도출,
page/필터 URL 신호 4종) + `layout-navigate-path-absolute`(navigate path 동작 키워드 금지).
## cellChildren 등 반복 렌더에서 단일 바인딩 파이프 미적용 ( @glitter-gim 님께서 제보해주셨습니다.)
목록 표의 각 칸에 넣은 날짜·숫자 서식(`{{row.x | datetime(...)}}`)이 빈 값이 되거나
서식 없는 원본으로 나오던 문제를, 표현식 판정 로직이 엔진 전역에 복제되며 갈라진
구조적 결함으로 진단하고 판정 경로를 단일화했다(engine-v1.54.3).
- `RenderHelpers`(renderItemChildren·evaluateIfCondition)·`ConditionEvaluator`·
`DataBindingEngine.resolveObject`·`DynamicRenderer` props 5곳에 단일 바인딩 파이프 분기 추가.
- 계획: `g7-scalable-lobster.md`(렌더 경로 비대칭 결함 일괄 수정).
## 공개 문서 내부 도구 귀속 제거
release 에 포함되는 공개 문서(`docs/**`)에서 내부 audit 룰 ID 귀속 서술을
도구 비귀속 표현("정적 검사")으로 정리. 재발 차단 룰 `public-no-internal-audit-reference` 신설.
전 계층 테스트(PHPUnit·Vitest·Playwright)·회귀 테스트 동반, 버전/CHANGELOG/활성 디렉토리 동기 완료.
7.0 KiB
7.0 KiB
컴포넌트 개발 규칙
참조: 프론트엔드 가이드 인덱스
TL;DR (5초 요약)
1. HTML 태그 직접 사용 금지 (<div> → Div, <button> → Button)
2. 타입: basic (HTML 래핑), composite (조합), layout (배치)
3. 집합 컴포넌트 재사용 우선 (새로 만들기 전 기존 확인)
4. G7Core.t() 함수로 다국어 처리
5. 다크 모드: light/dark variant 함께 지정
하위 문서 안내
| 하위 문서 | 주요 내용 | 설명 |
|---|---|---|
| components-types.md | basic, composite, layout | 컴포넌트 타입별 개발 규칙, 재사용 가이드라인 |
| components-patterns.md | 순환 의존성, G7Core.t, skipBindingKeys | 패턴 및 다국어 처리 |
| components-advanced.md | componentEvent, 아이콘, 체크리스트 | 이벤트 통신, 아이콘 규칙, 개발 체크리스트 |
템플릿별 레퍼런스
| 템플릿 식별자 | 컴포넌트 | 핸들러 | 레이아웃 |
|---|---|---|---|
sirsoft-admin_basic |
components.md | handlers.md | layouts.md |
sirsoft-basic |
components.md | handlers.md | layouts.md |
목차
타입별 개발 규칙 (상세 문서)
- 핵심 원칙
- 기본 컴포넌트 (Basic Component)
- 집합 컴포넌트 (Composite Component)
- 집합 컴포넌트 재사용 가이드라인
- 레이아웃 컴포넌트 (Layout Component)
패턴 및 다국어 (상세 문서)
고급 기능 (상세 문서)
- 컴포넌트 간 이벤트 통신 (G7Core.componentEvent)
- 이벤트 생성 헬퍼
- 아이콘 사용 규칙 (Font Awesome)
- Form 자동 바인딩 메타데이터 (bindingType)
- 컴포넌트 개발 체크리스트
핵심 원칙
필수: 기본 컴포넌트 사용 (HTML 태그 직접 사용 금지)
필수: 기본 컴포넌트만 사용 (Div, Button, H2 등)
✅ 필수: 집합 컴포넌트 재사용 우선
→ 상세 문서
기능 빠른 참조
컴포넌트 타입 요약
| 타입 | 정의 | 예시 |
|---|---|---|
basic |
HTML 태그 래핑 | Button, Input, Div, Icon, H1, Span |
composite |
기본 컴포넌트 조합 | Card, DataGrid, Modal, Pagination |
layout |
자식 요소 배치 | Container, Grid, Flex, SectionLayout |
→ 상세 문서
다국어 처리 (G7Core.t)
// G7Core.t() 번역 함수 참조
const t = (key: string, params?: Record<string, string | number>) =>
(window as any).G7Core?.t?.(key, params) ?? key;
// 사용
<Button>{t('common.confirm')}</Button>
<Span>{t('admin.users.pagination_info', { from: 1, to: 10, total: 100 })}</Span>
→ 상세 문서
컴포넌트 이벤트 통신
// 이벤트 구독
const unsubscribe = G7Core.componentEvent.on('eventName', callback);
// 이벤트 발생
G7Core.componentEvent.emit('triggerUpload:logo_uploader');
→ 상세 문서
아이콘 사용 (Font Awesome)
import { Icon, IconName } from '../basic/Icon';
<Icon name={IconName.Check} />
<Icon name="fa-solid fa-user" />
주의: Font Awesome Pro 전용 아이콘 사용 금지 (Light, Thin, Duotone)
주의: 다른 아이콘 라이브러리 직접 import 금지
→ 상세 문서
컴포넌트 등록 체크리스트
필수: 새 컴포넌트 생성 시 아래 4개 파일에 등록
□ 컴포넌트 파일 생성: templates/[vendor-template]/src/components/{type}/{Name}.tsx
□ index.ts export 추가: templates/[vendor-template]/src/components/{type}/index.ts
□ components.json 등록: templates/[vendor-template]/components.json
□ 테스트 파일 생성: templates/[vendor-template]/src/components/{type}/__tests__/{Name}.test.tsx
→ 상세 문서
레이아웃 편집기 capability 선언 의무
새 draggable 컴포넌트(레이아웃 편집기 팔레트/캔버스에 노출)는 위 4개 파일에 더해 호스트 템플릿 editor-spec/componentCapabilities.json 에 capability 를 선언해야 편집기에서 "편집 불가(no-editable)"가 되지 않는다. 표시 텍스트/아이콘/select/목록·배열·표 데이터 prop 별로 propControls(속성 탭) / dataProps(데이터 연결) / nodeEditor·canvasOverlay(구조 에디터) / styleControls(스타일 탭) / events(동작 탭) 를 선언한다. 데이터 표면을 가진 컴포넌트가 편집 슬롯도 비대상 allowlist 도 없으면 정적 검사가 차단한다. composite/layout 컴포넌트는 editorAttrs spread + id 패스스루도 필요하다.
상세: editor-spec.md "componentCapabilities" · components-types.md "편집기 attribute 패스스루"
관련 문서
- g7core-api.md - G7Core 전역 API 레퍼런스
- 레이아웃 JSON 스키마 - 컴포넌트를 레이아웃 JSON에서 사용하는 방법
- 데이터 바인딩 - props에서 데이터 바인딩 사용법
- sirsoft-admin_basic 컴포넌트 - Admin 컴포넌트 목록 (111개)
- sirsoft-basic 컴포넌트 - User 컴포넌트 목록 (58개)
- 다크 모드 - 컴포넌트 다크 모드 지원 가이드
- 상태 관리 - 전역/로컬 상태 관리 및 동기화 패턴