스킨 선택 흐름
관리자 게시판 설정의 skin 값이 default면 코어 기본 목록 스킨을 사용합니다. 다른 값이면 postSkins[skin]에서 등록된 컴포넌트를 찾고, 없으면 기본 스킨으로 fallback합니다.
게시판 설정 skin = "issuetracker"
→ @extensions 의 postSkins.issuetracker 확인
→ 등록되어 있으면 issuetracker 목록 스킨 사용
→ 없으면 코어 default 목록 스킨 사용중요한 점은 mid === "bin"처럼 라우터나 목록 페이지에 특정 게시판 ID를 하드코딩하지 않는 것입니다.
목록 스킨 등록
게시판 확장은 src/extensions/posts/[feature] 아래에 액션·쿼리·스킨·등록 정보를 함께 둡니다. 기본 src/modules/posts와 합치지 않습니다. 이슈트래커 스킨은 posts/issuetracker/tpl/list.tsx, 등록 정보는 posts/issuetracker/registry.tsx에 있습니다.
// src/extensions/posts/issuetracker/registry.tsx
import { definePostSkin } from "@/core/registry/define";
import IssueTrackerListSkin from "./tpl/list";
export const issueTrackerPostSkin = definePostSkin({
key: "issuetracker",
label: "이슈 트래커",
description: "open/close 상태와 진행 흐름을 다루는 이슈형 목록 스킨입니다.",
list: IssueTrackerListSkin,
});최상위 registry에서는 스킨 registry를 가져와서 조립합니다.
// src/extensions/registry.tsx
import { defineExtensionRegistry } from "@/core/registry/define";
import { issueTrackerPostSkin } from "./posts/issuetracker/registry";
export const registry = defineExtensionRegistry({
postSkins: [issueTrackerPostSkin],
});스킨별 capability
open/close 같은 기능은 Document.status를 코어에 하드코딩하지 않고 capability로 선언합니다.
// src/extensions/posts/issuetracker/capabilities.ts
import type { PostSkinCapability } from "@/core/registry/defaultPostCapabilities";
export const issueTrackerCapabilities: PostSkinCapability = {
documentStatus: {
defaultStatus: "open",
useStatusCounts: true,
},
};공통 연결점에서는 기능별 선언을 가져와 조립합니다. 폴더를 넣는 것만으로 자동 등록되지는 않습니다.
// src/extensions/postCapabilities.ts
import { issueTrackerCapabilities } from "./posts/issuetracker/capabilities";
export const postSkinCapabilities = {
issuetracker: issueTrackerCapabilities,
};새 게시판 스킨 만들기
src/extensions/posts/roadmap/
tpl/list.tsx
actions/roadmap.action.ts
actions/roadmap.query.ts
registry.tsx
capabilities.ts기존 코어 action으로 충분한 조회나 삭제까지 새로 만들 필요는 없습니다. 스킨만 교체하면 새 Next.js 라우트도 필요하지 않습니다. 별도 페이지·API가 필요한 경우에만 해당 확장 안에 구현과 routes.json을 추가합니다. 기능 전용 Trigger도 확장 내부에 두고 공통 등록점에서 명시적으로 연결합니다.
본문과 댓글 SEO
게시글 목록과 본문은 가능한 서버 컴포넌트에서 HTML을 먼저 만들어 내려주는 구조가 좋습니다. 에디터, 댓글 작성창, 첨부파일 업로드처럼 상호작용이 필요한 부분만 클라이언트 컴포넌트로 분리하면 검색 엔진이 제목, 본문 요약, 댓글 텍스트를 더 안정적으로 읽을 수 있습니다.