다음은 Ghost 태그 체계 개편 및 Next.js 홈 큐레이션 연동 개발 구현 명세의 정식 문안이다
1. 문서 목적
본 명세는 Ghost CMS의 태그 구조를 재정의하고, 해당 태그를 기반으로 Next.js 홈 화면 큐레이션 영역을 일관되게 구성하기 위한 개발 구현 기준을 정의한다.
대상 범위는 다음과 같다.
- Ghost 태그 분류 체계
- Ghost Content API 조회 규칙
- Next.js 내부 정규화 응답 구조
- 홈 큐레이션 섹션 필터링 및 노출 규칙
- 타입 설계 기준
- 예외 처리 및 운영 규칙
2. 전제 조건
현재 시스템은 다음 구조를 전제로 한다.
- Ghost는 콘텐츠 원본 저장소(CMS)이다.
- Next.js는 고객 노출용 프론트엔드이다.
FOLDERS설정은 폴더(대분류) 순서 및 메타데이터를 담당한다.- 게시물 조회는 Ghost Content API를 통해 수행한다.
- 현재 목록 정렬 기본값은
published_at DESC이다.
3. 태그 체계 개편 기준
3.1 태그 유형
Ghost 태그는 아래 3종으로 구분한다.
| 유형 | 용도 | 고객 노출 여부 | 예시 |
|---|---|---|---|
| 폴더 태그 | 게시물의 소속 분류 | 노출 | tax-guide, payroll-guide |
| 홈 큐레이션 태그 | 홈 화면 섹션 편성 | 비노출 권장 | #hub-start, #hub-deadline |
| 운영/보조 태그 | 내부 관리, 실험, 캠페인 | 비노출 | #draft-review, #campaign-2026-q2 |
3.2 폴더 태그 규칙
- 각 게시물은 고객 탐색 기준이 되는 대표 분류를 가져야 한다.
- 해당 분류는 Ghost의
primary_tag로 해석한다. primary_tag.slug는 Next.js의FOLDERS.slug와 정확히 일치해야 한다.- 폴더 태그는 URL 경로 및 브레드크럼 기준값으로 사용한다.
3.3 홈 큐레이션 태그 규칙
- 홈 큐레이션 태그는 섹션 편성 전용 태그로 사용한다.
- 운영 입력 예시는 다음과 같다.
| 항목 | 값 |
|---|---|
| name | #hub-start |
| slug | hub-start |
| description | 🔥 초보 사장님을 위한 기초 가이드 |
name은 운영자 식별용 표기값이다.slug는 프로그램 식별값이다.description은 섹션 제목 또는 운영 메모의 원천 데이터로 사용할 수 있다.- 고객 화면에는
#접두사를 직접 노출하지 않는다.
4. 홈 큐레이션 도메인 모델
4.1 섹션 정의 기준
홈 큐레이션 섹션은 Ghost 태그만으로 완결하지 않고, 프론트엔드 설정과 결합하여 정의한다.
| 필드 | 설명 |
|---|---|
| sectionKey | 프론트엔드 내부 식별자 |
| curationTagSlug | Ghost 큐레이션 태그 slug |
| title | 홈 화면 노출 제목 |
| description | 홈 화면 보조 설명 |
| limit | 섹션 최대 노출 개수 |
| allowedFolderSlugs | 허용 폴더 범위 |
| priority | 섹션 렌더링 순서 |
4.2 설계 원칙
- Ghost 태그는 “게시물 포함 여부”만 결정한다.
- 홈 화면 문구, 순서, 개수, UI 메타데이터는 Next.js 설정이 최종 기준이다.
- 따라서 Ghost는 편집 권한, Next.js는 표현 권한을 가진다.
5. 데이터 조회 규칙
5.1 Ghost 조회 단위
홈 큐레이션은 섹션별로 Ghost에서 게시물을 조회한 뒤 정규화한다.
기본 조회 기준:
| 항목 | 값 |
|---|---|
| 대상 | posts |
| include | tags, primary_tag |
| 상태 | published only |
| 정렬 | published_at DESC |
| limit | 섹션별 설정값 또는 그 이상 확보 후 후처리 |
5.2 필수 조회 필드
게시물 정규화에 필요한 최소 필드는 다음과 같다.
| 필드 | 필요 여부 | 용도 |
|---|---|---|
| id | 필수 | 고유 식별 |
| slug | 필수 | URL 생성 |
| title | 필수 | 카드 제목 |
| excerpt | 필수 | 요약 노출 |
| published_at | 필수 | 정렬/표기 |
| feature_image | 권장 | 카드 썸네일 |
| reading_time | 권장 | 부가 정보 |
| primary_tag | 필수 | 폴더 매핑 |
| tags | 필수 | 큐레이션 태그 포함 여부 판별 |
6. 내부 응답 구조 명세
6.1 홈 큐레이션 응답 단위
Next.js 내부에서는 홈 데이터를 아래 구조로 정규화한다.
HomeResponse
| 필드 | 타입 | 설명 |
|---|---|---|
| generatedAt | string | 서버 생성 시각(ISO 8601) |
| sections | HomeSection[] | 홈 섹션 목록 |
HomeSection
| 필드 | 타입 | 설명 |
|---|---|---|
| sectionKey | string | 내부 식별자 |
| title | string | 노출 제목 |
| description | string | null | 노출 설명 |
| curationTagSlug | string | Ghost 태그 기준값 |
| items | CuratedPostSummary[] | 섹션 게시물 목록 |
CuratedPostSummary
| 필드 | 타입 | 설명 |
|---|---|---|
| id | string | 게시물 ID |
| slug | string | 게시물 slug |
| title | string | 제목 |
| excerpt | string | null | 요약 |
| publishedAt | string | 발행일 |
| readingTime | number | null | 예상 읽기 시간 |
| featureImage | string | null | 썸네일 |
| folder | FolderRef | 소속 폴더 정보 |
| tags | TagRef[] | 태그 요약 정보 |
FolderRef
| 필드 | 타입 | 설명 |
|---|---|---|
| slug | string | 폴더 slug |
| label | string | 폴더 표시명 |
TagRef
| 필드 | 타입 | 설명 |
|---|---|---|
| slug | string | 태그 slug |
| name | string | 태그명 |
7. 타입 설계 기준
7.1 Ghost 원본 타입
Ghost 응답 타입은 CMS 원형 보존 목적의 소스 타입으로 유지한다.
GhostPostGhostTag
7.2 애플리케이션 타입
프론트엔드에서 직접 사용하는 타입은 별도 정규화 타입으로 분리한다.
| 타입명 | 역할 |
|---|---|
| FolderConfig | 폴더 메타데이터 |
| HomeSectionConfig | 홈 섹션 설정 |
| HomeResponse | 홈 전체 응답 |
| HomeSection | 섹션 단위 데이터 |
| CuratedPostSummary | 카드 렌더링용 게시물 요약 |
| FolderRef | 폴더 참조 |
| TagRef | 태그 참조 |
7.3 분리 원칙
- Ghost 타입과 화면 타입을 혼용하지 않는다.
- Ghost 필드명(
published_at)은 정규화 후 앱 표준 필드명(publishedAt)으로 변환한다. - 화면 컴포넌트는 정규화 타입만 소비한다.
8. 필터링 규칙
8.1 기본 포함 조건
게시물이 특정 홈 섹션에 포함되려면 아래 조건을 모두 만족해야 한다.
- 게시물 상태가 published일 것
tags배열에 해당curationTagSlug가 존재할 것primary_tag.slug가 존재할 것primary_tag.slug가FOLDERS설정에 존재할 것
8.2 제외 조건
아래 조건 중 하나라도 만족하면 홈 큐레이션에서 제외한다.
primary_tag가 없는 경우primary_tag.slug가 프론트엔드 폴더 설정에 없는 경우- 큐레이션 태그만 있고 공개 분류 태그가 없는 경우
- 비공개/초안/예약 상태인 경우
- 필수 필드(
id,slug,title)가 비어 있는 경우
8.3 폴더 제한 규칙
- 섹션별로
allowedFolderSlugs를 둘 수 있다. - 값이 지정된 경우, 해당 목록에 포함되는 폴더의 게시물만 노출한다.
- 값이 비어 있으면 모든 폴더 허용으로 간주한다.
8.4 중복 규칙
- 동일 게시물이 여러 큐레이션 태그를 가진 경우 복수 섹션에 포함될 수 있다.
- 단, 홈 화면 전체 중복 노출을 금지하려면 섹션 우선순위 기준으로 1회만 노출한다.
- 기본 권장 정책은 중복 제거이다.
- 중복 제거 순서는
priority ASC기준으로 처리한다.
8.5 정렬 규칙
기본 정렬은 다음과 같다.
- 최신 발행일 내림차순
- 동률 시 제목 오름차순
별도 수동 정렬 기능은 본 범위에 포함하지 않는다.
8.6 개수 제한 규칙
- 각 섹션은
limit수만큼만 노출한다. - 필터링 후 남은 게시물이
limit보다 적으면 가능한 수량만 노출한다. - 결과가 0건이면 해당 섹션은 숨김 처리한다.
9. 홈 화면 연동 규칙
9.1 렌더링 순서
홈 섹션은 프론트엔드 설정의 priority 또는 배열 순서대로 렌더링한다.
Ghost 태그 생성 순서나 발행 순서는 섹션 순서에 영향을 주지 않는다.
9.2 카드 노출 기준
각 카드에는 최소 아래 정보를 노출한다.
- 제목
- 요약
- 폴더명
- 발행일
- 썸네일(있을 경우)
9.3 링크 규칙
게시물 상세 링크는 아래 규칙을 따른다.
- 경로 형식:
/{folderSlug}/{postSlug} folderSlug는 반드시primary_tag.slug기준으로 생성한다.
10. API 계약 기준
10.1 Ghost Content API 입력 계약
Ghost 조회 시 애플리케이션이 의존하는 최소 계약은 다음과 같다.
| 항목 | 계약 |
|---|---|
| 태그 식별 | slug 기준 |
| 폴더 식별 | primary_tag.slug 기준 |
| 큐레이션 식별 | tags[].slug 기준 |
| 태그 포함 | include=tags,primary_tag 수준 보장 필요 |
10.2 프론트엔드 내부 서비스 계약
홈 데이터 생성 서비스는 아래 입력/출력 계약을 가진다.
입력
- 홈 섹션 설정 목록
- Ghost 조회 결과 목록
출력
HomeResponse
10.3 장애 시 계약
- 특정 섹션 조회 실패 시 전체 페이지를 실패 처리하지 않는다.
- 실패 섹션은 빈 배열로 대체하거나 숨김 처리한다.
- 전체 Ghost 연결 실패 시 홈 큐레이션 전체를 비노출 처리하고, 폴더 기반 기본 화면만 유지할 수 있어야 한다.
11. 검증 규칙
11.1 설정 검증
배포 전 아래 항목을 검증한다.
sectionKey중복 금지curationTagSlug중복 금지FOLDERS.slug중복 금지- 홈 섹션의
allowedFolderSlugs가 모두 유효한 폴더 slug인지 검증 limit는 1 이상의 정수인지 검증
11.2 콘텐츠 검증
운영 시 아래 상태를 검출 가능해야 한다.
- 큐레이션 태그는 있으나
primary_tag가 없는 게시물 primary_tag는 있으나 프론트엔드 폴더 설정에 없는 게시물- 홈 섹션에 0건만 반환되는 큐레이션 태그
- 동일 게시물이 과도하게 중복 편성된 상태
12. 운영 규칙
12.1 운영자 작업 규칙
운영자가 홈에 게시물을 노출하려면 다음 절차를 따른다.
- 게시물에 공개 분류용 폴더 태그를 지정한다.
- 필요 시 홈 큐레이션용 태그를 추가한다.
- 홈 섹션 제목/설명/순서는 프론트엔드 설정에서 관리한다.
12.2 변경 책임 분리
| 변경 항목 | 담당 시스템 |
|---|---|
| 게시물 포함 여부 | Ghost |
| 섹션 제목/설명 | Next.js 설정 |
| 섹션 순서 | Next.js 설정 |
| 폴더명/아이콘 | Next.js 설정 |
| URL 구조 | Next.js 라우팅 + primary_tag.slug |
13. 최종 결론
본 개편의 핵심은 다음 두 가지다.
- 폴더 태그와 홈 큐레이션 태그의 역할을 분리한다.
- 폴더 태그: 정보 구조
- 큐레이션 태그: 편성 구조
- Ghost는 포함 여부만, Next.js는 표현 정책을 담당한다.
- Ghost 태그만으로 화면 구조를 결정하지 않는다.
- 화면 제목, 설명, 정렬, 제한 개수는 프론트엔드 명세가 최종 기준이다.