profound-logoProfound CMS
โŒ˜K
Admin
Theme
DocsTutorialBlogPhilosophy
DocsTutorialBlogPhilosophy

Tutorials

Build & Ship an Airport DirectoryDeployments์ŠคํŠธ๋ผ์ดํ”„ ์Šคํ† ์–ดํ”„๋ŸฐํŠธ

CMS ๊ธฐ๋Šฅ

Documentation Site TemplateFeature Template BuilderTranslation ServiceOrganizations & Website HeirarchyConnect Profound CMS to your AI clientSettings Integrations์„ค์ •-API-ํ‚คSettings UsageSettings Websites
All Systems Operational
Powered Byprofound-logo
Theme

Build & Ship an Airport Directory

์‹ค์Šตํ˜• ์•ˆ๋‚ด์„œ: Profound CMS์—์„œ ๊ตญ์ œํ™”๋œ ๊ณตํ•ญ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜์„ธ์š” โ€” 35๊ฐœ ์–ธ์–ด๋กœ ๋ชจ๋“  ๊ณตํ•ญ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ผ์šฐํŠธ.

Profound CMS์—์„œ ์‹ค์ œ ๊ตญ์ œํ™”๋œ ๊ณตํ•ญ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜์„ธ์š”: ํ•˜๋‚˜์˜ URL ํŒจํ„ด์œผ๋กœ 35๊ฐœ ์–ธ์–ด๋กœ ๋ชจ๋“  ๊ณตํ•ญ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. Next.js ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  CMS ๊ตฌ์กฐ๋ฅผ ์ง์ ‘ ๊ตฌ์„ฑํ•˜์„ธ์š”; Claude Code(Profound MCP๋ฅผ ํ†ตํ•ด)๊ฐ€ ์„ธ ๊ฐ€์ง€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค โ€” ๊ณตํ•ญ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ๋„ค ๊ฐœ์˜ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์„ธ ํŒŒํŠธ: Setup, Build, Production.

์ „์ฒด ๋น„๋””์˜ค ์›Œํฌ์Šค๋ฃจ ๋ณด๊ธฐ.

๋งŒ๋“ค ๊ฒฐ๊ณผ๋ฌผ

  • ~50๊ฐœ์˜ ๊ณตํ•ญ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๊ฐ์ž์˜ URL์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ผ์šฐํŠธ /{language}/{airport_code}.
  • ๋„ค ๊ฐœ์˜ UI ์š”์†Œ โ€” nav, headline, body, footer โ€” ๊ฐ€ cms-renderer์— ์˜ํ•ด ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
  • CEL ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ CMS ๋ฐ์ดํ„ฐ.
  • ํ•œ ๋ฒˆ์˜ ํด๋ฆญ์œผ๋กœ 35๊ฐœ ์–ธ์–ด ์ „์ฒด๋ฅผ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค.
  • GitHub์™€ ์—ฐ๊ฒฐ๋œ Vercel์— ๋ฐฐํฌํ•˜์—ฌ ๋ผ์ด๋ธŒ ํ”„๋ฆฌ๋ทฐ์™€ ํ˜„์žฅ ํŽธ์ง‘์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์ค€๋น„ ์‚ฌํ•ญ

  • Bun โ‰ฅ 1.3 โ€” curl -fsSL https://bun.sh/install | bash
  • Profound MCP๊ฐ€ ์—ฐ๊ฒฐ๋œ Claude Code(ํŒŒํŠธ 1).
  • Profound CMS ๊ณ„์ •.
  • ํŒŒํŠธ 3์šฉ: GitHub์— ๋กœ๊ทธ์ธ๋œ GitHub CLI(gh)์™€ GitHub์— ์—ฐ๊ฒฐ๋œ Vercel ๊ณ„์ •.

๊ตฌ์„ฑ ๋ฐฉ์‹

  • ์ปดํฌ๋„ŒํŠธ๋Š” ์ฝ˜ํ…์ธ  ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Route Slug ํ•„๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ผ์šฐํŒ… ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , UI Element ํƒœ๊ทธ๋Š” ํŽ˜์ด์ง€์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, language ๊ฐ™์€ ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • Variant๋Š” ์ฝ˜ํ…์ธ  ์ž์ฒด์ž…๋‹ˆ๋‹ค(JFK, SFO, LAXโ€ฆ).
  • UI ์š”์†Œ๋Š” ํŽ˜์ด์ง€ ์„น์…˜์ด๋ฉฐ, ๋ Œ๋” ์‹œ ํ‰๊ฐ€๋˜๋Š” Profound์˜ ํ…œํ”Œ๋ฆฟ ๋‚ด ์Šคํฌ๋ฆฝํŒ… CEL๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.
  • ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ผ์šฐํŠธ๋Š” URL์„ ํ•˜๋‚˜์˜ Variant์™€ UI ์š”์†Œ ์ง‘ํ•ฉ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
  • Next.js ์•ฑ์€ ์ฝ๊ธฐ ์ „์šฉ API ํ‚ค์™€ ํ•จ๊ป˜ cms-renderer SDK๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๊ฒƒ์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

