Files
Gnuboard7/docs/frontend/components.md
T
HeuJung b505ac7ba7 fix(core,board,ecommerce,page,gdpr): 목록 컨텍스트 왕복·엔진 렌더 파이프 결함 일괄 수정 + 공개문서 정리
세 갈래의 결함을 한 브랜치에서 정리한다.

## 목록 컨텍스트 왕복 시 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/활성 디렉토리 동기 완료.
2026-07-26 15:17:56 +09:00

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

목차

타입별 개발 규칙 (상세 문서)

  1. 핵심 원칙
  2. 기본 컴포넌트 (Basic Component)
  3. 집합 컴포넌트 (Composite Component)
  4. 집합 컴포넌트 재사용 가이드라인
  5. 레이아웃 컴포넌트 (Layout Component)

패턴 및 다국어 (상세 문서)

  1. 순환 의존성 해결 패턴
  2. 다국어 번역 (G7Core.t)
  3. skipBindingKeys (바인딩 지연 처리)

고급 기능 (상세 문서)

  1. 컴포넌트 간 이벤트 통신 (G7Core.componentEvent)
  2. 이벤트 생성 헬퍼
  3. 아이콘 사용 규칙 (Font Awesome)
  4. Form 자동 바인딩 메타데이터 (bindingType)
  5. 컴포넌트 개발 체크리스트

핵심 원칙

필수: 기본 컴포넌트 사용 (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 패스스루"


관련 문서