- 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๋ฅผ ์๋ก ๋ค๋ฉด, ๋ธ๋ก๊ทธ ๊ธ ํ๋๋ฅผ ์์ฑํ ๋ ์ผ์ด๋๋ ์ผ:
- ์์ฑ: ๊ด๋ฆฌ์ ํ์ด์ง(
/wp-admin)์์ ๊ธ์ ์ด๋ค - ์ ์ฅ: WordPress DB(MySQL)์ ๊ธ์ด ์ ์ฅ๋๋ค
- ํ์: 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๊ฐ๋ง ์ด์ | ์น + ์ฑ + ์ฌ๋ฌ ์ฑ๋์ ๊ฐ์ ์ฝํ ์ธ ์ ๊ณต |