ํŒŒํŠธ 1 โ€” ์„ค์ •

์ตœ์ข… ์ƒํƒœ: CMS์— ~50๊ฐœ์˜ ๊ณตํ•ญ์ด ์žˆ๊ณ , ์•ฑ์ด ์ด๋ฅผ ์ฝ๋„๋ก ์—ฐ๊ฒฐ๋˜๋ฉฐ, ๋””์ž์ธ ์‹œ์Šคํ…œ์ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

1. ์›น์‚ฌ์ดํŠธ ์ƒ์„ฑ

Profound(WorkOS ์ธ์ฆ)์— ๊ฐ€์ž…ํ•˜๊ณ  airports๋ผ๋Š” ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€๋ฅผ ๋ณต์‚ฌํ•˜์„ธ์š”: website ID(๊ด€๋ฆฌ์ž URL์˜ UUID)์™€ Deployments โ†’ Create API key์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ์ฝ๊ธฐ ์ „์šฉ API ํ‚ค. ์•ฑ์€ ์ฝ๊ธฐ๋งŒ ํ•˜๋ฏ€๋กœ ์ฝ๊ธฐ ํ‚ค๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. ์•ฑ ์Šค์บํด๋”ฉ ๋ฐ ์—ฐ๊ฒฐ

bunx create-profound-next airports
cd airports

์ž๊ฒฉ ์ฆ๋ช…์„ .env.local์— ์ถ”๊ฐ€ํ•˜์„ธ์š”:

PROFOUND_API_KEY=<your read key>
NEXT_PUBLIC_PROFOUND_WEBSITE_ID=<your website id>
NEXT_PUBLIC_CMS_API_URL=https://cms.dev.tryprofound.com
NEXT_PUBLIC_BUNNY_CDN_URL=https://cms-profound.b-cdn.net

bun dev๋ฅผ ์‹คํ–‰ํ•˜๊ณ  localhost:3000์„ ์—ด์–ด ์—ฐ๊ฒฐ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

3. airport ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

๊ด€๋ฆฌ์ž์—์„œ Components โ†’ Create new component๋กœ ์ด๋™ํ•ด ์ด๋ฆ„์„ airport๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์„ฏ ๊ฐœ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”: code, name, city, country(Text)์™€ latitude, longitude(Number). code๋ฅผ Route Slug ํ•„๋“œ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์ƒํƒœ๋ฅผ Active๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•„๋“œ๋Š” ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ๋‘๊ณ , UI Element ํƒœ๊ทธ๋Š” ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์„ธ์š”.

airport&#32;์ปดํฌ๋„ŒํŠธ โ€” ์—ฌ์„ฏ ๊ฐœ์˜ ํ•„๋“œ์™€ Route Slug๋กœ ์„ค์ •๋œ code&#32;ํ•„๋“œ.

4. ์ปดํฌ๋„ŒํŠธ๋ฅผ ํƒ€์ž…์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ

bun run generate-schemas

์ด ๋ช…๋ น์€ airportSchema(Zod)์™€ Airport(type)๋ฅผ generated/cms-schemas.ts์— ์ž‘์„ฑํ•˜๋ฉฐ ์ž๊ฒฉ ์ฆ๋ช…๋„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

5. MCP๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์‹œ๋“œํ•˜๊ธฐ

MCP๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์ธ์ฆํ•˜์„ธ์š”:

claude mcp add --transport http Profound http://107.21.107.99:8081/mcp

