CAKE20

AI Web PaaS

CAKE20.JS

ํ™”๋ฉด๋ถ€ํ„ฐ API, ๋ฐ์ดํ„ฐ์™€ ์‹คํ–‰๊นŒ์ง€ ํ•˜๋‚˜์˜ ๊ทœ์น™์œผ๋กœ

Cake20.JS๋Š” Cake20 View์˜ ํ™”๋ฉด ์ฒด๊ณ„์™€ Cake20 Runtime์˜ ๋นŒ๋“œยท์„œ๋ฒ„ยท์‹คํ–‰ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์€ ๊ณต์‹ ์›น์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ ์ฒด๊ณ„์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ์„ค์ •๋ณด๋‹ค ์›น์‚ฌ์ดํŠธ์˜ ํ™”๋ฉด๊ณผ ๊ธฐ๋Šฅ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript ํ™”๋ฉด ํŒŒ์ผ ๊ธฐ๋ฐ˜ API ํ†ตํ•ฉ Runtime
js.cake20.com์—์„œ ์‹œ์ž‘ํ•˜๊ธฐ

WORKING EXAMPLE

์„ธ ํŒŒ์ผ๋กœ ์™„์„ฑํ•˜๋Š” ์ž‘์€ ๋ฉ”๋ชจ ํ™”๋ฉด

๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์„ ์–ธํ•˜๋ฉด DB Client๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ , API ํŒŒ์ผ ์ด๋ฆ„์ด ์ฃผ์†Œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์—์„œ๋Š” ๋‚ด์žฅ fetch ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๋ฐ”๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

01 ยท VIEW

ํ™”๋ฉด

app/pages/index.tsx
type Memo = { title: string };

export const data = {
  memos: [] as Memo[]
};

export const onServer = async () => {
  data.memos = await fetchGet<Memo[]>("/api/memos");
};

export default () => (
  <main class="mx-auto max-w-xl space-y-3">
    <h1>Memos</h1>
    {data.memos.map((memo) => (
      <Card key={memo.title}>{memo.title}</Card>
    ))}
  </main>
);

02 ยท API

๋ฐ์ดํ„ฐ ์กฐํšŒ

server/api/memos.get.ts
export default async () =>
  db.memo.findMany({
    select: { title: true },
    orderBy: { createdAt: "desc" }
  });

03 ยท DATABASE

๋ฐ์ดํ„ฐ ๋ชจ๋ธ

server/db/memo.db.ts
export const Memo = {
  id: z.id(),
  title: z.string().min(1).max(80),
  createdAt: z.date().defaultNow().timestamp()
};
server/dbserver/apiapp/pages๋ชจ๋ธ๋ถ€ํ„ฐ API์™€ ํ™”๋ฉด๊นŒ์ง€ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

HOW IT WORKS

ํ™”๋ฉด๊ณผ ์‹คํ–‰ํ™˜๊ฒฝ์„ ๋”ฐ๋กœ ์กฐ๋ฆฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

ํ™”๋ฉด์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ๊ทœ์น™ ์•ˆ์—์„œ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ฑ…์ž„์€ ๋ถ„๋ฆฌํ•˜๋ฉด์„œ๋„ ์„ค์ •๊ณผ ์‹คํ–‰ ํ๋ฆ„์€ Cake20.JS๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

CAKE20 VIEW

ํ™”๋ฉด๊ณผ ์ƒํƒœ

TypeScript ์กฐ๊ฑด์‹, ๋ฐฐ์—ด, ์ด๋ฒคํŠธ์™€ bind๋กœ ํ™”๋ฉด ๋™์ž‘์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€, ๋ ˆ์ด์•„์›ƒ๊ณผ ์ปดํฌ๋„ŒํŠธ๋Š” ์—ญํ• ์— ๋”ฐ๋ผ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

CAKE20 RUNTIME

๋นŒ๋“œ์™€ ์„œ๋ฒ„ ์‹คํ–‰

ํ™”๋ฉด ๋นŒ๋“œ, API, ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ๊ณผ ์„œ๋ฒ„ ์‹คํ–‰์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. Preview์—์„œ ํ™•์ธํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๊ฒ€์ˆ˜ํ•˜๊ณ  ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CONVENTIONS

ํŒŒ์ผ ์œ„์น˜๊ฐ€ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค

Cake20.JS์˜ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๊ทœ์น™์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ ์—ด์–ด๋„ ํ™”๋ฉด, API์™€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

app/pages

ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ์›นํŽ˜์ด์ง€ URL์ด ๋ฉ๋‹ˆ๋‹ค.

server/api

ํŒŒ์ผ ์ด๋ฆ„์ด HTTP method์™€ URL์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

server/db

*.db.ts ๋ชจ๋ธ๋กœ ์›น์‚ฌ์ดํŠธ DB Client๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ONE PROJECT

๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹œ์ž‘ํ•˜๊ณ  ๋กœ์ปฌ์—์„œ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค

js.cake20.com์—์„œ ๊ฐœ๋…๊ณผ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณธ ๋’ค ๊ฐ™์€ Cake20.JS ํ”„๋กœ์ ํŠธ๋ฅผ Cake CLI๋กœ ์‹คํ–‰ํ•˜๊ณ  VS Code์—์„œ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ๊ฐ€ ๋‹ฌ๋ผ์ ธ๋„ ์†Œ์Šค ๊ตฌ์กฐ์™€ Runtime ๊ทœ์น™์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

Cake20.JS๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹œ์ž‘
Cake CLI๋กœ์ปฌ ์‹คํ–‰๊ณผ ๊ด€๋ฆฌ
VS Code์†Œ์Šค ํŽธ์ง‘๊ณผ Git