์๊ฐ
์๋ํ๊ณ ์ ํ๋ ๊ฒ๊ณผ ๊ทธ ์ด์ ๋ฅผ ์๋ ค์ฃผ์ธ์.
๋ทฐํฐ ์ ๊ณ์์ ํด์ธ ๋ง์ผํ ยท์์ ์ ์ค๋ ํด์์ต๋๋ค. ์์ด๋ ๋ ์จ์ผ ํ๋ ์ธ์ด์ธ๋ฐ, ์ ํ ๊ฒฝํ์ด ์๋ค ๋ณด๋ ๋ฐ์ด์ด ๋ฏธํ ์ด๋ ์ปจ์ฝ์์ ํญ์ ์กฐ๊ธ์ฉ ์กฐ์ฌ์ค๋ฌ์ ์ต๋๋ค. ํ๊ณ ์ถ์ ๋ง์ ํํํ๋๋ฐ, ๊ทธ๋ค์ ์์ฐ์ค๋ฌ์๊ณผ๋ ๋ถ๋ช ํ ์ฐจ์ด๊ฐ ์๋ค๋ ๊ฑธ ์ค์ค๋ก๋ ์์์ต๋๋ค.
๊ทธ๋์ ์ค๋์ ๋ถํฐ ์ด๋ฐ ํํธ๋๊ฐ ์์ผ๋ฉด ์ข๊ฒ ๋ค๊ณ ์๊ฐํด์์ต๋๋ค.
"๋ด๊ฐ ๋ฐฉ๊ธ ํ ๋ง์ ๋ฐ๋ก ๊ณ ์ณ์ฃผ๊ณ , ๋ด ์ ๋ฌด ๋งฅ๋ฝ์์ ๋ํ๋ฅผ ์์๋ฐ๋ฅด๊ฒ ์ด์ด๊ฐ ์ค ์ ์๋ ์๋."
์์ค์ ์์ด ์ฑ์ด๋ ํํ ๋ชจ์์ ๊ฝค ์ฐพ์๋ดค๋๋ฐ, ๋น์ฐํ ์ ์ ๋ฌด์ ๋ฑ ๋ง๋ ๋ด์ฉ์ ์์์ต๋๋ค. ๋ชจ๋ ์ผ์ ํํ ์์ฃผ์ด๊ฑฐ๋, B2B๋ผ๋ ์ ์ข ์ด ๋ฌ๋์ต๋๋ค. ๊ฑฐ๊ธฐ๋ค ํ ๊ฐ์ง ๋ ๋ฐ๋์ต๋๋ค. ์ฐ์ตํ๋ ๊น์ ์ ์ข ๊ด๋ จ ์์ฅ ์ ๋ณด๋ ํธ๋ ๋๋ ์์ด๋ก ์ ํ ์ ์๋ค๋ฉด, ์์ด ๊ณต๋ถ์ ์ ๋ฌด ์ธํ์ ๋์์ ํ ์ ์์ง ์์๊น ํ๊ณ ์.
๊ทธ ์๊ฐ์ด ์ค๋ ๋จธ๋ฆฟ์์ ์์๋๋ฐ, Claude๋ฅผ ์ฐ๋ฉด์ "์ง์ ๋ง๋ค ์ ์๊ฒ ๋ค"๋ ์๊ฐ์ด ์ฒ์์ผ๋ก ๋ค์์ต๋๋ค.
์งํ ๋ฐฉ๋ฒ
์ด๋ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ณ , ์ด๋ป๊ฒ ํ์ฉํ์ จ๋์?
1๋จ๊ณ โ ์ผ๋จ ๋ง๋ก ์์ฒญํ์ต๋๋ค
Claude.ai์์ ์ฒ์ ์์ฒญ์ ๋จ์ํ์ต๋๋ค.
๋๋ K-Beauty ํด์ธ ์์
๋ด๋น์์ผ.
๋ฐ์ด์ด ๋ฏธํ
์์ด ์ฐ์ต์ ํ ์ ์๋ ๋กคํ๋ ์ด ์ฑ์ ๋ง๋ค์ด์ค.
AI๊ฐ ๋ฐ์ด์ด ์ญํ ์ ํ๊ณ , ๋ด ๋ง์ ๊ต์ ํด์คฌ์ผ๋ฉด ํด.์ฒ์ ๋์จ ๊ฒฐ๊ณผ๋ฌผ์ ๋จ์ํ ์ฑํ UI์์ต๋๋ค. ํ์ง๋ง ์ด๋ฏธ ํต์ฌ ๊ตฌ์กฐ๋ ์์์ต๋๋ค. AI ๋ฐ์ด์ด๊ฐ ์ค์ ์ฒ๋ผ ์ง๋ฌธํ๊ณ , ์ ๋ต๋ณ ์๋์ ๊ต์ ๋ธ๋ก์ด ๋ถ๋ ํํ์์ต๋๋ค.
์ฌ๊ธฐ์ ์์ฌ์ด ์๊ฒผ์ต๋๋ค.
"๋ฐ์ด์ด ๋ชฉ์๋ฆฌ๋ก ์ฝ์ด์ค ์ ์์ด?" โ TTS ์์ฑ ์ถ๋ ฅ ์ถ๊ฐ
"๋ด๊ฐ ๋งํ๋ฉด ํ
์คํธ๋ก ๋ฐ๊ฟ์ค" โ ๋ง์ดํฌ ์์ฑ ์
๋ ฅ ์ถ๊ฐ
"์์ฅ ์ ๋ณด๋ ๊ฐ์ด ๋์์ผ๋ฉด ํด" โ ๐ Market Insight ๋ธ๋ก ์ถ๊ฐ
"๊ต์ ์คํ์ผ์ ๋ด๊ฐ ๊ณ ๋ฅผ ์ ์๊ฒ ํด์ค" โ ๊ผผ๊ผผํ / ์์ฐ์ค๋ฝ๊ฒ / ๊ณ ๊ธ ํํ ์ต์
์ถ๊ฐ๊ธฐ๋ฅ์ ํ๋ ์์ฒญํ๋ฉด Claude๊ฐ ์ฝ๋๋ฅผ ์์ ํด์คฌ๊ณ , ์ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํผ๋๋ฐฑ๋ง ํ์ต๋๋ค.
2๋จ๊ณ โ ์ค๋ฅ์์ ์ ์ (์ฝ์ง ๊ธฐ๋ก)
์ฒซ ๋ฒ์งธ ์ค๋ฅ โ JS ๋ฌธ๋ฒ ์ค๋ฅ
์ฑ์ ์ฒ์ ์คํํ๋๋ ์ฝ์์ ์ด๋ฐ ๋ฉ์์ง๊ฐ ๋ด์ต๋๋ค.
Uncaught SyntaxError: Unexpected identifier 'm'
Uncaught ReferenceError: handleKey is not defined์์ธ์ Claude.ai ์ํฐํฉํธ ํ๊ฒฝ์ด ๊ตฌํ JS ์์ง์ ์ฌ์ฉํ๋ค๋ ์ ์ด์์ต๋๋ค. ๋ฐฑํฑ(`) ์์ ์ค๋ฐ๊ฟ์ด ์์ผ๋ฉด ํ์ฑ ์ค๋ฅ๊ฐ ๋ฌ์ต๋๋ค. ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ทธ๋๋ก Claude์๊ฒ ๋ถ์ฌ๋ฃ์๋๋ ์์ธ์ ์ฐพ์์ ์์ ํด์คฌ์ต๋๋ค.
๋ ๋ฒ์งธ ์ค๋ฅ โ ์ต์ JS ๋ฌธ๋ฒ ๋ฏธ์ง์
Uncaught SyntaxError: Unexpected identifier 's'
Uncaught SyntaxError: Unexpected end of input์ด๋ฒ์ .finally()์ Array.from()์ด ๋ฌธ์ ์์ต๋๋ค. Claude๊ฐ ์ํฐํฉํธ ํ๊ฒฝ์์ ๊ธ์ง๋ ๋ฌธ๋ฒ ๋ชฉ๋ก์ ์ ๋ฆฌํด์คฌ์ต๋๋ค.
์ฌ์ฉ ๊ธ์ง
๋์ฒด ๋ฐฉ๋ฒ
.finally()
XMLHttpRequest๋ก ๊ต์ฒด
Array.from()
for ๋ฃจํ
const / let
var
Arrow function =>
function(){}
์ดํ ๋น๋ํ ๋๋ง๋ค Node.js๋ก ๋ฌธ๋ฒ ๊ฒ์ฌ๋ฅผ ์๋์ผ๋ก ๋๋ ธ์ต๋๋ค.
bash
node -e "
var js = require('fs').readFileSync('index.html','utf8')
.match(/<script>([\s\S]*?)<\/script>/)[1];
try { new Function(js); console.log('Syntax OK'); }
catch(e) { console.log('ERROR:', e.message); }
"์ธ ๋ฒ์งธ ์ค๋ฅ โ CORS ๋ฒฝ
์ฑ ์์ Anthropic API๋ฅผ ์ง์ ํธ์ถํ๋ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฌ์ต๋๋ค.
HTTP 0 โ API ์ฐ๊ฒฐ ์ค๋ฅ๋ธ๋ผ์ฐ์ ์์ ์ธ๋ถ API๋ฅผ ์ง์ ํธ์ถํ๋ฉด ๋ณด์ ์ ์ฑ (CORS)์ผ๋ก ๋งํ๋๋ค. ํด๊ฒฐ์ฑ ์ Anthropic์ด ์ ๊ณตํ๋ ํน์ ํค๋์์ต๋๋ค.
javascript
headers: {
"x-api-key": userApiKey,
"anthropic-version": "2023-06-01",
"anthropic-dangerous-direct-browser-access": "true"
}์ด ํค๋ ๋๋ถ์ ๋ณ๋ ์๋ฒ ์์ด ๋ธ๋ผ์ฐ์ ์์ ์ง์ API ํธ์ถ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ณธ์ธ Anthropic API Key๋ฅผ ์ฑ์ ์ ๋ ฅํ๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ์ต๋๋ค.
3๋จ๊ณ โ ์ฒ์์ K-Beauty ์ ์ฉ์ด์๋๋ฐ
์ฒ์ ๋ง๋ ์ฑ์ ๋ค์ผยท์์กฐ ํ์ฅํ(Enth) ์ ์ฉ์ด์์ต๋๋ค. ์๋๋ฆฌ์ค 5๊ฐ๊ฐ ํ๋์ฝ๋ฉ๋ผ ์์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฐ ์๊ฐ์ด ๋ค์์ต๋๋ค.
"SaaS ํด์ธ ์์ , ์๋์ฐจ ๋ถํ ์์ถ, ์ํ ์ ํต ๋ด๋น์๋ค๋ ์ธ ์ ์์ง ์์๊น?"
Claude์๊ฒ ๋ฐฉํฅ์ ์ค๋ช ํ์ต๋๋ค.
์ด ์ฑ์ ๋ฒ์ฉ B2B ์์ด ์ฝ์น๋ก ๋ง๋ค๊ณ ์ถ์ด.
์
์ข
์ ์
๋ ฅํ๋ฉด ๊ทธ์ ๋ง๋ AI ๋ฐ์ด์ด๊ฐ ์๋ ์์ฑ๋๊ฒ ํด์ค.
์ฌ์ฉ์๋ง๋ค ์ด๋ฆ, ์ง๋ฌด, ์ํฉ, ๊ต์ ์คํ์ผ์ ์
๋ ฅํ๋ ์จ๋ณด๋ฉ ๋จ๊ณ๊ฐ ํ์ํด.ํต์ฌ์ ์๋๋ฆฌ์ค๋ฅผ ํ๋์ฝ๋ฉํ์ง ์๋ ๊ฒ์ด์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ณธ์ธ ์ ์ข ์ ์ ๋ ฅํ๋ฉด Claude API๊ฐ ๊ทธ์ ๋ง๋ ๋ฐ์ด์ด ํ๋ฅด์๋์ ์๋๋ฆฌ์ค 5๊ฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ตฌ์กฐ์ ๋๋ค.
์ฌ์ฉ์ ์
๋ ฅ: ์ง๋ฌด/์
์ข
ยท ์ด๋ฆ ยท ์ฃผ์ ์ํฉ ยท ๊ต์ ์คํ์ผ
โ
Claude API โ ๋ง์ถค ์๋๋ฆฌ์ค 5๊ฐ JSON ์์ฑ
โ
์๋๋ฆฌ์ค ์ ํ โ AI ๋ฐ์ด์ด ๋ฑ์ฅ โ ๋กคํ๋ ์ด ์์4๋จ๊ณ โ ๋ฌธ์ํ๊น์ง ํ ๋ฒ์
์ฑ์ด ์ด๋ ์ ๋ ์์ฑ๋์, ๋ค๋ฅธ ์ฌ๋์๊ฒ๋ ๋ฐฐํฌํ๊ณ ์ถ์ด์ก์ต๋๋ค. ๊ฐ๋ฐ ๊ฒฝํ์ด ์์ผ๋ ๋ฌธ์๋ถํฐ ์ ๋ฆฌํ๊ธฐ๋ก ํ์ต๋๋ค.
์ง๊ธ๊น์ง ๋ง๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก
PRD, TRD, Task.md, build.sh๋ฅผ ๋ง๋ค์ด์ค.
๋ค๋ฅธ ์ฌ๋๋ ์ธ ์ ์๋ ๋ฒ์ฉ B2B ์์ด ์ฝ์น ๊ธฐ์ค์ผ๋ก.๋ช ๋ถ ๋ง์ 4๊ฐ ํ์ผ์ด ์์ฑ๋์ต๋๋ค.
PRD.md โ ์ ํ ์ ์, ์ฌ์ฉ์ ํ๋ฅด์๋, ๊ธฐ๋ฅ ๋ชฉ๋ก, ๋ก๋๋งต
TRD.md โ ์ํคํ ์ฒ ์ค๊ณ, API ์คํ, ES5 ์ ์ฝ์ฌํญ, ๋ฐฐํฌ ์ค์
Task.md โ Phase 0(์๋ฃ) ~ Phase 3๊น์ง 53๊ฐ ํ์คํฌ
build.sh โ ํ ์ค ๋ฐฐํฌ (
bash build.sh vercel)
bash
bash build.sh status
# โ Progress: 9 / 53 tasks complete๊ฒฐ๊ณผ์ ๋ฐฐ์ด ์
์์ฑ๋ ๊ฒ
(์ต๊ทผ Nail๊ณผ ์์กฐํ์ฌ ์ ๋ฌด๋ฅผ ์์ํด์ ์ด ๋ถ๋ถ์ด ์ฌ๊ธฐ์ ๋ฐ์์ด ๋์์ต๋๋ค)
๋จ์ผ HTML ํ์ผ ํ๋๋ก ๋์ํ๋ B2B ์์ด ๋กคํ๋ ์ด ์ฑ์ ๋๋ค. ์ค์น ์์ด ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฉด ๋ฉ๋๋ค. ๋ณธ์ธ Anthropic API Key๋ง ์์ผ๋ฉด ๋ฐ๋ก ์ธ ์ ์์ต๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ์ ์ด๋ ์ต๋๋ค. 5๊ฐ์ง ์ ๋ฌด ์๋๋ฆฌ์ค ์ ํ, AI ๋ฐ์ด์ด์ ์ค์๊ฐ ๋ํ, TTS๋ก ๋ฐ์ด์ด ๋ชฉ์๋ฆฌ ๋ฃ๊ธฐ, ๋ง์ดํฌ๋ก ๋งํ๋ฉด ์๋ ์ธ์ ํ ์ ์ก, ๋งค ์๋ต ํ ๊ต์ ํํ + ํ๊ตญ์ด ํ + ์์ฅ ์ ๋ณด ํ์.
์ํ์ฐฉ์ค์์ ๋ฐฐ์ด ๊ฒ
์ค๋ฅ๊ฐ ๋ ๋๋ง๋ค ๋ฉ์์ง๋ฅผ ๊ทธ๋๋ก ๋ถ์ฌ๋ฃ๋ ๊ฒ ๊ฐ์ฅ ๋น ๋ฅธ ํด๊ฒฐ์ฑ ์ด์์ต๋๋ค. "์ ์ ๋์ง?"๋ฅผ ํผ์ ๊ณ ๋ฏผํ๋ ์๊ฐ์ด ์คํ๋ ค ๋ ๋ญ๋น์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Claude๋ ์ฝ๋๋ง ์ง์ฃผ๋ ๊ฒ ์๋์์ต๋๋ค. "๋ฒ์ฉ์ผ๋ก ๊ฐ์ผ ํ๋, ์ ์ฉ์ผ๋ก ๊ฐ์ผ ํ๋?" ๊ฐ์ ๋ฐฉํฅ ์ง๋ฌธ์๋ ์ด์ ๋ฅผ ๋ค์ด ์๊ฒฌ์ ์คฌ์ต๋๋ค. ์์ ์ค๊ฐ์ค๊ฐ์ ์ด๋ฐ ๋ํ๊ฐ ๊ฝค ๋์์ด ๋์ต๋๋ค.
๋์์ด ํ์ํ ๋ถ๋ถ
ํ์ฌ API Key๋ฅผ ์ฌ์ฉ์๊ฐ ์ง์ ์ ๋ ฅํ๋ ๊ตฌ์กฐ๋ผ ๋งค๋ฒ ๋ฃ์ด์ผ ํ๋ ๋ถํธํจ์ด ์์ต๋๋ค. localStorage ์ ์ฅ ๊ธฐ๋ฅ์ ๊ตฌํ ์์ ์ธ๋ฐ, ๋ณด์ ๊ด๋ จํด์ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์๊ฒฌ ๋ถํ๋๋ฆฝ๋๋ค.
์์ผ๋ก์ ๊ณํ
์จ๋ณด๋ฉ ๋ชจ๋๊ณผ ๋์ ์๋๋ฆฌ์ค ์์ฑ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด ์ง์ง ๋ฒ์ฉ ๋ฒ์ ์ด ๋ฉ๋๋ค. ์ดํ Vercel์ ์ฌ๋ ค์ ๋งํฌ ํ๋๋ก ๊ณต์ ํ ์ ์๊ฒ ๋ง๋ค ์์ ์ ๋๋ค. ํน์ ํ ์คํธํด๋ณด๊ณ ์ถ์ผ์ ๋ถ์ด ๊ณ์๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์.
๋์ ๋ฐ์ ๊ธ (์ต์ )
์ผ์ฑPM Kenny ๋์ "API Manager ์ ์ ๋ฐฉ์ (Rust ๊ธฐ๋ฐ build.sh ์์ฒญ ๋ถ๋ถ)"์ ์ฐธ๊ณ ํ์์ต๋๋ค