์„œ๋ฒ„๋Š” OAuth(WorkOS)๋กœ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค. Claude Code์—์„œ /mcp๋ฅผ ์‹คํ–‰ํ•˜๊ณ  Profound๋ฅผ ์„ ํƒํ•œ ๋’ค ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ๊ทธ์ธ์„ ์™„๋ฃŒํ•˜์„ธ์š” โ€” Profound ๋„๊ตฌ๋ฅผ ์ฒ˜์Œ ํ˜ธ์ถœํ•˜๋ฉด Claude Code๊ฐ€ ์ž๋™์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋„์›๋‹ˆ๋‹ค. /mcp์— Profound๊ฐ€ connected๋กœ ํ‘œ์‹œ๋˜๋ฉด Claude์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์ฒญํ•˜์„ธ์š”:

์‹ค์ œ ๊ณตํ•ญ 50๊ณณ์„ ์ƒ์„ฑํ•˜์„ธ์š” โ€” ์˜ฌ๋ฐ”๋ฅธ IATA ์ฝ”๋“œ, ์ด๋ฆ„, ๋„์‹œ, ๊ตญ๊ฐ€, ์ขŒํ‘œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ data ํด๋”์˜ JSON์œผ๋กœ ์ €์žฅํ•˜๊ณ , ์šฐ๋ฆฌ airport ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ๊ฒ€์ฆํ•œ ๋’ค, Profound MCP๋ฅผ ํ†ตํ•ด ๋ณ‘๋ ฌ๋กœ ๊ฒŒ์‹œ๋œ ๋ฌธ์„œ๋กœ ๊ฐ๊ฐ ์ƒ์„ฑํ•˜์„ธ์š”.

airport โ†’ Variants๋ฅผ ์—ด์–ด ~50๊ฐœ์˜ ๊ฒŒ์‹œ๋œ ๊ณตํ•ญ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์€ API ํ‚ค๋กœ ์ฝ๊ณ , MCP๋Š” ์ž์ฒด WorkOS ์„ธ์…˜์œผ๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์•ฝ 50๊ฐœ์˜ ๊ณตํ•ญ์ด ๊ฒŒ์‹œ๋œ Variant๋กœ ์‹œ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

6. ๋””์ž์ธ ์‹œ์Šคํ…œ ์ถ”๊ฐ€

์Šค์บํด๋“œ๋Š” ์Šคํƒ€์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— DESIGN.md(Tailwind v4 @theme ๋ธ”๋ก๊ณผ ํ† ํฐ)๋ฅผ ๋‘์„ธ์š” โ€” ์ง์ ‘ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ refero.design์—์„œ ๋‹ค์šด๋กœ๋“œํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Claude์—๊ฒŒ ์š”์ฒญํ•˜์„ธ์š”:

DESIGN.md๋ฅผ ์ฝ๊ณ  Tailwind v4๋ฅผ ์„ค์ •ํ•œ ๋’ค ํ…Œ๋งˆ์™€ ํฐํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜์„ธ์š”. ํฐํŠธ๋Š” ๋Ÿฐํƒ€์ž„ Google import๊ฐ€ ์•„๋‹ˆ๋ผ next/font๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์Šคํƒ€์ผ๋ง๋งŒ โ€” ํŽ˜์ด์ง€๋‚˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์•„์ง ๋งŒ๋“ค์ง€ ๋งˆ์„ธ์š”.

src/app/globals.css์— @import "tailwindcss";์™€ @theme ๋ธ”๋ก์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€, localhost:3000์—์„œ ํ† ํฐ์ด ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

ํŒŒํŠธ 2 โ€” ๋นŒ๋“œ

๋ Œ๋”๋ง ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค: UI ์š”์†Œ, React ์ปดํฌ๋„ŒํŠธ, ๋ผ์šฐํŠธ, CEL ๋ฐ”์ธ๋”ฉ, ๋ฒˆ์—ญ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

1. ๋„ค ๊ฐœ์˜ UI ์š”์†Œ ์ปดํฌ๋„ŒํŠธ ์ •์˜

๊ด€๋ฆฌ์ž์—์„œ Create new component๋ฅผ ๋„ค ๋ฒˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(Route Slug ์—†์Œ). ๊ฐ ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ํ•„๋“œ๋ฅผ Text๋กœ ์ถ”๊ฐ€ํ•˜๊ณ (๋ช…์‹œ๋œ ๊ฒฝ์šฐ ์ œ์™ธ), ์ƒํƒœ๋ฅผ Active๋กœ ์„ค์ •ํ•œ ๋’ค Settings โ†’ Tags์—์„œ UI Element ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

  • nav โ†’ brand
  • headline โ†’ title, subtitle
  • body โ†’ code, city, country, latitude(Number), longitude(Number)
  • footer โ†’ text

