• Headless๋ž€ ์›๋ž˜ GUI(๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค)๊ฐ€ ์žˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ GUI ์—†์ด ์‹คํ–‰ํ•˜๋Š” ๋ชจ๋“œ
  • ๋„คํŠธ์›Œํฌ, ์ปค๋งจ๋“œ๋ผ์ธ, API ๋“ฑ ๋Œ€์•ˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ž…์ถœ๋ ฅํ•˜๋Š” GUI-less ์‹คํ–‰ ๋ฐฉ์‹
  • โ€œHeadโ€๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ํ™”๋ฉด/๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์˜๋ฏธํ•˜๊ณ , ๊ทธ๊ฒƒ์ด ์—†๋‹ค(โ€œ-lessโ€)๋Š” ๋œป

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

  • Hyperframes๋Š” Headless Chrome์„ ์‚ฌ์šฉํ•˜์—ฌ HTML์„ ํ”„๋ ˆ์ž„ ๋‹จ์œ„๋กœ ์บก์ฒ˜ํ•œ๋‹ค
  • ๋น„๋””์˜ค ๋ Œ๋”๋ง์— Chrome ํ™”๋ฉด์„ ์‹ค์ œ๋กœ ๋„์šธ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ, Headless ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•œ๋‹ค
  • Headless ๊ฐœ๋…์€ ๋ธŒ๋ผ์šฐ์ € ์™ธ์—๋„ CMS, ๊ฒŒ์ž„ ์„œ๋ฒ„, ์„œ๋ฒ„ ๋จธ์‹  ๋“ฑ ๋‹ค์–‘ํ•œ ์˜์—ญ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค

AS-IS โ€” GUI ๊ธฐ๋ฐ˜ ์†Œํ”„ํŠธ์›จ์–ด

sequenceDiagram
    autonumber
    participant User as ์‚ฌ์šฉ์ž
    participant GUI as GUI ํ™”๋ฉด
    participant Core as ํ•ต์‹ฌ ๋กœ์ง

    User->>GUI: ๋งˆ์šฐ์Šค ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ
    GUI->>Core: ์‚ฌ์šฉ์ž ์š”์ฒญ ์ „๋‹ฌ
    Core->>GUI: ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    GUI->>User: ํ™”๋ฉด์— ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œ
    Note over User,Core: GUI๊ฐ€ ์‚ฌ์šฉ์ž์™€ ํ•ต์‹ฌ ๋กœ์ง ์‚ฌ์ด์˜ ๋‹ค๋ฆฌ ์—ญํ• 

TO-BE โ€” Headless ์‹คํ–‰

sequenceDiagram
    autonumber
    participant Code as ์ฝ”๋“œ / ์Šคํฌ๋ฆฝํŠธ
    participant Core as ํ•ต์‹ฌ ๋กœ์ง

    Code->>Core: API / Protocol๋กœ ์ง์ ‘ ๋ช…๋ น
    Core->>Code: ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ (๋ฐ์ดํ„ฐ)
    Note over Code,Core: GUI ์—†์ด ์ฝ”๋“œ๊ฐ€ ์ง์ ‘ ํ•ต์‹ฌ ๋กœ์ง์„ ์ œ์–ด

๋Œ€ํ‘œ์  ์‚ฌ๋ก€

์†Œํ”„ํŠธ์›จ์–ดHeadful (์ผ๋ฐ˜ ๋ชจ๋“œ)Headless ๋ชจ๋“œ
Chrome ๋ธŒ๋ผ์šฐ์ €์ฐฝ์ด ๋œจ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญยทํƒ€์ดํ•‘์ฐฝ ์—†์ด ์ฝ”๋“œ(Puppeteer)๋กœ๋งŒ ์ œ์–ด
๊ฒŒ์ž„ ์„œ๋ฒ„ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง์„œ๋ฒ„๋Š” ๊ฒŒ์ž„ ๋กœ์ง๋งŒ ์‹คํ–‰, ํ™”๋ฉด ์—†์Œ
CMS๊ด€๋ฆฌ UI + ํ”„๋ก ํŠธ์—”๋“œ ํฌํ•จ (WordPress)API๋งŒ ์ œ๊ณต, ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ณ„๋„ ๊ตฌ์ถ• (Contentful)
์„œ๋ฒ„ ๋จธ์‹ ๋ชจ๋‹ˆํ„ฐยทํ‚ค๋ณด๋“œ ์—ฐ๊ฒฐ์›๊ฒฉ SSH๋กœ๋งŒ ์ ‘์† (ํ™”๋ฉด ์—†์Œ)

