Vercel + Next.js + Supabase + Claude API 스택: CMS 불필요
헤드리스 CMS 없이 Next.js, Supabase, Claude로 풀스택 앱 만들기
나는 수년간 헤드리스 CMS 플랫폼으로 웹사이트를 구축해왔다. Contentful, Sanity, Strapi -- 이름을 대면 통합해봤다. 그런데 2025년 말쯤, 패턴을 발견하기 시작했다: 점점 더 많은 프로젝트에서 나는 CMS에 손을 대지 않았다. 대신 Vercel의 Next.js, 데이터와 인증을 위한 Supabase, 필요한 콘텐츠 인텔리전스를 위한 Claude API로 풀스택 앱을 배포했다. CMS 벤더도 없었다. 콘텐츠 모델링 UI도 없었다. 월간 시트 라이선스도 없었다.
이것은 반항심 때문이 아니다. 헤드리스 CMS가 올바른 선택인 프로젝트가 절대 많다 -- Social Animal에서도 많은 것을 구축한다(헤드리스 CMS 개발 작업 확인). 하지만 이 벤더 프리 스택이 생존할 뿐만 아니라 더 나은 특정 애플리케이션 클래스가 있다. 정확히 어떻게 작동하는지, 언제 사용하는지, 처음부터 설정하는 방법을 안내하겠다.
목차
- 개발자가 CMS를 버리는 이유
- 스택 개요
- Vercel에서 Next.js 프로젝트 설정
- 백엔드로서의 Supabase: 인증, 데이터베이스, 스토리지
- 콘텐츠 인텔리전스를 위한 Claude API 통합
- 커스텀 관리 인터페이스 구축
- 실제 비용: 이 스택이 실제로 얼마나 드는지
- 여전히 CMS를 사용해야 하는 경우
- 프로덕션 배포 체크리스트
- FAQ
개발자가 CMS를 버리는 이유
CMS가 제공하는 것을 솔직하게 말해보자: 비기술적 사람들이 콘텐츠를 편집할 수 있는 UI, 구조화된 데이터 레이어, 아마도 미디어 관리, 그리고 모든 것을 가져올 API. 마케팅 팀이 매일 블로그 게시물을 게시할 때 이것은 진정으로 가치 있다.
하지만 2026년에 나는 계속 보는 것이 있다:
- SaaS 제품 -- "콘텐츠"가 편집 카피가 아닌 사용자 생성 데이터인 곳
- 내부 도구 -- 팀이 데이터베이스를 직접 편집하거나 가벼운 관리 패널을 사용할 기술력이 충분한 곳
- AI 네이티브 애플리케이션 -- 콘텐츠가 즉석에서 생성, 요약, 변환되는 곳
- 스타트업 -- 3명의 사용자만 있을 때 CMS에 월 $300-500를 정당화할 수 없는 곳
이러한 프로젝트의 경우 CMS는 오버헤드다. 사용하지 않을 콘텐츠 모델링 기능에 돈을 내고, 기본적으로 화려한 데이터베이스 래퍼인 서비스의 API 키를 관리하고, 동기화 상태를 유지하기 위해 웹훅 복잡성을 처리한다.
대안은 무엇인가? 데이터 레이어를 완전히 소유하자. Supabase는 Postgres (독점 콘텐츠 저장소가 아닌 실제 데이터베이스), 인증, 파일 스토리지, 그리고 실시간 구독을 제공한다. Claude는 인텔리전스 레이어를 처리한다. Next.js와 Vercel이 나머지를 모두 처리한다.
스택 개요
| 레이어 | 기술 | 역할 | 2026년 가격 (시작) |
|---|---|---|---|
| 프론트엔드 & API | Next.js 15 (App Router) | UI, 서버 컴포넌트, 라우트 핸들러 | 무료 (오픈소스) |
| 호스팅 & 에지 | Vercel | 배포, CDN, 서버리스 함수 | 무료 티어 / $20/월 Pro |
| 데이터베이스 & 인증 | Supabase | Postgres, Row Level Security, 인증, 스토리지 | 무료 티어 / $25/월 Pro |
| AI 레이어 | Claude API (Anthropic) | 콘텐츠 생성, 요약, 분류 | 토큰 기반 결제 (Sonnet 4의 경우 1M 토큰당 약 $3/$15) |
| 관리 UI | 커스텀 (React + Supabase) | 팀을 위한 콘텐츠 관리 | $0 (직접 구축) |
중간 정도의 트래픽이 있는 프로덕션 앱의 총 비용: $45-100/월. CMS 단독으로만 $99-500/월이 들 수 있는 일반적인 헤드리스 CMS 설정과 비교해보자. 호스팅은 아직 내지 않은 상태다.
Vercel에서 Next.js 프로젝트 설정
Node.js 20+과 Vercel 계정이 있다고 가정한다. Next.js가 처음이라면, 팀이 Next.js 개발 기능 페이지에서 광범위하게 작성했다.
npx create-next-app@latest my-app --typescript --tailwind --app --src-dir
cd my-app
App Router를 사용한 Next.js 15가 기초다. 기본적으로 서버 컴포넌트를 사용한다. 즉, 대부분의 데이터 가져오기가 서버에서 발생한다 -- 노출된 API 키 없음, 초기 콘텐츠에 대한 클라이언트 측 로딩 스피너 없음.
이 스택에서 나의 일반적인 프로젝트 구조다:
src/
├── app/
│ ├── (public)/ # 마케팅 페이지, 블로그
│ ├── (dashboard)/ # 인증된 관리 영역
│ │ ├── layout.tsx # 인증 확인 래퍼
│ │ ├── posts/
│ │ ├── media/
│ │ └── settings/
│ ├── api/
│ │ ├── ai/ # Claude API 라우트
│ │ └── webhooks/ # Supabase 실시간 훅
│ └── layout.tsx
├── lib/
│ ├── supabase/
│ │ ├── client.ts # 브라우저 클라이언트
│ │ ├── server.ts # 서버 클라이언트
│ │ └── admin.ts # 서비스 역할 클라이언트
│ ├── claude.ts # Anthropic SDK 래퍼
│ └── utils.ts
├── components/
└── types/
환경 변수
.env.local에 이것들이 필요하다:
NEXT_PUBLIC_SUPABASE_URL=your-project-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-key
ANTHROPIC_API_KEY=sk-ant-...
Vercel에 배포
GitHub로 푸시한다. Vercel에서 저장소를 연결한다. 환경 변수를 추가한다. 완료. 이것을 자세히 설명할 필요는 없다 -- Next.js에 대한 Vercel의 DX는 업계 최고이고 아마도 이미 작동 방식을 알 것이다.
언급할 가치가 있는 한 가지: 재배포 없이 업데이트되는 기능 플래그나 구성이 필요한 경우 Vercel의 Edge Config를 사용하자. 작은 것이지만 또 다른 SaaS 도구를 대체한다.
백엔드로서의 Supabase: 인증, 데이터베이스, 스토리지
여기서 마법이 일어난다. Supabase는 단지 "Firebase이지만 Postgres가 아니다" -- 당신이 실제로 소유하는 완전한 백엔드 플랫폼이다. 당신의 데이터는 표준 PostgreSQL 데이터베이스에 있다. 떠나고 싶으면 pg_dump를 하고 떠난다. 독점 CMS로 이것을 해보자.
데이터베이스 스키마
콘텐츠 기반 앱을 구축한다고 하자 (평소에 CMS를 찾을 종류의 것). 기사, 미디어, 기본 분류를 처리하는 스키마다:
-- UUID 생성 활성화
create extension if not exists "uuid-ossp";
-- 콘텐츠 테이블 (CMS 콘텐츠 모델 대체)
create table public.posts (
id uuid default uuid_generate_v4() primary key,
title text not null,
slug text unique not null,
body text, -- 마크다운 콘텐츠
excerpt text,
status text default 'draft' check (status in ('draft', 'published', 'archived')),
author_id uuid references auth.users(id),
featured_image text, -- Supabase Storage 경로
metadata jsonb default '{}', -- 유연한 필드, 마이그레이션 필요 없음
published_at timestamptz,
created_at timestamptz default now(),
updated_at timestamptz default now()
);
-- 태그 / 분류
create table public.tags (
id uuid default uuid_generate_v4() primary key,
name text unique not null,
slug text unique not null
);
create table public.post_tags (
post_id uuid references public.posts(id) on delete cascade,
tag_id uuid references public.tags(id) on delete cascade,
primary key (post_id, tag_id)
);
-- Row Level Security
alter table public.posts enable row level security;
-- 누구나 게시된 게시물을 읽을 수 있음
create policy "Public can read published posts"
on public.posts for select
using (status = 'published');
-- 인증된 사용자는 자신의 게시물을 관리할 수 있음
create policy "Authors can manage own posts"
on public.posts for all
using (auth.uid() = author_id);
그 metadata jsonb 칼럼이 핵심이다. CMS의 커스텀 필드가 필요할 때마다 마이그레이션을 실행할 필요 없이 CMS의 커스텀 필드 유연성을 제공한다. SEO 설명이 필요한가? metadata->>'seo_description'. Open Graph 이미지 오버라이드가 필요한가? metadata->>'og_image'. 유연성이 필요한 곳에서는 스키마가 없고 무결성이 필요한 곳에서는 구조화되어 있다.
인증 설정
Supabase Auth는 모든 것을 처리한다. 이메일/비밀번호, 매직 링크, Google/GitHub과의 OAuth -- 모두 기본 제공된다.
// lib/supabase/server.ts
import { createServerClient } from '@supabase/ssr'
import { cookies } from 'next/headers'
export async function createClient() {
const cookieStore = await cookies()
return createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll() {
return cookieStore.getAll()
},
setAll(cookiesToSet) {
cookiesToSet.forEach(({ name, value, options }) =>
cookieStore.set(name, value, options)
)
},
},
}
)
}
파일 스토리지
Supabase Storage는 CMS가 가진 미디어 라이브러리를 대체한다. media라는 이름의 버킷을 만들고, 정책을 설정하면, 자동 CDN URL이 있는 S3 호환 파일 저장소를 얻었다.
// 파일 업로드
const { data, error } = await supabase.storage
.from('media')
.upload(`posts/${slug}/${file.name}`, file, {
cacheControl: '3600',
upsert: false,
})
// 공개 URL 가져오기
const { data: { publicUrl } } = supabase.storage
.from('media')
.getPublicUrl(`posts/${slug}/${file.name}`)
콘텐츠 인텔리전스를 위한 Claude API 통합
여기서 2026년 스택이 기존 웹 개발과 가장 많이 다른다. Claude API는 단지 챗봇이 아니다 -- CMS 플러그인과 제3자 서비스의 전체 범주를 대체할 수 있는 인텔리전스 레이어다.
프로덕션에서 사용하는 것은 다음과 같다:
- SEO 메타데이터 자동 생성 -- 게시 콘텐츠에서
- 콘텐츠 요약 -- 발췌문과 소셜 카드
- 콘텐츠 분류 및 자동 태깅
- 스마트 검색 -- 키워드가 아닌 의도를 이해하는 것
- 드래프트 지원 -- 콘텐츠 작성자용
Anthropic SDK 설정
npm install @anthropic-ai/sdk
// lib/claude.ts
import Anthropic from '@anthropic-ai/sdk'
const anthropic = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY!,
})
export async function generateSEOMetadata(content: string, title: string) {
const message = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
messages: [
{
role: 'user',
content: `Given this article title and content, generate SEO metadata.
Title: ${title}
Content: ${content.slice(0, 3000)}
Respond with JSON only:
{
"seo_title": "50-60 char title with primary keyword",
"seo_description": "120-160 char meta description",
"excerpt": "1-2 sentence hook for social sharing",
"suggested_tags": ["tag1", "tag2", "tag3"]
}`,
},
],
})
const text = message.content[0].type === 'text' ? message.content[0].text : ''
return JSON.parse(text)
}
export async function classifyContent(content: string, existingTags: string[]) {
const message = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 256,
messages: [
{
role: 'user',
content: `Classify this content into the most relevant tags from the existing list. You may suggest up to 2 new tags if nothing fits.
Existing tags: ${existingTags.join(', ')}
Content: ${content.slice(0, 2000)}
Respond with JSON: { "tags": ["tag1", "tag2"], "new_tags": ["maybe-new"] }`,
},
],
})
const text = message.content[0].type === 'text' ? message.content[0].text : ''
return JSON.parse(text)
}
AI 기능을 위한 API 라우트
// app/api/ai/seo/route.ts
import { NextRequest, NextResponse } from 'next/server'
import { createClient } from '@/lib/supabase/server'
import { generateSEOMetadata } from '@/lib/claude'
export async function POST(request: NextRequest) {
const supabase = await createClient()
const { data: { user } } = await supabase.auth.getUser()
if (!user) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}
const { content, title } = await request.json()
try {
const metadata = await generateSEOMetadata(content, title)
return NextResponse.json(metadata)
} catch (error) {
return NextResponse.json(
{ error: 'AI generation failed' },
{ status: 500 }
)
}
}
비용은 여기서 무시할 만하다. 일반적인 SEO 메타데이터 생성 호출은 약 4,000개의 입력 토큰과 200개의 출력 토큰을 사용한다. Claude Sonnet 4의 가격이 약 1M 입력 토큰당 $3이고 1M 출력 토큰당 $15인 것을 감안하면, 이는 호출당 약 $0.015다. 1,000개 기사에 대한 메타데이터를 $15로 생성할 수 있다.
커스텀 관리 인터페이스 구축
이것은 사람들이 신경 쓰는 부분이다. "CMS가 없으면 비기술적 사람들은 어떻게 콘텐츠를 편집하지?"
간단한 관리 UI를 만든다. 2026년에 "간단함"은 실제로 간단하다. 기본적인 게시 편집기 컴포넌트다:
// app/(dashboard)/posts/[id]/editor.tsx
'use client'
import { useState } from 'react'
import { createBrowserClient } from '@supabase/ssr'
export function PostEditor({ post }: { post: Post }) {
const [title, setTitle] = useState(post.title)
const [body, setBody] = useState(post.body || '')
const [saving, setSaving] = useState(false)
const supabase = createBrowserClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
)
async function save() {
setSaving(true)
const { error } = await supabase
.from('posts')
.update({
title,
body,
updated_at: new Date().toISOString(),
})
.eq('id', post.id)
setSaving(false)
if (error) alert('Save failed: ' + error.message)
}
async function generateSEO() {
const res = await fetch('/api/ai/seo', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title, content: body }),
})
const metadata = await res.json()
// 생성된 메타데이터를 게시물에 적용
await supabase
.from('posts')
.update({ metadata, excerpt: metadata.excerpt })
.eq('id', post.id)
}
return (
<div className="max-w-4xl mx-auto p-6">
<input
type="text"
value={title}
onChange={(e) => setTitle(e.target.value)}
className="text-3xl font-bold w-full mb-4 border-b pb-2"
/>
<textarea
value={body}
onChange={(e) => setBody(e.target.value)}
className="w-full h-96 font-mono text-sm p-4 border rounded"
/>
<div className="flex gap-4 mt-4">
<button onClick={save} disabled={saving}
className="px-4 py-2 bg-blue-600 text-white rounded">
{saving ? 'Saving...' : 'Save Draft'}
</button>
<button onClick={generateSEO}
className="px-4 py-2 bg-purple-600 text-white rounded">
✨ Generate SEO Metadata
</button>
</div>
</div>
)
}
네, 이것은 간단한 텍스트영역이다. 실제 프로젝트에서는 Tiptap, MDXEditor 또는 BlockNote와 같은 것으로 바꾸어 풍부한 편집을 제공한다. 포인트는: 관리 인터페이스는 당신의 코드다. 모든 픽셀, 모든 워크플로, 모든 권한을 제어한다. CMS UI 제한으로 싸울 필요가 없다.
더 복잡한 프로젝트의 경우, Refine 또는 AdminJS를 Supabase에 직접 연결되는 관리 패널 프레임워크로 고려하자. 수주를 절약할 것이다.
실제 비용: 이 스택이 실제로 얼마나 드는지
월 100K 페이지뷰를 하는 콘텐츠 헤비 사이트에 대한 구체적인 숫자다:
| 서비스 | 티어 | 월 비용 | 제공되는 것 |
|---|---|---|---|
| Vercel | Pro | $20 | 1TB 대역폭, 1000 GB-시간 서버리스 |
| Supabase | Pro | $25 | 8GB 데이터베이스, 250GB 대역폭, 100K 인증 사용자 |
| Claude API | 종량제 | ~$10-30 | ~500만 토큰/월 (SEO 생성, 요약, 검색) |
| 도메인 | 연간 | ~$1 | .com 도메인 |
| 합계 | $56-76/월 |
이제 이것을 일반적인 헤드리스 CMS 스택과 비교해보자:
| 서비스 | 티어 | 월 비용 |
|---|---|---|
| Contentful | Team | $300 |
| Vercel | Pro | $20 |
| Algolia (검색) | Build | $50 |
| Auth0 (인증) | Essentials | $35 |
| 합계 | $405/월 |
이것은 5-6배 비용 차이다. 그리고 Supabase 스택은 덜 유연성을 제공하지 않는다.
여전히 CMS를 사용해야 하는 경우
이것에 대해 명확하게 눈을 떠야 한다. 모든 프로젝트에서 CMS를 버리지 마라. 헤드리스 CMS는 여전히 다음과 같을 때 더 나은 선택이다:
- 대규모 편집 팀 -- 구조화된 워크플로 필요 (승인 체인, 스케줄링, 기본 RBAC를 넘어서는 역할)
- 콘텐츠가 제품 -- 출판사, 미디어 회사, 수백 명의 기여자가 있는 설명서 사이트
- 시각적 편집이 필요 -- 일부 CMS 플랫폼은 복제하는데 수개월이 걸릴 라이브 미리보기와 시각적 빌더를 제공
- 다중 채널 배포 -- 동일한 콘텐츠가 웹사이트, 모바일 앱, 디지털 사이니지, 이메일을 제공하면, CMS의 구조화된 콘텐츠 모델은 그 가치를 증명
- 대규모 지역화 -- Contentful과 Sanity와 같은 CMS 플랫폼은 성숙한 i18n 워크플로를 가짐
Social Animal에서는 여전히 많은 헤드리스 CMS 프로젝트를 구축한다. 당신의 프로젝트가 그것이 필요하면, 우리와 얘기해보자. 그러나 그것이 필요하지 않은 점점 증가하는 애플리케이션 카테고리에서, 그것을 위해 돈을 내는 것을 중단하자.
프로덕션 배포 체크리스트
이 스택을 프로덕션에 배포하기 전에 이 목록을 실행하자:
- Row Level Security 정책 -- 모든 테이블에 대해 테스트 (Supabase의 정책 시뮬레이터 도움)
- 레이트 제한 -- Claude API 라우트 (Vercel의
@vercel/edge레이트 리미터 또는 upstash/ratelimit 사용) - 입력 검증 -- 모든 API 라우트 (Zod는 당신의 친구)
- 에러 경계 -- Claude 실패를 위한 React 트리 (Claude는 때때로 시간 초과)
- 캐싱 전략 -- 데이터베이스 지원 페이지에 대해
unstable_cache또는revalidateTag사용 - 모니터링 -- 성능을 위한 Vercel Analytics, 데이터베이스 메트릭을 위한 Supabase Dashboard, API 사용을 위한 Anthropic Console
- 백업 전략 -- Supabase Pro는 일일 백업을 포함하지만, S3의 논리적 복제 또는
pg_dumpcron도 설정 - Content Security Policy 헤더 --
next.config.js에서 구성 - 이미지 최적화 -- Supabase Storage URL로 Next.js
<Image>컴포넌트 사용
FAQ
Supabase가 정말 헤드리스 CMS를 대체할 수 있나?
많은 사용 사례에서 그렇다. Supabase는 스키마에서 자동 생성된 REST 및 GraphQL API가 있는 PostgreSQL 데이터베이스, 파일 스토리지, 인증, 그리고 실시간 구독을 제공한다. 이것이 제공하지 않는 것은 기본 제공되는 광택 콘텐츠 편집 UI -- 직접 구축하거나 Refine과 같은 도구를 사용해야 한다. 팀이 기술적이거나 작으면, 이 트레이드오프는 절대 가치가 있다.
일반적인 웹사이트에서 Claude API 비용은 얼마나 드나?
SEO 메타데이터 생성, 콘텐츠 요약, 기본 분류에 Claude를 사용하는 콘텐츠 사이트의 경우, 중간 정도의 사용 (몇 백 개의 AI 작업)으로 월 $10-30을 지출하길 예상하자. 2026년의 Claude Sonnet 4 가격은 1M 입력 토큰당 약 $3, 1M 출력 토큰당 $15다. 단일 SEO 메타데이터 생성 호출은 약 $0.01-0.02를 소비한다.
이 스택은 엔터프라이즈 애플리케이션에 적합한가?
엔터프라이즈의 정의에 따라 다르다. Vercel과 Supabase 모두 SLA, SOC 2 준수, 전담 지원이 있는 엔터프라이즈 티어를 제공한다. 스택은 높은 트래픽을 잘 처리한다 -- Vercel의 Next.js는 자동으로 확장되고, Supabase Pro는 연결 풀링과 읽기 복제본을 지원한다. 규정 준수가 많은 산업의 경우, 데이터를 자신의 인프라에 보관하기 위해 Supabase의 자체 호스팅 옵션이 필요하다.
CMS 없이 콘텐츠 미리보기와 드래프트 워크플로는 어떻게 하나?
직접 구축한다. Next.js Draft Mode를 status 칼럼과 게시물 테이블에 결합하면 드래프트/게시 워크플로를 제공한다. 미리보기의 경우, 상태와 관계없이 게시물을 가져오는 인증된 라우트를 만든다. CMS 대시보드에서 미리보기 URL을 구성하는 것보다 약 50줄 코드가 다하다.
CMS 없이 리치 텍스트 편집은 어떻게 하나?
모던 리치 텍스트 편집기 라이브러리를 사용하자. Tiptap (ProseMirror에 기반)은 2026년에서 가장 인기 있는 선택 -- 협력 편집, 커스텀 블록, 슬래시 명령, 마크다운 바로 가기를 지원한다. BlockNote는 Notion 같은 UI가 있는 또 다른 견고한 옵션이다. 출력을 HTML, 마크다운, 또는 JSON으로 Supabase body 칼럼에 저장하자.
헤드리스 CMS에서 이 스택으로 마이그레이션할 수 있나?
절대. 대부분의 헤드리스 CMS 플랫폼은 내보내기 API를 가진다. CMS API에서 콘텐츠를 가져와 Supabase 테이블에 삽입하는 마이그레이션 스크립트를 작성하자. 우리는 Contentful과 Sanity에서 Supabase 지원 설정으로의 마이그레이션을 몇 개 클라이언트에서 했다. 가장 어려운 부분은 보통 CMS의 독점 리치 텍스트 형식을 표준 HTML 또는 마크다운으로 매핑하는 것이다.
Supabase가 다운되면 어떻게 되나?
Supabase는 2025-2026년에 견고한 가동 시간을 가졌지만, 서비스는 완벽하지 않다. 데이터가 표준 PostgreSQL에 있기 때문에, 옵션이 있다: 읽기 복제본을 설정하거나, S3에서 자동화된 백업을 유지하거나, 대기 인스턴스를 실행하자. Supabase의 자체 호스팅 티어에서, 인프라를 완전히 제어한다. 이것은 실제로 CMS 벤더에 의존하는 것보다 더 회복력이 있다 -- Contentful이 중단되면, 단순히 "다른 Contentful로 전환할 수 없다".
블로그나 마케팅 사이트에 이 스택을 사용해야 하나?
개발자의 개인 블로그나 스타트업의 마케팅 사이트의 경우, 이 스택은 완벽하다. 완전한 제어, 최소 비용, CMS에서 비싼 플러그인이 필요할 수 있는 AI 기반 기능을 얻는다. 주당 20개 이상의 기사를 게시하는 복잡한 승인 워크플로를 가진 대규모 마케팅 팀의 경우, 당신은 아마도 올바른 CMS를 원할 것이다. 그것은 도구를 팀과 일치시키는 것에 관한 것이다. 프로젝트에 어느 접근 방식이 맞는지 확실하지 않으면, 가격 페이지를 확인하거나 빠른 상담을 위해 연락해보자.