body.latitude์™€ body.longitude๋Š” ๊ณตํ•ญ ์ปดํฌ๋„ŒํŠธ์™€ ์ผ์น˜ํ•˜๋„๋ก ๋ฐ˜๋“œ์‹œ Number์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ UI ์š”์†Œ๋Š” ์ž์ฒด ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค โ€” ์—ฌ๊ธฐ์„œ๋Š” body๊ฐ€ Active๋กœ ์„ค์ •๋˜๊ณ  UI Element&#32;ํƒœ๊ทธ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  UI ์š”์†Œ๊ฐ€ airport&#32;์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

2. ํƒ€์ž… ๋‹ค์‹œ ์ƒ์„ฑ

bun run generate-schemas

3. React ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ๋ฐ ๋“ฑ๋ก

Claude์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์ฒญํ•˜์„ธ์š”:

components/์— nav, headline, body, footer๋ผ๋Š” ๋„ค ๊ฐœ์˜ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒ์„ฑ๋œ ํƒ€์ž… T๋ฅผ ์‚ฌ์šฉํ•˜๋Š” BlockComponentProps<T> ํƒ€์ž…์˜ ๋‹จ์ผ content prop์„ ๋ฐ›์•„ content์—์„œ ํ•„๋“œ๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„ค ์ปดํฌ๋„ŒํŠธ๋ฅผ catch-all ๋ผ์šฐํŠธ์˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์œผ๋กœ ๋“ฑ๋กํ•˜์„ธ์š”. ๋””์ž์ธ ์‹œ์Šคํ…œ์œผ๋กœ ์Šคํƒ€์ผ๋งํ•˜๋˜, ์šฐ๋ฆฌ๋งŒ์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์†Œ์Šค ์‚ฌ์ดํŠธ ๋ ˆ์ด์•„์›ƒ์„ ๋ณต์‚ฌํ•˜์ง€ ๋งˆ์„ธ์š”. Nav: ์™ผ์ชฝ์— ๋ธŒ๋žœ๋“œ. Headline: code ยท city, country ์„œ๋ธŒํƒ€์ดํ‹€์„ ๊ฐ€์ง„ ๊ณตํ•ญ ์ด๋ฆ„. Body: ์ฝ”๋“œ, ๋„์‹œ, ๊ตญ๊ฐ€, ์ขŒํ‘œ๊ฐ€ ํฌํ•จ๋œ ์ƒ์„ธ ํŒจ๋„. Footer: ๊ณ ์ •๋œ ํ•œ ์ค„ ํ…์ŠคํŠธ. ๋ ˆ์ด์•„์›ƒ๊ณผ ์Šคํƒ€์ผ๋ง๋งŒ ์ฒ˜๋ฆฌํ•˜์„ธ์š”.

Claude๋Š” ๋„ค ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  src/app/[...slug]/page.tsx์˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ฑ„์›๋‹ˆ๋‹ค:

const registry = { nav: Nav, headline: Headline, body: Body, footer: Footer };

๊ทœ์น™ ๋‘ ๊ฐ€์ง€: ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•„๋“œ๋ฅผ content์—์„œ ์ฝ์–ด์•ผ ํ•˜๋ฉฐ(๊ฐœ๋ณ„ prop ๊ธˆ์ง€), ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํ‚ค๋Š” CMS ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4. ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ผ์šฐํŠธ ์ƒ์„ฑ

๊ด€๋ฆฌ์ž์—์„œ Pages โ†’ Create page๋กœ ์ด๋™ํ•ด ํŒจํ„ด์„ /{airport_code}๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Dynamic Segment Mappings์—์„œ airport_code๋ฅผ airport ์ปดํฌ๋„ŒํŠธ์˜ slug ํ•„๋“œ code์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅํ•˜๋ฉด Page Builder๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. /JFK๊ฐ€ ํ•ด์„๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

5. UI ์š”์†Œ ์ถ”๊ฐ€, CEL ์—ฐ๊ฒฐ, ๊ฒŒ์‹œ

Custom ํƒญ์—์„œ UI ์š”์†Œ๋ฅผ ํŽ˜์ด์ง€์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