Headless โ‰  CLI

git, ffmpeg ๊ฐ™์€ CLI ๋„๊ตฌ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ GUI ์—†์ด ์„ค๊ณ„๋œ ๊ฒƒ์ด์ง€, GUI๋ฅผ โ€œ์ œ๊ฑฐํ•œโ€ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋“ค์„ โ€œheadlessโ€๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š๋Š”๋‹ค.

  • Headless: โ€œ์›๋ž˜ ๋จธ๋ฆฌ(GUI)๊ฐ€ ์žˆ๋Š”๋ฐ, ๋–ผ์–ด๋‚ธ ๊ฒƒโ€
  • CLI: โ€œ์ฒ˜์Œ๋ถ€ํ„ฐ ๋จธ๋ฆฌ(GUI) ์—†์ด ๋งŒ๋“  ๊ฒƒโ€

Headless CMS โ€” ์›น ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ์˜ ์‚ฌ๋ก€

CMS(Content Management System)๋ž€

CMS๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์‚ฌ๋žŒ(๋งˆ์ผ€ํ„ฐ, ์—๋””ํ„ฐ, ์šด์˜์ž)์ด ์ฝ”๋“œ๋ฅผ ๋ชฐ๋ผ๋„ ์›น ์ฝ˜ํ…์ธ ๋ฅผ ๋งŒ๋“ค๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ์ด๋‹ค. โ€œContent Management Systemโ€์˜ ์•ฝ์ž๋กœ, ์ฝ˜ํ…์ธ (๊ธ€, ์ด๋ฏธ์ง€, ์ƒํ’ˆ ์ •๋ณด ๋“ฑ)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๋œปํ•œ๋‹ค.

  • CMS ์—†์ด: ๊ฐœ๋ฐœ์ž๊ฐ€ HTML์„ ์ง์ ‘ ์ˆ˜์ • โ†’ ์„œ๋ฒ„์— ๋ฐฐํฌ โ†’ ๋งค๋ฒˆ ๊ฐœ๋ฐœ์ž ํ•„์š”
  • CMS ์žˆ์œผ๋ฉด: ์šด์˜์ž๊ฐ€ ๊ด€๋ฆฌ ํ™”๋ฉด์—์„œ ๊ธ€ ์ž‘์„ฑ โ†’ โ€œ๊ฒŒ์‹œโ€ ๋ฒ„ํŠผ โ†’ ๋. ๊ฐœ๋ฐœ์ž ๋ถˆํ•„์š”

์ „ํ†ต์  CMS(WordPress)๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€

WordPress๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, ๋ธ”๋กœ๊ทธ ๊ธ€ ํ•˜๋‚˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ผ์–ด๋‚˜๋Š” ์ผ:

  1. ์ž‘์„ฑ: ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€(/wp-admin)์—์„œ ๊ธ€์„ ์“ด๋‹ค
  2. ์ €์žฅ: WordPress DB(MySQL)์— ๊ธ€์ด ์ €์žฅ๋œ๋‹ค
  3. ํ‘œ์‹œ: WordPress๊ฐ€ PHP ํ…œํ”Œ๋ฆฟ์œผ๋กœ HTML ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋ฐฉ๋ฌธ์ž์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค

์ด ์„ธ ๋‹จ๊ณ„๊ฐ€ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ ์•ˆ์— ์ „๋ถ€ ๋“ค์–ด ์žˆ๋‹ค. ๊ด€๋ฆฌ ํ™”๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ”„๋ก ํŠธ์—”๋“œ ํ…œํ”Œ๋ฆฟ์ด ๊ฒฐํ•ฉ(coupled)๋˜์–ด ์žˆ์–ด, โ€œWordPress๋กœ ์ž‘์„ฑํ•œ ๊ธ€์€ WordPress๊ฐ€ ๋งŒ๋“  ์›นํŽ˜์ด์ง€๋กœ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.โ€

graph LR
    A[๊ด€๋ฆฌ์ž: ๊ธ€ ์ž‘์„ฑ] --> B[WordPress]
    B --> C[DB ์ €์žฅ]
    B --> D[PHP ํ…œํ”Œ๋ฆฟ์œผ๋กœ HTML ์ƒ์„ฑ]
    D --> E[์›น์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ์ž๊ฐ€ ๋ด„]
    style B fill:#f9f,stroke:#333
    linkStyle 0,1,2,3 stroke:#333

