스크립트를 사용해 컴파일 타임에 컴포넌트의 Zod 설명을 가져옵니다
이 기능을 사용하면 구성 요소의 설명을 타입 안전한 "Zod" 설명 형태로 가져올 수 있으며, 이는 콘텐츠에 대해 TS 우선 스키마 검증과 정적 타입 추론을 제공합니다.
Zod 스키마를 가져오기 위해, 몇 가지 의존성을 로드하고 cms-renderer의 유틸리티를 사용하는 스크립트를 만들 것입니다.
프로젝트 구조부터 살펴보겠습니다
apps/
web/
app/
page.tsx
scripts/
generate-schemas.ts // 스크립트가 위치하는 곳입니다
이제 generated-schema.ts 파일을 수정하겠습니다
import { fetchAllCustomSchemaFields, saveZodSchemaCode } from 'cms-renderer/lib/custom-schemas';
import { cmsConfig } from '../lib/cms-config'; // 내 설정을 가져옵니다
async function main() {
const { cmsUrl, websiteId, apiKey } = cmsConfig;
if (!cmsUrl) {
throw new Error(
'[generate-schemas] NEXT_PUBLIC_CMS_API_URL이 설정되어 있지 않습니다. 환경 변수 또는 .env 파일에 설정하세요.'
);
}
if (!websiteId) {
throw new Error(
'[generate-schemas] NEXT_PUBLIC_PROFOUND_WEBSITE_ID가 설정되어 있지 않습니다. 환경 변수 또는 .env 파일에 설정하세요.'
);
}
if (!apiKey) {
throw new Error(
'[generate-schemas] PROFOUND_API_KEY가 설정되어 있지 않습니다. 환경 변수 또는 .env 파일에 설정하세요.'
);
}
const schemas = await fetchAllCustomSchemaFields({ cmsUrl, websiteId, apiKey });
if (schemas.length === 0) {
throw new Error(
'[generate-schemas] API에서 반환된 컴포넌트가 없습니다. PROFOUND_API_KEY가 유효하며 올바른 웹사이트를 가리키는지 확인하세요.'
);
}
await saveZodSchemaCode(schemas, './generated/cms-schemas.ts');
console.log('[generate-schemas] 완료.');
}
main().catch((err) => {
console.error('[generate-schemas] 실패:', err);
process.exit(1);
});
당신의 CmsConfig는 다음과 같아야 합니다
export const cmsConfig = {
cmsUrl: process.env.NEXT_PUBLIC_CMS_API_URL,
apiKey: process.env.CMS_API_KEY,
websiteId: '...',
};
package.json 내부에서 스크립트를 실행하는 방법과 몇 가지 의존성을 정의합니다
참고: tsconfig가 없다면
--tsconfig플래그와 그 값을 제거하면 됩니다
{
"name": "web",
"version": "0.1.0",
"type": "module",
"private": true,
"scripts": {
"generate-schemas": "tsx --tsconfig tsconfig.json scripts/generate-schemas.ts",
"...": "..."
},
"dependencies": {
"cms-renderer": "0.3.1",
"zod": "^4.3.6",
"...": "..."
},
"devDependencies": {
"tsx": "^4.21.0",
"object-hash": "^3.0.0",
"...": "..."
}
}
이제 다음 명령을 실행하면
$ bun run generate-schemas
tsx --tsconfig tsconfig.json scripts/generate-schemas.ts
[generate-schemas] 완료.
비슷한 출력이 나타나고, 프로젝트 구조에 새 파일이 생성된 것을 확인할 수 있습니다
apps/
web/
app/
page.tsx
scripts/
generated-schema.ts // 스크립트가 위치하는 곳입니다
generated/
cms-schema.ts // 생성된 Zod 스키마
파일 안을 살펴보며 스키마가 어떻게 생겼는지 확인할 수 있습니다. 이 파일을 업데이트하려면 bun run generate-schemas 명령을 다시 실행해야 하며, 이를 dev나 build 워크플로에 연결할 수 있습니다.
그런 다음 이러한 Zod 객체를 다음과 같이 page.tsx 파일로 가져올 수 있습니다
import type { PetFoodPost, SiteConfig } from '@/generated/cms-schemas';
import { petFoodPostSchema } from '@/generated/cms-schemas';
// 객체를 타입 안전하게 파싱하려면 petFoodPostSchema.parse(obj)를 호출하세요
관리자 패널에서 컴포넌트를 업데이트하고 다시 스키마를 가져와 손쉽게 개발할 수 있습니다