JFK ๋ฐ”์ธ๋”ฉ์˜ Page Builder์— ๋„ค ๊ฐœ์˜ UI ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

  1. JFK ๋ฐ”์ธ๋”ฉ์„ ์„ ํƒํ•˜๊ณ  Add UI Element โ†’ Custom ํƒญ โ†’ nav, headline, body, footer ์ˆœ์„œ๋กœ ์ถ”๊ฐ€ํ•˜์„ธ์š”. Profound๋Š” ์ด ๊ตฌ์„ฑ์„ ๋ชจ๋“  ๊ณตํ•ญ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ฐ ํ•„๋“œ๋ฅผ ์ฑ„์›๋‹ˆ๋‹ค. ์ •์  ๊ฐ’(nav ๋ธŒ๋žœ๋“œ, footer ํ…์ŠคํŠธ)์€ ์ง์ ‘ ์ž…๋ ฅํ•˜์„ธ์š”. ๋™์  ๊ฐ’์€ ๋™์ ์œผ๋กœ ์ „ํ™˜ํ•œ ๋’ค CEL์„ ์ž‘์„ฑํ•˜์„ธ์š”. ๊ณต์œ  ์กฐํšŒ๋Š” documents.get("airport", meta.params.airport_code)์ž…๋‹ˆ๋‹ค.

    ํ•„๋“œCEL ๊ฐ’
    headline.titledocuments.get("airport", meta.params.airport_code).name
    headline.subtitledocuments.get("airport", meta.params.airport_code).code + " ยท " + documents.get("airport", meta.params.airport_code).city + ", " + documents.get("airport", meta.params.airport_code).country
    body.code / body.city / body.countrydocuments.get("airport", meta.params.airport_code).<field>
    body.latitude / body.longitudedocuments.get("airport", meta.params.airport_code).latitude ๋ฐ .longitude
    nav.brand, footer.text์ •์  ๋ฌธ์ž์—ด
  3. ํŽ˜์ด์ง€๋ฅผ Publish(์šฐ์ธก ์ƒ๋‹จ)ํ•˜์„ธ์š”.

6. ์˜์–ด๋กœ ํ™•์ธ

localhost:3000/JFK๋ฅผ ์—ฐ ๋‹ค์Œ /SFO, /LAX๋„ ์—ด์–ด๋ณด์„ธ์š” โ€” ๋™์ผํ•œ ํ…œํ”Œ๋ฆฟ์— ๋‹ค๋ฅธ ๊ณตํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์™„์„ฑ๋œ ํŽ˜์ด์ง€๊ฐ€ JFK ๋ฐ์ดํ„ฐ๋ฅผ ์˜์–ด๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

7. ๊ตญ์ œํ™”

  1. ๋จผ์ € ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฒˆ์—ญํ•˜์„ธ์š”. ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ ์ปดํฌ๋„ŒํŠธ(ํ•„์ˆ˜๋กœ UI ์š”์†Œ์ผ ํ•„์š”๋Š” ์—†์Œ)๋ฅผ ์—ด๊ณ  Translate โ†’ Submit์„ ํด๋ฆญํ•˜์„ธ์š”. Profound๋Š” ํ•œ ๋ฒˆ์— 35๊ฐœ ์–ธ์–ด๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ๋ฒˆ์—ญํ•˜๋ฉฐ, ์ •์  ํ•„๋“œ ๊ฐ’๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ CEL์„ ๊ฑด๋“œ๋ฆฌ๊ธฐ ์ „์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

    Translate โ†’ Submit์€ ํ•œ ๋ฒˆ์— 35๊ฐœ ์–ธ์–ด๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

  2. ์–ธ์–ด ์ฐจ์›์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”. Pages์—์„œ ํŒจํ„ด์„ /{language}/{airport_code}๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. language์— ๋Œ€ํ•œ Dynamic Segment Mapping์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‚ด์žฅ language ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ์˜ slug ํ•„๋“œ๋ฅผ code๋กœ ์„ค์ •ํ•˜์„ธ์š”. ์ €์žฅ ํ›„ /en/JFK๊ฐ€ ํ•ด์„๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    {language}&#32;์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋ผ์šฐํŠธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

  3. ๋ชจ๋“  ๋ฒˆ์—ญ ๊ฐ€๋Šฅํ•œ ํ•„๋“œ๋ฅผ ๋ฒˆ์—ญ๋œ fetch๋กœ ์—ฐ๊ฒฐํ•˜์„ธ์š”. ํŽ˜์ด์ง€๋ฅผ ๊ตญ์ œํ™”ํ•˜๋ ค๋ฉด ์–ธ์–ด์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๋ชจ๋“  ํ•„๋“œ๋ฅผ documents.get(...)์—์„œ documents.translated("airport", meta.params.airport_code, meta.params.language)๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

    ํ•„๋“œ๋ฒˆ์—ญ๋œ CEL
    headline.titledocuments.translated("airport", meta.params.airport_code, meta.params.language).name
    headline.subtitledocuments.get("airport", meta.params.airport_code).code + " ยท " + documents.translated("airport", meta.params.airport_code, meta.params.language).city + ", " + documents.translated("airport", meta.params.airport_code, meta.params.language).country
    body.city / body.countrydocuments.translated("airport", meta.params.airport_code, meta.params.language).city ๋ฐ .country

    IATA code์™€ ์ขŒํ‘œ๋Š” ์–ธ์–ด์™€ ์ƒ๊ด€์—†์ด ๋™์ผํ•˜๋ฏ€๋กœ documents.get์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. nav.brand์™€ footer.text๋Š” ์ด๋ฏธ 1๋‹จ๊ณ„์—์„œ ๋ฒˆ์—ญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€๊ฐ€ ๋ชจ๋‘ ์™„๋ฃŒ๋˜๋ฉด /fr/SFO, /de/SFO ๋“ฑ ๋ชจ๋“  ์–ธ์–ด๊ฐ€ ์™„์ „ํžˆ ๋ฒˆ์—ญ๋˜์–ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํŒŒํŠธ 3 โ€” ํ”„๋กœ๋•์…˜