์ „ํ†ต์  CMS์˜ ํ•œ๊ณ„ โ€” ์™œ Headless๊ฐ€ ํ•„์š”ํ•œ๊ฐ€

์ „ํ†ต์  CMS๋Š” ์›น์‚ฌ์ดํŠธ ํ•˜๋‚˜๋งŒ ์šด์˜ํ•  ๋•Œ๋Š” ์ถฉ๋ถ„ํ•˜๋‹ค. ๋ฌธ์ œ๋Š” ๊ฐ™์€ ์ฝ˜ํ…์ธ ๋ฅผ ์—ฌ๋Ÿฌ ์ฑ„๋„์— ๋ณด์—ฌ์ค˜์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‡ผํ•‘๋ชฐ์„ ์šด์˜ํ•˜๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์›น์‚ฌ์ดํŠธ๋งŒ ์žˆ์—ˆ๋‹ค. WordPress๋กœ ์ƒํ’ˆ์„ ๋“ฑ๋กํ•˜๋ฉด ์ž˜ ๋ณด์ธ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์—…์ด ์ปค์ง€๋ฉด์„œ ๋ชจ๋ฐ”์ผ ์•ฑ๋„ ๋งŒ๋“ค์—ˆ๋‹ค. ์•ฑ์—์„œ๋„ ๊ฐ™์€ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š”๋ฐ, WordPress๋Š” โ€œPHP๋กœ ๋งŒ๋“  ์›นํŽ˜์ด์ง€โ€๋งŒ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์•ฑ์€ PHP ์›นํŽ˜์ด์ง€๋ฅผ ์“ธ ์ˆ˜ ์—†์œผ๋‹ˆ, ๊ฐ™์€ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์•ฑ์šฉ์œผ๋กœ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๋งค์žฅ ํ‚ค์˜ค์Šคํฌ, ์Šค๋งˆํŠธ ์Šคํ”ผ์ปค ๋“ฑ ์ฑ„๋„์ด ๋Š˜์–ด๋‚  ๋•Œ๋งˆ๋‹ค ๊ฐ™์€ ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ๊ฐ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค:

         โ”Œโ†’ ์›น์‚ฌ์ดํŠธ์šฉ WordPress
์ƒํ’ˆ ์ •๋ณด โ”€โ”ผโ†’ ์•ฑ์šฉ ๋ณ„๋„ DB        โ† ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ 3๋ฒˆ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ
         โ””โ†’ ํ‚ค์˜ค์Šคํฌ์šฉ ๋ณ„๋„ ์‹œ์Šคํ…œ

Headless CMS๋Š” ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฐ€

Headless CMS๋Š” โ€œ์ฝ˜ํ…์ธ  ์ €์žฅ + ๊ด€๋ฆฌโ€๋งŒ ๋‹ด๋‹นํ•˜๊ณ , โ€œํ™”๋ฉด์— ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€โ€๋Š” ์ „ํ˜€ ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฝ˜ํ…์ธ ๋ฅผ ๊บผ๋‚ด๊ฐ€๋Š” ๋ฐฉ๋ฒ•์€ ์˜ค์ง API(JSON/GraphQL)๋ฟ์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ 1๋ฒˆ๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด ๋ชจ๋“  ์ฑ„๋„์ด API๋กœ ๊ฐ€์ ธ๋‹ค ์“ด๋‹ค:

                    โ”Œโ†’ ์›น์‚ฌ์ดํŠธ (React)
์ƒํ’ˆ ์ •๋ณด โ†’ API โ”€โ”€โ”€โ”€โ”ผโ†’ ๋ชจ๋ฐ”์ผ ์•ฑ (Swift)     โ† 1๋ฒˆ๋งŒ ๊ด€๋ฆฌ
                    โ””โ†’ ํ‚ค์˜ค์Šคํฌ / ์Šคํ”ผ์ปค

๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ โ€” ์‡ผํ•‘๋ชฐ์—์„œ ์ƒํ’ˆ ํ•˜๋‚˜๋ฅผ ๋“ฑ๋กํ•œ๋‹ค๊ณ  ๊ฐ€์ •:

Headless CMS(Contentful)์— ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ:

{
  "name": "๋ฌด์„  ์ด์–ดํฐ Pro",
  "price": 129000,
  "description": "๋…ธ์ด์ฆˆ์บ”์Šฌ๋ง ์ง€์›, 30์‹œ๊ฐ„ ๋ฐฐํ„ฐ๋ฆฌ",
  "image": "https://cdn.example.com/earphone.jpg"
}