1. ๋ฐฐํฌ: GitHub, ๊ทธ๋ฆฌ๊ณ  Vercel

GitHub์— ํ‘ธ์‹œํ•˜์„ธ์š”:

git init
git add -A
git commit -m "Airport directory"
gh repo create airports --public --source=. --push

Vercel์— ๊ฐ€์ ธ์˜ค๊ธฐ: Add New โ†’ Project โ†’ airports ์ €์žฅ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š” โ€” PROFOUND_API_KEY, NEXT_PUBLIC_PROFOUND_WEBSITE_ID, NEXT_PUBLIC_CMS_API_URL, ํ•„์š”ํ•˜๋ฉด NEXT_PUBLIC_BUNNY_CDN_URL โ€” ๊ทธ๋‹ค์Œ Deploy๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. /en/JFK์™€ /fr/SFO๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”. ์ดํ›„ git push๋งˆ๋‹ค ์ž๋™ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

2. ๋ผ์ด๋ธŒ ํ”„๋ฆฌ๋ทฐ์™€ ํ˜„์žฅ ํŽธ์ง‘

๋‘ ๊ธฐ๋Šฅ ๋ชจ๋‘ ์Šค์บํด๋“œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ผ์ด๋ธŒ ํ”„๋ฆฌ๋ทฐ: layout.tsx์˜ <Refresher>๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ํŽธ์ง‘ ํ›„ ์ €์žฅํ•  ๋•Œ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ค‘์ธ ํŽ˜์ด์ง€๋ฅผ ์žฌ๋ฐฐํฌ ์—†์ด ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฅ ํŽธ์ง‘: ์–ด๋–ค URL์—๋“  ?edit_mode=true๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”(์˜ˆ: โ€ฆ/en/JFK?edit_mode=true). ๊ทธ๋Ÿฌ๋ฉด ํŽธ์ง‘ ์˜ค๋ฒ„๋ ˆ์ด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๋ฐฉ๋ฌธ์ž๋Š” ๊นจ๋—ํ•œ ํŽ˜์ด์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

?edit_mode=true๋Š” ๋ผ์ด๋ธŒ ํŽ˜์ด์ง€ ์œ„์— ํŽธ์ง‘๊ธฐ๋ฅผ ์˜ค๋ฒ„๋ ˆ์ดํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋นŒ๋“œ ๊ณผ์ •์ž…๋‹ˆ๋‹ค

50๊ฐœ์˜ ๊ณตํ•ญ, 35๊ฐœ ์–ธ์–ด, ์‹ค์‹œ๊ฐ„ โ€” ํ•œ ๋ฒˆ ์„ค๊ณ„ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์›Œ ๋„ฃ์Šต๋‹ˆ๋‹ค: ํ•˜๋‚˜์˜ ๋ผ์šฐํŠธ, ๋„ค ๊ฐœ์˜ React ์ปดํฌ๋„ŒํŠธ, ๋ช‡ ๊ฐœ์˜ CEL ๋ฐ”์ธ๋”ฉ. CMS๊ฐ€ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ , ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ์ด๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉฐ, CEL์ด ๋‘˜์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Continue Reading
NextDeploymentsโ€บ