์ด ๋ฐ์ดํ„ฐ๋ฅผ API๋กœ ์š”์ฒญํ•ด์„œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ํ‘œ์‹œ:

์ฑ„๋„๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์“ฐ๋Š”๊ฐ€
์›น์‚ฌ์ดํŠธ (React)์ƒํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€์— ์ด๋ฏธ์ง€ ํฌ๊ฒŒ, ๋ฆฌ๋ทฐ์™€ ํ•จ๊ป˜ ํ‘œ์‹œ
๋ชจ๋ฐ”์ผ ์•ฑ (Swift/Kotlin)์ž‘์€ ํ™”๋ฉด์— ๋งž๊ฒŒ ์นด๋“œํ˜• ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ํ‘œ์‹œ
๋งค์žฅ ํ‚ค์˜ค์Šคํฌํ„ฐ์น˜์Šคํฌ๋ฆฐ์šฉ ๋Œ€ํ˜• UI๋กœ ํ‘œ์‹œ
์Šค๋งˆํŠธ ์Šคํ”ผ์ปค (Alexa)โ€œ๋ฌด์„  ์ด์–ดํฐ ํ”„๋กœ, 12๋งŒ9์ฒœ์›, ๋…ธ์ด์ฆˆ์บ”์Šฌ๋ง ์ง€์›โ€ ์Œ์„ฑ ์ฝ๊ธฐ
graph LR
    CMS[Headless CMS<br/>์ฝ˜ํ…์ธ  ์ €์žฅ + API] -->|JSON API| Web[์›น์‚ฌ์ดํŠธ<br/>React]
    CMS -->|JSON API| App[๋ชจ๋ฐ”์ผ ์•ฑ<br/>Swift]
    CMS -->|JSON API| Kiosk[๋งค์žฅ ํ‚ค์˜ค์Šคํฌ]
    CMS -->|JSON API| Speaker[์Šค๋งˆํŠธ ์Šคํ”ผ์ปค]
    style CMS fill:#4ecdc4,stroke:#333,color:#000

์ฝ˜ํ…์ธ ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ชจ๋“  ์ฑ„๋„์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋œ๋‹ค. ์ „ํ†ต์  CMS์—์„œ๋Š” ์ฑ„๋„๋งˆ๋‹ค ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

ํ•ต์‹ฌ ์ฐจ์ด ์š”์•ฝ

์ „ํ†ต์  CMS (WordPress)Headless CMS (Contentful, Strapi)
๊ตฌ์กฐ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ + ํ™”๋ฉด ํ‘œ์‹œ๊ฐ€ ํ•œ ๋ฉ์–ด๋ฆฌ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ๋งŒ ๋‹ด๋‹น, ํ™”๋ฉด์€ ๋ณ„๋„
์ฝ˜ํ…์ธ  ์ „๋‹ฌPHP/HTML ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ง์ ‘ ๋ Œ๋”๋งAPI(JSON)๋กœ ๋ฐ์ดํ„ฐ๋งŒ ์ „๋‹ฌ
ํ”„๋ก ํŠธ์—”๋“œCMS๊ฐ€ ์ •ํ•ด์ค€ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ๊ตฌ์ถ• (React, Vue ๋“ฑ)
๋ฉ€ํ‹ฐ ์ฑ„๋„์›น์‚ฌ์ดํŠธ 1๊ฐœ์— ์ตœ์ ํ™”์›น, ์•ฑ, IoT, ์Šคํ”ผ์ปค ๋“ฑ ๋‹ค์ค‘ ์ฑ„๋„
โ€Headโ€์žˆ์Œ โ€” CMS๊ฐ€ ํ™”๋ฉด๊นŒ์ง€ ์ œ๊ณต์—†์Œ โ€” ํ™”๋ฉด(head)์„ ๋–ผ์–ด๋ƒ„
์ ํ•ฉํ•œ ์ƒํ™ฉ์›น์‚ฌ์ดํŠธ 1๊ฐœ๋งŒ ์šด์˜์›น + ์•ฑ + ์—ฌ๋Ÿฌ ์ฑ„๋„์— ๊ฐ™์€ ์ฝ˜ํ…์ธ  ์ œ๊ณต

์ฐธ๊ณ  ๋ฌธ์„œ