This workflow follows the Google Sheets → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"createdAt": "2026-02-28T12:43:46.770Z",
"updatedAt": "2026-02-28T13:29:30.697Z",
"id": "ty52rqOEJ6ZjNF2L",
"name": "Blog Automation Pipeline A \u2014 Content Generation",
"active": true,
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 1 * * *"
}
]
}
},
"id": "node-1-schedule",
"name": "Schedule Trigger (01:00 AM)",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
240,
300
]
},
{
"parameters": {
"authentication": "serviceAccount",
"operation": "read",
"documentId": {
"__rl": true,
"value": "1VbyEQNuIAKpmTfk_5pTIjuLb3xlS-kdUfWflmfnFJSA",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "id"
},
"options": {
"dataLocationOnSheet": {
"values": {
"rangeDefinition": "detectAutomatically"
}
}
},
"filtersUI": {
"values": [
{
"lookupColumn": "\uc0c1\ud0dc",
"lookupValue": "\ub300\uae30"
}
]
},
"combineFilters": "AND"
},
"id": "node-2-sheets-read",
"name": "Sheets Read (Status=\ub300\uae30)",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
680,
300
],
"credentials": {
"googleApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"method": "GET",
"url": "https://serpapi.com/search.json",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "q",
"value": "={{ $json['\ud0a4\uc6cc\ub4dc'] }}"
},
{
"name": "location",
"value": "South Korea"
},
{
"name": "hl",
"value": "ko"
},
{
"name": "gl",
"value": "kr"
},
{
"name": "num",
"value": "10"
},
{
"name": "api_key",
"value": "={{ $env.SERPAPI_KEY }}"
}
]
},
"options": {}
},
"id": "node-3-serpapi",
"name": "SerpAPI Search",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1340,
300
]
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "/**\n * Parse SERP Data \u2014 SerpAPI \uacb0\uacfc \uad6c\uc870\ud654 \ucd94\ucd9c\n * Mode: runOnceForEachItem\n * \uc785\ub825: SerpAPI JSON \uc751\ub2f5 (\uac01 \uc544\uc774\ud15c)\n * \ucd9c\ub825: \uad6c\uc870\ud654\ub41c SERP \ud14d\uc2a4\ud2b8 (\ud504\ub86c\ud504\ud2b8\uc5d0 \uc0bd\uc785\uc6a9)\n */\n\nconst serpResults = $input.item.json;\n\n// \uacf5\uc2dd \ubb38\uc11c \ub3c4\uba54\uc778 \ub9ac\uc2a4\ud2b8\nconst OFFICIAL_DOMAINS = [\n 'learn.microsoft.com', 'docs.aws.amazon.com', 'cloud.google.com',\n 'developer.mozilla.org', 'docs.docker.com', 'kubernetes.io/docs',\n 'docs.github.com', 'developer.hashicorp.com', 'docs.ansible.com',\n 'docs.oracle.com', 'docs.redhat.com', 'wiki.archlinux.org',\n 'man7.org', 'nginx.org/en/docs', 'docs.python.org',\n 'go.dev/doc', 'docs.microsoft.com', 'cloud.google.com/docs',\n 'docs.anthropic.com', 'platform.openai.com/docs',\n];\n\n// 1. Organic Results (\uc0c1\uc704 7\uac1c) \u2014 \uc81c\ubaa9, \uc2a4\ub2c8\ud3ab, URL\nlet organicText = '';\nconst serpUrls = [];\nconst officialUrls = [];\nif (serpResults.organic_results && serpResults.organic_results.length > 0) {\n const top7 = serpResults.organic_results.slice(0, 7);\n organicText = top7.map((r, i) =>\n `${i + 1}. ${r.title}\\n ${r.snippet || '(\uc2a4\ub2c8\ud3ab \uc5c6\uc74c)'}\\n URL: ${r.link || ''}`\n ).join('\\n');\n for (const r of top7) {\n if (r.link) {\n serpUrls.push(r.link);\n if (OFFICIAL_DOMAINS.some(d => r.link.includes(d))) {\n officialUrls.push({ url: r.link, title: r.title, snippet: r.snippet });\n }\n }\n }\n}\n\n// 2. People Also Ask (\uad00\ub828 \uc9c8\ubb38, 5\uac1c) \u2014 FAQ \uc7ac\ub8cc\nlet paaText = '';\nif (serpResults.related_questions && serpResults.related_questions.length > 0) {\n const top5 = serpResults.related_questions.slice(0, 5);\n paaText = top5.map((q, i) =>\n `${i + 1}. ${q.question}${q.snippet ? '\\n \u2192 ' + q.snippet : ''}`\n ).join('\\n');\n}\n\n// 3. Related Searches (\uad00\ub828 \uac80\uc0c9\uc5b4, 8\uac1c) \u2014 internal_link_keywords \ud6c4\ubcf4\nlet relatedText = '';\nif (serpResults.related_searches && serpResults.related_searches.length > 0) {\n const top8 = serpResults.related_searches.slice(0, 8);\n relatedText = top8.map(r => r.query).join(', ');\n}\n\n// 4. Knowledge Graph (\uc788\uc73c\uba74) \u2014 \uc815\uc758 \uc575\ucee4\nlet kgText = '';\nif (serpResults.knowledge_graph) {\n const kg = serpResults.knowledge_graph;\n kgText = `${kg.title || ''}: ${kg.description || kg.snippet || ''}`;\n if (kg.source) {\n kgText += ` (\ucd9c\ucc98: ${kg.source.name || ''})`;\n }\n // Extract knowledge graph URL\n if (kg.source && kg.source.link) {\n serpUrls.push(kg.source.link);\n }\n}\n\n// \uad6c\uc870\ud654\ub41c SERP \ud14d\uc2a4\ud2b8 \uc870\ud569\nconst sections = [];\n\nif (organicText) {\n sections.push(`### \uac80\uc0c9 \uc0c1\uc704 \ucf58\ud150\uce20 (\uc0c1\uc704 7\uac1c)\\n${organicText}`);\n}\nif (paaText) {\n sections.push(`### People Also Ask (\uc0ac\ub78c\ub4e4\uc774 \uc790\uc8fc \ubb3b\ub294 \uc9c8\ubb38)\\n${paaText}`);\n}\nif (relatedText) {\n sections.push(`### \uad00\ub828 \uac80\uc0c9\uc5b4\\n${relatedText}`);\n}\nif (kgText) {\n sections.push(`### \uc9c0\uc2dd \uadf8\ub798\ud504 \uc815\uc758\\n${kgText}`);\n}\n\nconst serpText = sections.length > 0\n ? sections.join('\\n\\n')\n : '(SERP \ub370\uc774\ud130 \uc5c6\uc74c)';\n\n// \uc2dc\ud2b8 \ub370\uc774\ud130\ub97c \ud568\uaed8 \uc804\ub2ec\nconst sheetData = $('Sheets Read (Status=\ub300\uae30)').item.json;\n\nreturn {\n json: {\n ...sheetData,\n serp_text: serpText,\n serp_urls: serpUrls,\n official_urls: officialUrls.slice(0, 3),\n serp_organic_count: serpResults.organic_results ? serpResults.organic_results.length : 0,\n serp_paa_count: serpResults.related_questions ? serpResults.related_questions.length : 0,\n serp_related_count: serpResults.related_searches ? serpResults.related_searches.length : 0,\n serp_has_kg: !!serpResults.knowledge_graph,\n }\n};\n"
},
"id": "node-3b-parse-serp",
"name": "Parse SERP Data",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1450,
300
]
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "/**\n * Fetch Official Docs \u2014 \uacf5\uc2dd\ubb38\uc11c \ubcf8\ubb38 \ud06c\ub864\ub9c1\n * Mode: runOnceForEachItem\n * \uc785\ub825: Parse SERP Data \ucd9c\ub825 (official_urls \ud3ec\ud568)\n * \ucd9c\ub825: official_docs_text \ud544\ub4dc \ucd94\uac00\n *\n * Firecrawl API \ud0a4\uac00 \uc788\uc73c\uba74 /v1/scrape\ub85c \ub9c8\ud06c\ub2e4\uc6b4 \ucd94\ucd9c,\n * \uc5c6\uc73c\uba74 \uc9c1\uc811 GET + HTML \ud14d\uc2a4\ud2b8 \ucd94\ucd9c (fallback)\n */\n\nconst FIRECRAWL_KEY = $env.FIRECRAWL_API_KEY || '';\nconst officialUrls = $input.item.json.official_urls || [];\nconst MAX_DOCS = 3;\nconst MAX_CHARS_PER_DOC = 3000;\n\n/**\n * HTML\uc5d0\uc11c \ubcf8\ubb38 \ud14d\uc2a4\ud2b8 \ucd94\ucd9c (fallback\uc6a9)\n * <main>, <article>, <div role=\"main\"> \uc911 \uccab \ub9e4\uce6d \ud0dc\uadf8\uc758 \ud14d\uc2a4\ud2b8 \ucd94\ucd9c\n */\nfunction extractMainText(html) {\n if (typeof html !== 'string') return '';\n\n // main/article/div[role=main] \ud0dc\uadf8 \ub0b4\uc6a9 \ucd94\ucd9c \uc2dc\ub3c4\n const patterns = [\n /<main[^>]*>([\\s\\S]*?)<\\/main>/i,\n /<article[^>]*>([\\s\\S]*?)<\\/article>/i,\n /<div[^>]*role\\s*=\\s*[\"']main[\"'][^>]*>([\\s\\S]*?)<\\/div>/i,\n ];\n\n let bodyText = '';\n for (const pattern of patterns) {\n const match = html.match(pattern);\n if (match && match[1]) {\n bodyText = match[1];\n break;\n }\n }\n\n // \ub9e4\uce6d \uc2e4\ud328 \uc2dc <body> \uc804\uccb4 \uc0ac\uc6a9\n if (!bodyText) {\n const bodyMatch = html.match(/<body[^>]*>([\\s\\S]*?)<\\/body>/i);\n bodyText = bodyMatch ? bodyMatch[1] : html;\n }\n\n // HTML \ud0dc\uadf8 \uc81c\uac70 + \uc815\ub9ac\n return bodyText\n .replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '')\n .replace(/<nav[^>]*>[\\s\\S]*?<\\/nav>/gi, '')\n .replace(/<footer[^>]*>[\\s\\S]*?<\\/footer>/gi, '')\n .replace(/<header[^>]*>[\\s\\S]*?<\\/header>/gi, '')\n .replace(/<[^>]+>/g, ' ')\n .replace(/ /g, ' ')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nconst docs = [];\n\nfor (const entry of officialUrls.slice(0, MAX_DOCS)) {\n try {\n let content = '';\n\n if (FIRECRAWL_KEY) {\n // Firecrawl API v1/scrape\n const resp = await this.helpers.httpRequest({\n method: 'POST',\n url: 'https://api.firecrawl.dev/v1/scrape',\n headers: {\n 'Authorization': `Bearer ${FIRECRAWL_KEY}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n url: entry.url,\n formats: ['markdown'],\n onlyMainContent: true,\n }),\n returnFullResponse: false,\n timeout: 15000,\n });\n\n const parsed = typeof resp === 'string' ? JSON.parse(resp) : resp;\n content = (parsed.data?.markdown || '').slice(0, MAX_CHARS_PER_DOC);\n } else {\n // Fallback: \uc9c1\uc811 GET + \ud14d\uc2a4\ud2b8 \ucd94\ucd9c\n const html = await this.helpers.httpRequest({\n method: 'GET',\n url: entry.url,\n timeout: 10000,\n encoding: 'utf-8',\n returnFullResponse: false,\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; BlogBot/1.0)',\n 'Accept': 'text/html',\n },\n });\n content = extractMainText(html).slice(0, MAX_CHARS_PER_DOC);\n }\n\n if (content.length > 200) {\n docs.push(`### ${entry.title}\\nURL: ${entry.url}\\n\\n${content}`);\n }\n } catch (e) {\n // \ud06c\ub864\ub9c1 \uc2e4\ud328 \uc2dc skip (SERP snippet\uc740 \uc774\ubbf8 \uc788\uc73c\ubbc0\ub85c \uce58\uba85\uc801\uc774\uc9c0 \uc54a\uc74c)\n }\n}\n\nconst officialDocsText = docs.length > 0\n ? docs.join('\\n\\n---\\n\\n')\n : '';\n\nreturn {\n json: {\n ...$input.item.json,\n official_docs_text: officialDocsText,\n }\n};\n"
},
"id": "node-fetch-official-docs",
"name": "Fetch Official Docs",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1555,
300
]
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "// Node 4: Route Prompt \u2014 \uc2dc\ud2b8 \ub370\uc774\ud130 + SERP \ub370\uc774\ud130 \uacb0\ud569\nconst inputData = $input.item.json;\nconst keyword = inputData['\ud0a4\uc6cc\ub4dc'] || '';\nconst category = inputData['\ucf58\ud150\uce20\uc720\ud615'] || 'IT \uae30\ucd08 \uc6a9\uc5b4';\nconst rowIndex = inputData['__row_index'] || inputData['row_number'] || 0;\n\n// Parse SERP Data\uc5d0\uc11c \uc804\ub2ec\ub41c \uad6c\uc870\ud654\ub41c SERP \ud14d\uc2a4\ud2b8\nconst serpSummary = inputData.serp_text || '(SERP \ub370\uc774\ud130 \uc5c6\uc74c)';\n\n// \ud504\ub86c\ud504\ud2b8 \uc720\ud615 \ubd84\uae30\nconst PROMPT_A = `# \ud504\ub86c\ud504\ud2b8 A: IT \uae30\ucd08 \uc6a9\uc5b4 \uc815\uc758\n\n\ub2f9\uc2e0\uc740 B2B IT \uc778\ud504\ub77c \uc804\ubb38 \uae30\uc220 \ube14\ub85c\uac70\uc785\ub2c8\ub2e4.\n\uc544\ub798 \ud0a4\uc6cc\ub4dc\uc5d0 \ub300\ud574 \ud55c\uad6d\uc5b4 \uae30\uc220 \ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud558\uc138\uc694.\n\n## \uc791\uc131 \uaddc\uce59\n\n1. **\ub300\uc0c1 \ub3c5\uc790**: IT \uc778\ud504\ub77c \ucd08\ubcf4~\uc911\uae09 \uc2e4\ubb34\uc790 (\uae30\uc5c5 \ud658\uacbd)\n2. **\ud1a4**: \uc804\ubb38\uc801\uc774\ub418 \uc27d\uac8c \ud480\uc5b4\uc4f4 \uc124\uba85\uccb4\n3. **\ubd84\ub7c9**: \ubcf8\ubb38 \ucd5c\uc18c 3,000\uc790 \uc774\uc0c1 (\ub9c8\ud06c\ub2e4\uc6b4 \uae30\uc900, 4,000\uc790 \uad8c\uc7a5)\n4. **\uad6c\uc870**: H2/H3 \ud5e4\ub529 \ud65c\uc6a9, \ub17c\ub9ac\uc801 \ud750\ub984\n5. **\ub2e4\uc774\uc5b4\uadf8\ub7a8**: \uac01 H2 \uc139\uc158(FAQ \uc81c\uc678) \uc911 \uc2dc\uac01\ud654\uac00 \uc720\uc6a9\ud55c \uacf3\uc5d0 Mermaid \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0bd\uc785\ud558\uc138\uc694 (\ucd5c\uc18c 2\uac1c). **\ubc18\ub4dc\uc2dc [MERMAID]...[/MERMAID] \ub9c8\ucee4\ub85c \uac10\uc2f8\uc138\uc694** (\ud2b8\ub9ac\ud50c \ubc31\ud2f1 \\`\\`\\`mermaid \uc0ac\uc6a9 \uae08\uc9c0). \ub2e4\uc774\uc5b4\uadf8\ub7a8 \uc720\ud615\uc740 graph TD, sequenceDiagram, flowchart LR \ub4f1 \uc790\uc720\ub86d\uac8c \uc120\ud0dd\ud558\ub418, \ub178\ub4dc \ub808\uc774\ube14\uc740 \uc601\ubb38\uc73c\ub85c \uc791\uc131\ud558\uc138\uc694.\n6. **\ucf54\ub4dc \uc608\uc2dc**: \uc124\uc815 \ud30c\uc77c, CLI \uba85\ub839\uc5b4, \uc2a4\ud06c\ub9bd\ud2b8 \ub4f1 \uc2e4\ubb34 \ucf54\ub4dc \uc608\uc2dc\ub97c 1\uac1c \uc774\uc0c1 \ud3ec\ud568\ud558\uc138\uc694. \ucf54\ub4dc\ube14\ub85d\uc5d0\ub294 \ubc18\ub4dc\uc2dc \uc5b8\uc5b4 \ud0dc\uadf8(\\`\\`\\`yaml, \\`\\`\\`bash, \\`\\`\\`powershell \ub4f1)\ub97c \ubd99\uc774\uc138\uc694\n7. **\uc139\uc158 \uc774\ubbf8\uc9c0**: Mermaid \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc774 \uc5c6\ub294 H2 \uc139\uc158 \uc911 \uc2dc\uac01\uc801 \ubcf4\uac15\uc774 \ud544\uc694\ud55c \uacf3\uc5d0 \\`<!-- IMAGE: \uc601\ubb38 \uac80\uc0c9 \ud0a4\uc6cc\ub4dc -->\\` \ub9c8\ucee4\ub97c \uc0bd\uc785\ud558\uc138\uc694 (\ucd5c\uc18c 1\uac1c, \ucd5c\ub300 2\uac1c). \ud0a4\uc6cc\ub4dc\ub294 \ud574\ub2f9 \uc139\uc158 \uc8fc\uc81c\ub97c \uc601\ubb38 2~4\ub2e8\uc5b4\ub85c \ud45c\ud604 (\uc608: \"server rack data center\", \"network security firewall\"). FAQ \uc139\uc158\uc5d0\ub294 \uc0bd\uc785 \uae08\uc9c0.\n8. **\ucd5c\uc2e0\uc131 \ud544\uc218**:\n - user \uba54\uc2dc\uc9c0\uc758 \"\uc791\uc131 \uae30\uc900\uc77c\"\uc744 \ud655\uc778\ud558\uace0 \ud574\ub2f9 \uc2dc\uc810 \uae30\uc900\uc73c\ub85c \uc791\uc131\ud558\uc138\uc694\n - \"2024\ub144\", \"2023\ub144\" \ub4f1 \uacfc\uac70 \uc5f0\ub3c4 \ub370\uc774\ud130\ub294 \uc0ac\uc6a9\ud558\uc9c0 \ub9c8\uc138\uc694. \ubc18\ub4dc\uc2dc \ud604\uc7ac \uc5f0\ub3c4(user \uba54\uc2dc\uc9c0 \ucc38\uace0) \uae30\uc900 \uc815\ubcf4\ub97c \uc0ac\uc6a9\ud558\uc138\uc694\n - \ubc84\uc804 \uc815\ubcf4, \uac00\uaca9, \uae30\ub2a5 \ube44\uad50\ub294 \ucd5c\uc2e0 \ubc84\uc804 \uae30\uc900\uc73c\ub85c \uc791\uc131\ud558\uc138\uc694\n - \"\uacf5\uc2dd \ubb38\uc11c \ubcf8\ubb38\" \uc139\uc158\uc774 \uc81c\uacf5\ub418\uba74 SERP \uc2a4\ub2c8\ud3ab\ubcf4\ub2e4 \uc6b0\uc120\ud558\uc5ec \ucc38\uace0\ud558\uc138\uc694. \uacf5\uc2dd \ubb38\uc11c\uc758 \uc815\ud655\ud55c \uc6a9\uc5b4, \ubc84\uc804, \uae30\ub2a5 \uc124\uba85\uc744 \uadf8\ub300\ub85c \ubc18\uc601\ud558\uc138\uc694\n - \uc81c\ubaa9\uc5d0 \uc5f0\ub3c4\ub97c \ud3ec\ud568\ud560 \ub54c\ub294 \ubc18\ub4dc\uc2dc \ud604\uc7ac \uc5f0\ub3c4\ub97c \uc0ac\uc6a9\ud558\uc138\uc694\n\n## \ud544\uc218 \uc139\uc158 \uad6c\uc131 (H2 \uae30\uc900)\n\n| \uc139\uc158 (H2) | \ucd5c\uc18c \uae00\uc790 \uc218 | \ud544\uc218 \ub0b4\uc6a9 |\n|---|---|---|\n| {\ud0a4\uc6cc\ub4dc}\ub780? | 300\uc790 | \ud575\uc2ec \uc815\uc758 \ud55c \ubb38\uc7a5 + \ubd80\uc5f0 \uc124\uba85 2~3\ubb38\uc7a5, \uc65c \uc911\uc694\ud55c\uc9c0 \ub9e5\ub77d |\n| \uc65c \uc911\uc694\ud55c\uc9c0 (Why) | 400\uc790 | \uc2e4\ubb34 \uc2dc\ub098\ub9ac\uc624 2\uac1c \uc774\uc0c1, \ub3c4\uc785 \uc804/\ud6c4 \ube44\uad50 \ub610\ub294 \ubbf8\uc0ac\uc6a9 \uc2dc \ub9ac\uc2a4\ud06c |\n| \uc791\ub3d9 \uc6d0\ub9ac | 500\uc790 | 3~5\ub2e8\uacc4\ub85c \uc124\uba85, \uac01 \ub2e8\uacc4\ub9c8\ub2e4 \uae30\uc220\uc801 \uc138\ubd80\uc0ac\ud56d \ud3ec\ud568 |\n| \uc2e4\ubb34 \uc801\uc6a9 \uac00\uc774\ub4dc | 400\uc790 | \uad6c\uccb4\uc801 \ub3c4\uad6c\uba85, \uc124\uc815\uac12, CLI \uba85\ub839\uc5b4, \ud658\uacbd\ubcc4(\uc628\ud504\ub808\ubbf8\uc2a4/\ud074\ub77c\uc6b0\ub4dc) \ucc28\uc774 |\n| \uae30\uc5c5 \ud658\uacbd \uc801\uc6a9 \uc0ac\ub840 | 300\uc790 | AD/Azure AD/AWS \ub4f1 \uad6c\uccb4\uc801 \uc2dc\ub098\ub9ac\uc624 2~3\uac1c, \uc2e4\ubb34 \uc608\uc2dc |\n| \uc7a5\uc810\uacfc \ud55c\uacc4 | 300\uc790 | \uc7a5\uc810 \ud14c\uc774\ube14\uacfc \ud55c\uacc4 \ud14c\uc774\ube14\uc744 **\ubcc4\ub3c4\ub85c \ubd84\ub9ac** (\uac01 3\ud589 \uc774\uc0c1), \ube44\uad50\ud45c \ub610\ub294 \uccb4\ud06c\ub9ac\uc2a4\ud2b8 1\uac1c \uc774\uc0c1 |\n| FAQ | 200\uc790 | 3\uac1c \uc774\uc0c1, \uac01 \ub2f5\ubcc0 80\uc790 \uc774\uc0c1 |\n\n## SERP \ub370\uc774\ud130 \ud65c\uc6a9 \uc9c0\uce68\n\n- \uc81c\uacf5\ub41c SERP \ub370\uc774\ud130(\uac80\uc0c9 \uc2a4\ub2c8\ud3ab, People Also Ask, \uad00\ub828 \uac80\uc0c9\uc5b4)\ub97c \ucc38\uace0\ud558\uc5ec \ucf58\ud150\uce20 \uae4a\uc774\ub97c \ud655\ubcf4\ud558\uc138\uc694\n- People Also Ask \uc9c8\ubb38\uc740 FAQ \uc139\uc158\uc5d0 \ubc18\uc601\ud558\uc138\uc694\n- \uad00\ub828 \uac80\uc0c9\uc5b4\ub294 \ubcf8\ubb38\uc5d0\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc5b8\uae09\ud558\uc138\uc694\n- SERP \uc0c1\uc704 \ucf58\ud150\uce20\uc5d0\uc11c \ub2e4\ub8e8\ub294 \uc8fc\uc81c\ub97c \ube60\uc9d0\uc5c6\uc774 \ucee4\ubc84\ud558\uc138\uc694\n- SERP \uc0c1\uc704 \uacb0\uacfc\ub97c \ucc38\uace0\ud558\ub418 \uadf8\ub300\ub85c \ubcf5\uc0ac\ud558\uc9c0 \ub9d0 \uac83\n- \uc778\ub77c\uc778 \ucd9c\ucc98\ub294 '[\ucd9c\ucc98\uba85](URL)' \ud615\ud0dc\ub85c \uc0bd\uc785\ud558\uc138\uc694\n\n## \ucc38\uc870 URL \uaddc\uce59 (\ud544\uc218)\n\n- **references \ud544\ub4dc**: \ubc18\ub4dc\uc2dc SERP \ub370\uc774\ud130\uc5d0 \ud3ec\ud568\ub41c \uc2e4\uc81c URL\ub9cc \uc0ac\uc6a9\ud558\uc138\uc694. URL\uc744 \ucd94\uce21\ud558\uac70\ub098 \uae30\uc5b5\uc5d0 \uc758\uc874\ud558\uc5ec \uc791\uc131\ud558\uc9c0 \ub9c8\uc138\uc694\n- **\uc778\ub77c\uc778 \ucd9c\ucc98 URL**: SERP \ub370\uc774\ud130\uc758 \"URL:\" \ud56d\ubaa9\uc5d0\uc11c \uac00\uc838\uc624\uc138\uc694. user \uba54\uc2dc\uc9c0\uc758 \"\ucc38\uc870 \uac00\ub2a5 URL \ud480\" \uc139\uc158 \ucc38\uace0\n- **\uacf5\uc2dd \ubb38\uc11c \uc6b0\uc120**: SERP URL \uc911 \uacf5\uc2dd \ubb38\uc11c \ub3c4\uba54\uc778(learn.microsoft.com, docs.aws.amazon.com, cloud.google.com, developer.mozilla.org \ub4f1)\uc774 \uc788\uc73c\uba74 \uc6b0\uc120 \uc0ac\uc6a9\ud558\uc138\uc694\n- **URL\uc744 \ubaa8\ub97c \ub54c**: URL \uc5c6\uc774 \ucd9c\ucc98\uba85\ub9cc \ud14d\uc2a4\ud2b8\ub85c \uae30\uc7ac\ud558\uc138\uc694 (\uc608: \"Microsoft Learn \uacf5\uc2dd \ubb38\uc11c \ucc38\uace0\"). \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 URL\uc744 \ub9cc\ub4e4\uc5b4\ub0b4\uc9c0 \ub9c8\uc138\uc694\n\n## \ud488\uc9c8 \uc790\uac00 \uac80\uc99d \uccb4\ud06c\ub9ac\uc2a4\ud2b8\n\n\uc791\uc131 \uc644\ub8cc \ud6c4 \uc544\ub798 \ud56d\ubaa9\uc744 \ud655\uc778\ud558\uc138\uc694:\n- [ ] H2 \ud5e4\ub529\uc774 4\uac1c \uc774\uc0c1\uc778\uac00?\n- [ ] \ub9c8\ud06c\ub2e4\uc6b4 \ud14c\uc774\ube14\uc774 1\uac1c \uc774\uc0c1 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] FAQ\uac00 3\uac1c \uc774\uc0c1\uc774\uace0 \uac01 \ub2f5\ubcc0\uc774 80\uc790 \uc774\uc0c1\uc778\uac00?\n- [ ] \uc804\uccb4 \ubcf8\ubb38\uc774 3,000\uc790 \uc774\uc0c1\uc778\uac00?\n- [ ] \uc2e4\ubb34 \uc2dc\ub098\ub9ac\uc624\uac00 2\uac1c \uc774\uc0c1 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \uc2e4\ubb34 \uc801\uc6a9 \uac00\uc774\ub4dc\uc5d0 \uad6c\uccb4\uc801 \ub3c4\uad6c\uba85/\uba85\ub839\uc5b4\uac00 \uc788\ub294\uac00?\n- [ ] \uc778\ub77c\uc778 \ucd9c\ucc98\uac00 1\uac1c \uc774\uc0c1 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \uae30\uc5c5 \ud658\uacbd \uc801\uc6a9 \uc0ac\ub840\uac00 \uad6c\uccb4\uc801\uc778\uac00?\n- [ ] internal_link_keywords\uc5d0 \ud574\ub2f9\ud558\ub294 \ud0a4\uc6cc\ub4dc\uac00 \ubcf8\ubb38\uc5d0\uc11c **\uad75\uac8c** \ud45c\uc2dc\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] [MERMAID]...[/MERMAID] \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc774 2\uac1c \uc774\uc0c1 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] Mermaid \ub178\ub4dc \ub808\uc774\ube14\uc774 \uc601\ubb38\uc73c\ub85c \uc791\uc131\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \ucf54\ub4dc\ube14\ub85d\uc774 1\uac1c \uc774\uc0c1\uc774\uace0, \ubaa8\ub450 \uc5b8\uc5b4 \ud0dc\uadf8\uac00 \uc788\ub294\uac00?\n- [ ] \uc7a5\uc810 \ud14c\uc774\ube14\uacfc \ud55c\uacc4 \ud14c\uc774\ube14\uc774 \ubd84\ub9ac\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \\`<!-- IMAGE: ... -->\\` \ub9c8\ucee4\uac00 1~2\uac1c \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00? (FAQ/Mermaid \uc139\uc158 \uc81c\uc678)\n- [ ] references \ud544\ub4dc\uc758 \ubaa8\ub4e0 URL\uc774 SERP \ub370\uc774\ud130\uc5d0\uc11c \uac00\uc838\uc628 \uac83\uc778\uac00?\n- [ ] \uc778\ub77c\uc778 \ucd9c\ucc98 URL\uc774 \uc2e4\uc81c \uc874\uc7ac\ud558\ub294 URL\uc778\uac00? (\ucd94\uce21 URL \uc0ac\uc6a9 \uae08\uc9c0)\n\n## \uae08\uc9c0 \uc0ac\ud56d\n\n- \uc2e4\uc81c \uae30\uc5c5\uba85\uc740 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub418, \uac00\uc0c1 \uc2dc\ub098\ub9ac\uc624\uc5d0\uc11c\ub294 'example-corp.com' \ub4f1 \uc124\uba85\uc801 \ub3c4\uba54\uc778\uba85 \uc0ac\uc6a9\n- \ube44\ud655\uc778 \uc815\ubcf4 \uc791\uc131 \uae08\uc9c0\n\n## \ucd9c\ub825 \ud615\uc2dd\n\n\ubc18\ub4dc\uc2dc \uc544\ub798 JSON \ud615\uc2dd\uc73c\ub85c\ub9cc \uc751\ub2f5\ud558\uc138\uc694. JSON \uc678 \ud14d\uc2a4\ud2b8\ub97c \ud3ec\ud568\ud558\uc9c0 \ub9c8\uc138\uc694.\n\n\\`\\`\\`json\n{\n \"title\": \"SEO \ucd5c\uc801\ud654\ub41c \uc81c\ubaa9 (50~60\uc790)\",\n \"meta_description\": \"120~155\uc790 \uba54\ud0c0 \uc124\uba85 (\ud0a4\uc6cc\ub4dc \uc790\uc5f0 \ud3ec\ud568)\",\n \"faq_schema\": [\n {\"question\": \"\uc9c8\ubb381\", \"answer\": \"\ub2f5\ubcc01 (80\uc790 \uc774\uc0c1)\"},\n {\"question\": \"\uc9c8\ubb382\", \"answer\": \"\ub2f5\ubcc02 (80\uc790 \uc774\uc0c1)\"},\n {\"question\": \"\uc9c8\ubb383\", \"answer\": \"\ub2f5\ubcc03 (80\uc790 \uc774\uc0c1)\"}\n ],\n \"references\": [\"\ucc38\uace0\uc790\ub8cc URL \ub610\ub294 \ubb38\uc11c\uba85\"],\n \"tags\": [\"\ud0dc\uadf81\", \"\ud0dc\uadf82\", \"\ud0dc\uadf83\", \"\ud0dc\uadf84\", \"\ud0dc\uadf85\"],\n \"internal_link_keywords\": [\"\uad00\ub828 \ud0a4\uc6cc\ub4dc1\", \"\uad00\ub828 \ud0a4\uc6cc\ub4dc2\", \"\uad00\ub828 \ud0a4\uc6cc\ub4dc3\"],\n \"content\": \"\ub9c8\ud06c\ub2e4\uc6b4 \ubcf8\ubb38 \uc804\uccb4 (H2/H3 \ud5e4\ub529, \ud45c, \ucf54\ub4dc \ube14\ub85d \ud3ec\ud568, \ucd5c\uc18c 3000\uc790 \uc774\uc0c1)\"\n}\n\\`\\`\\``;\nconst PROMPT_B = `# \ud504\ub86c\ud504\ud2b8 B: IT \ud2b8\ub80c\ub4dc/\ube44\uad50 \ubd84\uc11d\n\n\ub2f9\uc2e0\uc740 B2B IT \uc778\ud504\ub77c \uc804\ubb38 \uae30\uc220 \ube14\ub85c\uac70\uc785\ub2c8\ub2e4.\n\uc544\ub798 \ud0a4\uc6cc\ub4dc\uc5d0 \ub300\ud574 \ube44\uad50 \ubd84\uc11d \uae30\uc220 \ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud558\uc138\uc694.\n\n## \uc791\uc131 \uaddc\uce59\n\n1. **\ub300\uc0c1 \ub3c5\uc790**: IT \uc778\ud504\ub77c \uc758\uc0ac\uacb0\uc815\uc790 \ubc0f \uc2e4\ubb34\uc790\n2. **\ud1a4**: \uac1d\uad00\uc801 \ube44\uad50 \ubd84\uc11d, \uc911\ub9bd\uc801 \uc2dc\uac01\n3. **\ubd84\ub7c9**: \ubcf8\ubb38 \ucd5c\uc18c 3,000\uc790 \uc774\uc0c1 (\ub9c8\ud06c\ub2e4\uc6b4 \uae30\uc900, 4,000\uc790 \uad8c\uc7a5)\n4. **\uad6c\uc870**: \uac1c\uc694 \u2192 \uac01 \uae30\uc220 \uc124\uba85 \u2192 \uc2ec\uce35 \ube44\uad50 \ubd84\uc11d \u2192 \uc120\ud0dd \uac00\uc774\ub4dc \u2192 \ub9c8\uc774\uadf8\ub808\uc774\uc158/\ub3c4\uc785 \uc2dc\ub098\ub9ac\uc624 \u2192 FAQ\n5. **\ub2e4\uc774\uc5b4\uadf8\ub7a8**: \uac01 H2 \uc139\uc158(FAQ \uc81c\uc678) \uc911 \uc2dc\uac01\ud654\uac00 \uc720\uc6a9\ud55c \uacf3\uc5d0 Mermaid \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0bd\uc785\ud558\uc138\uc694 (\ucd5c\uc18c 2\uac1c). **\ubc18\ub4dc\uc2dc [MERMAID]...[/MERMAID] \ub9c8\ucee4\ub85c \uac10\uc2f8\uc138\uc694** (\ud2b8\ub9ac\ud50c \ubc31\ud2f1 \\`\\`\\`mermaid \uc0ac\uc6a9 \uae08\uc9c0). \ub2e4\uc774\uc5b4\uadf8\ub7a8 \uc720\ud615\uc740 graph TD, sequenceDiagram, flowchart LR \ub4f1 \uc790\uc720\ub86d\uac8c \uc120\ud0dd\ud558\ub418, \ub178\ub4dc \ub808\uc774\ube14\uc740 \uc601\ubb38\uc73c\ub85c \uc791\uc131\ud558\uc138\uc694.\n6. **\ucf54\ub4dc \uc608\uc2dc**: \uac01 \uae30\uc220\uc758 \uc124\uc815/\uc0ac\uc6a9 \uc608\uc2dc \ucf54\ub4dc\ub97c 1\uac1c \uc774\uc0c1 \ud3ec\ud568\ud558\uc138\uc694. \ucf54\ub4dc\ube14\ub85d\uc5d0\ub294 \ubc18\ub4dc\uc2dc \uc5b8\uc5b4 \ud0dc\uadf8(\\`\\`\\`yaml, \\`\\`\\`bash \ub4f1)\ub97c \ubd99\uc774\uc138\uc694\n7. **\uc139\uc158 \uc774\ubbf8\uc9c0**: Mermaid \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc774 \uc5c6\ub294 H2 \uc139\uc158 \uc911 \uc2dc\uac01\uc801 \ubcf4\uac15\uc774 \ud544\uc694\ud55c \uacf3\uc5d0 \\`<!-- IMAGE: \uc601\ubb38 \uac80\uc0c9 \ud0a4\uc6cc\ub4dc -->\\` \ub9c8\ucee4\ub97c \uc0bd\uc785\ud558\uc138\uc694 (\ucd5c\uc18c 1\uac1c, \ucd5c\ub300 2\uac1c). \ud0a4\uc6cc\ub4dc\ub294 \ud574\ub2f9 \uc139\uc158 \uc8fc\uc81c\ub97c \uc601\ubb38 2~4\ub2e8\uc5b4\ub85c \ud45c\ud604 (\uc608: \"server rack data center\", \"network security firewall\"). FAQ \uc139\uc158\uc5d0\ub294 \uc0bd\uc785 \uae08\uc9c0.\n8. **\ucd5c\uc2e0\uc131 \ud544\uc218**:\n - user \uba54\uc2dc\uc9c0\uc758 \"\uc791\uc131 \uae30\uc900\uc77c\"\uc744 \ud655\uc778\ud558\uace0 \ud574\ub2f9 \uc2dc\uc810 \uae30\uc900\uc73c\ub85c \uc791\uc131\ud558\uc138\uc694\n - \"2024\ub144\", \"2023\ub144\" \ub4f1 \uacfc\uac70 \uc5f0\ub3c4 \ub370\uc774\ud130\ub294 \uc0ac\uc6a9\ud558\uc9c0 \ub9c8\uc138\uc694. \ubc18\ub4dc\uc2dc \ud604\uc7ac \uc5f0\ub3c4(user \uba54\uc2dc\uc9c0 \ucc38\uace0) \uae30\uc900 \uc815\ubcf4\ub97c \uc0ac\uc6a9\ud558\uc138\uc694\n - \ubc84\uc804 \uc815\ubcf4, \uac00\uaca9, \uae30\ub2a5 \ube44\uad50\ub294 \ucd5c\uc2e0 \ubc84\uc804 \uae30\uc900\uc73c\ub85c \uc791\uc131\ud558\uc138\uc694\n - \"\uacf5\uc2dd \ubb38\uc11c \ubcf8\ubb38\" \uc139\uc158\uc774 \uc81c\uacf5\ub418\uba74 SERP \uc2a4\ub2c8\ud3ab\ubcf4\ub2e4 \uc6b0\uc120\ud558\uc5ec \ucc38\uace0\ud558\uc138\uc694. \uacf5\uc2dd \ubb38\uc11c\uc758 \uc815\ud655\ud55c \uc6a9\uc5b4, \ubc84\uc804, \uae30\ub2a5 \uc124\uba85\uc744 \uadf8\ub300\ub85c \ubc18\uc601\ud558\uc138\uc694\n - \uc81c\ubaa9\uc5d0 \uc5f0\ub3c4\ub97c \ud3ec\ud568\ud560 \ub54c\ub294 \ubc18\ub4dc\uc2dc \ud604\uc7ac \uc5f0\ub3c4\ub97c \uc0ac\uc6a9\ud558\uc138\uc694\n\n## \ud544\uc218 \uc139\uc158 \uad6c\uc131 (H2 \uae30\uc900)\n\n| \uc139\uc158 (H2) | \ucd5c\uc18c \uae00\uc790 \uc218 | \ud544\uc218 \ub0b4\uc6a9 |\n|---|---|---|\n| \uac1c\uc694 | 300\uc790 | \ud575\uc2ec \ucc28\uc774 \uc694\uc57d 3~4\ubb38\uc7a5, \uc77d\uc5b4\uc57c \ud560 \uc774\uc720, \ube44\uad50 \ud310\ub2e8\uc5d0 \ud544\uc694\ud55c \uc0ac\uc804 \uc9c0\uc2dd |\n| {\uae30\uc220A} \uc0c1\uc138 | 500\uc790 | \uc815\uc758, \uc544\ud0a4\ud14d\ucc98 \uac1c\uc694, \ud575\uc2ec \uae30\ub2a5 3\uac00\uc9c0 \uc774\uc0c1, \ub300\ud45c \uc0ac\uc6a9 \uc0ac\ub840, \uc2e4\uc81c \uc124\uc815/\uad6c\uc131 \uc608\uc2dc |\n| {\uae30\uc220B} \uc0c1\uc138 | 500\uc790 | \uc815\uc758, \uc544\ud0a4\ud14d\ucc98 \uac1c\uc694, \ud575\uc2ec \uae30\ub2a5 3\uac00\uc9c0 \uc774\uc0c1, \ub300\ud45c \uc0ac\uc6a9 \uc0ac\ub840, \uc2e4\uc81c \uc124\uc815/\uad6c\uc131 \uc608\uc2dc |\n| \uc2ec\uce35 \ube44\uad50 \ubd84\uc11d | \u2014 | \ube44\uad50\ud45c 10\ud589 \uc774\uc0c1 (\uae30\ub2a5/\uc131\ub2a5/\ube44\uc6a9/\ud655\uc7a5\uc131/\ubcf4\uc548/\uad00\ub9ac \ud3b8\uc758\uc131/\ub3c4\uc785 \ub09c\uc774\ub3c4/\ud559\uc2b5\uace1\uc120/\uc0dd\ud0dc\uacc4/\ucee4\ubba4\ub2c8\ud2f0), \uac01 \ud56d\ubaa9\uc5d0 1~2\ubb38\uc7a5 \ud574\uc11d |\n| A\ub97c \uc120\ud0dd\ud574\uc57c \ud560 \ub54c vs B\ub97c \uc120\ud0dd\ud574\uc57c \ud560 \ub54c | 400\uc790 | \uad6c\uccb4\uc801 \uc2dc\ub098\ub9ac\uc624 \uae30\ubc18 \ucd94\ucc9c (SMB/Enterprise/\uc2a4\ud0c0\ud2b8\uc5c5), \uc6cc\ud06c\ub85c\ub4dc \uc720\ud615\ubcc4 \ucd94\ucc9c |\n| \ub9c8\uc774\uadf8\ub808\uc774\uc158/\ub3c4\uc785 \uc2dc\ub098\ub9ac\uc624 | 300\uc790 | A\u2192B \ub610\ub294 B\u2192A \uc804\ud658 \uc2dc \uace0\ub824\uc0ac\ud56d, \ub2e8\uacc4\ubcc4 \ub3c4\uc785 \ub85c\ub4dc\ub9f5, \uc608\uc0c1 \uc18c\uc694 \uae30\uac04 |\n| FAQ | 200\uc790 | 3\uac1c \uc774\uc0c1, \uac01 \ub2f5\ubcc0 80\uc790 \uc774\uc0c1 |\n\n## SERP \ub370\uc774\ud130 \ud65c\uc6a9 \uc9c0\uce68\n\n- \uc81c\uacf5\ub41c SERP \ub370\uc774\ud130(\uac80\uc0c9 \uc2a4\ub2c8\ud3ab, People Also Ask, \uad00\ub828 \uac80\uc0c9\uc5b4)\ub97c \ucc38\uace0\ud558\uc5ec \ucf58\ud150\uce20 \uae4a\uc774\ub97c \ud655\ubcf4\ud558\uc138\uc694\n- People Also Ask \uc9c8\ubb38\uc740 FAQ \uc139\uc158\uc5d0 \ubc18\uc601\ud558\uc138\uc694\n- \uad00\ub828 \uac80\uc0c9\uc5b4\ub294 \ubcf8\ubb38\uc5d0\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc5b8\uae09\ud558\uc138\uc694\n- SERP \uc0c1\uc704 \ucf58\ud150\uce20\uc5d0\uc11c \ub2e4\ub8e8\ub294 \ube44\uad50 \uad00\uc810\uc744 \ube60\uc9d0\uc5c6\uc774 \ucee4\ubc84\ud558\uc138\uc694\n- SERP \uc0c1\uc704 \uacb0\uacfc\ub97c \ucc38\uace0\ud558\ub418 \uadf8\ub300\ub85c \ubcf5\uc0ac\ud558\uc9c0 \ub9d0 \uac83\n- \uc778\ub77c\uc778 \ucd9c\ucc98\ub294 '[\ucd9c\ucc98\uba85](URL)' \ud615\ud0dc\ub85c \uc0bd\uc785\ud558\uc138\uc694\n\n## \ucc38\uc870 URL \uaddc\uce59 (\ud544\uc218)\n\n- **references \ud544\ub4dc**: \ubc18\ub4dc\uc2dc SERP \ub370\uc774\ud130\uc5d0 \ud3ec\ud568\ub41c \uc2e4\uc81c URL\ub9cc \uc0ac\uc6a9\ud558\uc138\uc694. URL\uc744 \ucd94\uce21\ud558\uac70\ub098 \uae30\uc5b5\uc5d0 \uc758\uc874\ud558\uc5ec \uc791\uc131\ud558\uc9c0 \ub9c8\uc138\uc694\n- **\uc778\ub77c\uc778 \ucd9c\ucc98 URL**: SERP \ub370\uc774\ud130\uc758 \"URL:\" \ud56d\ubaa9\uc5d0\uc11c \uac00\uc838\uc624\uc138\uc694. user \uba54\uc2dc\uc9c0\uc758 \"\ucc38\uc870 \uac00\ub2a5 URL \ud480\" \uc139\uc158 \ucc38\uace0\n- **\uacf5\uc2dd \ubb38\uc11c \uc6b0\uc120**: SERP URL \uc911 \uacf5\uc2dd \ubb38\uc11c \ub3c4\uba54\uc778(learn.microsoft.com, docs.aws.amazon.com, cloud.google.com, developer.mozilla.org \ub4f1)\uc774 \uc788\uc73c\uba74 \uc6b0\uc120 \uc0ac\uc6a9\ud558\uc138\uc694\n- **URL\uc744 \ubaa8\ub97c \ub54c**: URL \uc5c6\uc774 \ucd9c\ucc98\uba85\ub9cc \ud14d\uc2a4\ud2b8\ub85c \uae30\uc7ac\ud558\uc138\uc694 (\uc608: \"Microsoft Learn \uacf5\uc2dd \ubb38\uc11c \ucc38\uace0\"). \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 URL\uc744 \ub9cc\ub4e4\uc5b4\ub0b4\uc9c0 \ub9c8\uc138\uc694\n\n## \ud488\uc9c8 \uc790\uac00 \uac80\uc99d \uccb4\ud06c\ub9ac\uc2a4\ud2b8\n\n\uc791\uc131 \uc644\ub8cc \ud6c4 \uc544\ub798 \ud56d\ubaa9\uc744 \ud655\uc778\ud558\uc138\uc694:\n- [ ] H2 \ud5e4\ub529\uc774 6\uac1c \uc774\uc0c1\uc778\uac00?\n- [ ] \uc2ec\uce35 \ube44\uad50\ud45c\uac00 10\ud589 \uc774\uc0c1\uc778\uac00?\n- [ ] \uac01 \uae30\uc220 \uc124\uba85\uc774 500\uc790 \uc774\uc0c1\uc778\uac00?\n- [ ] FAQ\uac00 3\uac1c \uc774\uc0c1\uc774\uace0 \uac01 \ub2f5\ubcc0\uc774 80\uc790 \uc774\uc0c1\uc778\uac00?\n- [ ] \uc804\uccb4 \ubcf8\ubb38\uc774 3,000\uc790 \uc774\uc0c1\uc778\uac00?\n- [ ] \uc120\ud0dd \uac00\uc774\ub4dc\uc5d0 \uae30\uc5c5 \uaddc\ubaa8\ubcc4(SMB/Enterprise/\uc2a4\ud0c0\ud2b8\uc5c5) \ucd94\ucc9c\uc774 \uc788\ub294\uac00?\n- [ ] \ub9c8\uc774\uadf8\ub808\uc774\uc158/\ub3c4\uc785 \uc2dc\ub098\ub9ac\uc624\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \uc778\ub77c\uc778 \ucd9c\ucc98\uac00 1\uac1c \uc774\uc0c1 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \uc6cc\ud06c\ub85c\ub4dc \uc720\ud615\ubcc4 \ucd94\ucc9c\uc774 \uc788\ub294\uac00?\n- [ ] internal_link_keywords\uc5d0 \ud574\ub2f9\ud558\ub294 \ud0a4\uc6cc\ub4dc\uac00 \ubcf8\ubb38\uc5d0\uc11c **\uad75\uac8c** \ud45c\uc2dc\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] [MERMAID]...[/MERMAID] \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc774 2\uac1c \uc774\uc0c1 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] Mermaid \ub178\ub4dc \ub808\uc774\ube14\uc774 \uc601\ubb38\uc73c\ub85c \uc791\uc131\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \uac01 \uae30\uc220\ubcc4 \ucf54\ub4dc \uc608\uc2dc\uac00 1\uac1c \uc774\uc0c1 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \\`<!-- IMAGE: ... -->\\` \ub9c8\ucee4\uac00 1~2\uac1c \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00? (FAQ/Mermaid \uc139\uc158 \uc81c\uc678)\n- [ ] references \ud544\ub4dc\uc758 \ubaa8\ub4e0 URL\uc774 SERP \ub370\uc774\ud130\uc5d0\uc11c \uac00\uc838\uc628 \uac83\uc778\uac00?\n- [ ] \uc778\ub77c\uc778 \ucd9c\ucc98 URL\uc774 \uc2e4\uc81c \uc874\uc7ac\ud558\ub294 URL\uc778\uac00? (\ucd94\uce21 URL \uc0ac\uc6a9 \uae08\uc9c0)\n\n## \uae08\uc9c0 \uc0ac\ud56d\n\n- \uc2e4\uc81c \uae30\uc5c5\uba85\uc740 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub418, \uac00\uc0c1 \uc2dc\ub098\ub9ac\uc624\uc5d0\uc11c\ub294 'example-corp.com' \ub4f1 \uc124\uba85\uc801 \ub3c4\uba54\uc778\uba85 \uc0ac\uc6a9\n- \ud2b9\uc815 \ubca4\ub354 \ud3b8\ud5a5 \uae08\uc9c0\n\n## \ucd9c\ub825 \ud615\uc2dd\n\n\ubc18\ub4dc\uc2dc \uc544\ub798 JSON \ud615\uc2dd\uc73c\ub85c\ub9cc \uc751\ub2f5\ud558\uc138\uc694. JSON \uc678 \ud14d\uc2a4\ud2b8\ub97c \ud3ec\ud568\ud558\uc9c0 \ub9c8\uc138\uc694.\n\n\\`\\`\\`json\n{\n \"title\": \"SEO \ucd5c\uc801\ud654\ub41c \ube44\uad50 \uc81c\ubaa9 (50~60\uc790, 'vs' \ub610\ub294 '\ube44\uad50' \ud3ec\ud568)\",\n \"meta_description\": \"120~155\uc790 \uba54\ud0c0 \uc124\uba85 (\ub450 \uae30\uc220\uba85 + \ube44\uad50 \ud0a4\uc6cc\ub4dc \ud3ec\ud568)\",\n \"faq_schema\": [\n {\"question\": \"\uc9c8\ubb381\", \"answer\": \"\ub2f5\ubcc01 (80\uc790 \uc774\uc0c1)\"},\n {\"question\": \"\uc9c8\ubb382\", \"answer\": \"\ub2f5\ubcc02 (80\uc790 \uc774\uc0c1)\"},\n {\"question\": \"\uc9c8\ubb383\", \"answer\": \"\ub2f5\ubcc03 (80\uc790 \uc774\uc0c1)\"}\n ],\n \"references\": [\"\ucc38\uace0\uc790\ub8cc URL \ub610\ub294 \ubb38\uc11c\uba85\"],\n \"tags\": [\"\ud0dc\uadf81\", \"\ud0dc\uadf82\", \"\ud0dc\uadf83\", \"\ud0dc\uadf84\", \"\ud0dc\uadf85\"],\n \"internal_link_keywords\": [\"\uad00\ub828 \ud0a4\uc6cc\ub4dc1\", \"\uad00\ub828 \ud0a4\uc6cc\ub4dc2\", \"\uad00\ub828 \ud0a4\uc6cc\ub4dc3\"],\n \"content\": \"\ub9c8\ud06c\ub2e4\uc6b4 \ubcf8\ubb38 \uc804\uccb4 (H2/H3 \ud5e4\ub529, \ube44\uad50\ud45c, \uc120\ud0dd \uac00\uc774\ub4dc \ud3ec\ud568, \ucd5c\uc18c 3000\uc790 \uc774\uc0c1)\"\n}\n\\`\\`\\``;\nconst PROMPT_C = `# \ud504\ub86c\ud504\ud2b8 C: \uc2e4\ubb34 \ud2b8\ub7ec\ube14\uc288\ud305 \uac00\uc774\ub4dc\n\n\ub2f9\uc2e0\uc740 B2B IT \uc778\ud504\ub77c \uc804\ubb38 \uae30\uc220 \ube14\ub85c\uac70\uc785\ub2c8\ub2e4.\n\uc544\ub798 \uc5d0\ub7ec/\uc774\uc288\uc5d0 \ub300\ud574 \ud2b8\ub7ec\ube14\uc288\ud305 \uac00\uc774\ub4dc \ube14\ub85c\uadf8 \uae00\uc744 \uc791\uc131\ud558\uc138\uc694.\n\n## \uc791\uc131 \uaddc\uce59\n\n1. **\ub300\uc0c1 \ub3c5\uc790**: \ud574\ub2f9 \uc5d0\ub7ec\ub97c \uac80\uc0c9\ud558\ub294 IT \uad00\ub9ac\uc790/\uc5d4\uc9c0\ub2c8\uc5b4\n2. **\ud1a4**: \uc2e4\ubb34 \uce5c\ud654\uc801, \ub2e8\uacc4\ubcc4 \ud574\uacb0 \uac00\uc774\ub4dc\n3. **\ubd84\ub7c9**: \ubcf8\ubb38 \ucd5c\uc18c 3,000\uc790 \uc774\uc0c1 (\ub9c8\ud06c\ub2e4\uc6b4 \uae30\uc900, 4,500\uc790 \uad8c\uc7a5)\n4. **\uad6c\uc870**: \uc5d0\ub7ec \ud604\uc0c1 \u2192 \uc6d0\uc778 \ubd84\uc11d \u2192 \ud574\uacb0 \ubc29\ubc95 (\ub2e8\uacc4\ubcc4) \u2192 \uc608\ubc29 \uc870\uce58 \u2192 \uad00\ub828 \uc5d0\ub7ec/\ucc38\uace0 \uc790\ub8cc \u2192 FAQ\n5. **\ub2e4\uc774\uc5b4\uadf8\ub7a8**: \uac01 H2 \uc139\uc158(FAQ \uc81c\uc678) \uc911 \uc2dc\uac01\ud654\uac00 \uc720\uc6a9\ud55c \uacf3\uc5d0 Mermaid \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc0bd\uc785\ud558\uc138\uc694 (\ucd5c\uc18c 2\uac1c). **\ubc18\ub4dc\uc2dc [MERMAID]...[/MERMAID] \ub9c8\ucee4\ub85c \uac10\uc2f8\uc138\uc694** (\ud2b8\ub9ac\ud50c \ubc31\ud2f1 \\`\\`\\`mermaid \uc0ac\uc6a9 \uae08\uc9c0). \ub2e4\uc774\uc5b4\uadf8\ub7a8 \uc720\ud615\uc740 graph TD, sequenceDiagram, flowchart LR \ub4f1 \uc790\uc720\ub86d\uac8c \uc120\ud0dd\ud558\ub418, \ub178\ub4dc \ub808\uc774\ube14\uc740 \uc601\ubb38\uc73c\ub85c \uc791\uc131\ud558\uc138\uc694.\n6. **\ucf54\ub4dc\ube14\ub85d \uc5b8\uc5b4 \ud0dc\uadf8**: \ubaa8\ub4e0 \ucf54\ub4dc\ube14\ub85d\uc5d0 \ubc18\ub4dc\uc2dc \uc5b8\uc5b4 \ud0dc\uadf8(\\`\\`\\`powershell, \\`\\`\\`bash, \\`\\`\\`yaml \ub4f1)\ub97c \ubd99\uc774\uc138\uc694. \uc2e4\ud589 \uc804\ud6c4 \ud655\uc778 \uba85\ub839\uc5b4\ub3c4 \ucf54\ub4dc\ube14\ub85d\uc73c\ub85c \uac10\uc2f8\uc138\uc694\n7. **\uc139\uc158 \uc774\ubbf8\uc9c0**: Mermaid \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc774 \uc5c6\ub294 H2 \uc139\uc158 \uc911 \uc2dc\uac01\uc801 \ubcf4\uac15\uc774 \ud544\uc694\ud55c \uacf3\uc5d0 \\`<!-- IMAGE: \uc601\ubb38 \uac80\uc0c9 \ud0a4\uc6cc\ub4dc -->\\` \ub9c8\ucee4\ub97c \uc0bd\uc785\ud558\uc138\uc694 (\ucd5c\uc18c 1\uac1c, \ucd5c\ub300 2\uac1c). \ud0a4\uc6cc\ub4dc\ub294 \ud574\ub2f9 \uc139\uc158 \uc8fc\uc81c\ub97c \uc601\ubb38 2~4\ub2e8\uc5b4\ub85c \ud45c\ud604 (\uc608: \"server rack data center\", \"network security firewall\"). FAQ \uc139\uc158\uc5d0\ub294 \uc0bd\uc785 \uae08\uc9c0.\n8. **\ucd5c\uc2e0\uc131 \ud544\uc218**:\n - user \uba54\uc2dc\uc9c0\uc758 \"\uc791\uc131 \uae30\uc900\uc77c\"\uc744 \ud655\uc778\ud558\uace0 \ud574\ub2f9 \uc2dc\uc810 \uae30\uc900\uc73c\ub85c \uc791\uc131\ud558\uc138\uc694\n - \"2024\ub144\", \"2023\ub144\" \ub4f1 \uacfc\uac70 \uc5f0\ub3c4 \ub370\uc774\ud130\ub294 \uc0ac\uc6a9\ud558\uc9c0 \ub9c8\uc138\uc694. \ubc18\ub4dc\uc2dc \ud604\uc7ac \uc5f0\ub3c4(user \uba54\uc2dc\uc9c0 \ucc38\uace0) \uae30\uc900 \uc815\ubcf4\ub97c \uc0ac\uc6a9\ud558\uc138\uc694\n - \ubc84\uc804 \uc815\ubcf4, \uac00\uaca9, \uae30\ub2a5 \ube44\uad50\ub294 \ucd5c\uc2e0 \ubc84\uc804 \uae30\uc900\uc73c\ub85c \uc791\uc131\ud558\uc138\uc694\n - \"\uacf5\uc2dd \ubb38\uc11c \ubcf8\ubb38\" \uc139\uc158\uc774 \uc81c\uacf5\ub418\uba74 SERP \uc2a4\ub2c8\ud3ab\ubcf4\ub2e4 \uc6b0\uc120\ud558\uc5ec \ucc38\uace0\ud558\uc138\uc694. \uacf5\uc2dd \ubb38\uc11c\uc758 \uc815\ud655\ud55c \uc6a9\uc5b4, \ubc84\uc804, \uae30\ub2a5 \uc124\uba85\uc744 \uadf8\ub300\ub85c \ubc18\uc601\ud558\uc138\uc694\n - \uc81c\ubaa9\uc5d0 \uc5f0\ub3c4\ub97c \ud3ec\ud568\ud560 \ub54c\ub294 \ubc18\ub4dc\uc2dc \ud604\uc7ac \uc5f0\ub3c4\ub97c \uc0ac\uc6a9\ud558\uc138\uc694\n\n## \ud544\uc218 \uc139\uc158 \uad6c\uc131 (H2 \uae30\uc900)\n\n| \uc139\uc158 (H2) | \ucd5c\uc18c \uae00\uc790 \uc218 | \ud544\uc218 \ub0b4\uc6a9 |\n|---|---|---|\n| \uc5d0\ub7ec \ud604\uc0c1 | 300\uc790 | \uc5d0\ub7ec \uba54\uc2dc\uc9c0\ub97c **\uc601\ubb38 \uc6d0\ubb38 + \ud55c\uae00 \ud574\uc11d** \ucf54\ub4dc\ube14\ub85d\uc73c\ub85c \uae30\uc7ac, \ubc1c\uc0dd \ud658\uacbd(OS/\ubc84\uc804/\uc0c1\ud669) \uc124\uba85, \uc2a4\ud06c\ub9b0\uc0f7 \ub300\uccb4 \ud14d\uc2a4\ud2b8 \uc124\uba85 |\n| \uc6d0\uc778 \ubd84\uc11d | 500\uc790 | H3\ub85c \uc6d0\uc778 3\uac00\uc9c0 \uc774\uc0c1, \uac01 \uc6d0\uc778 200\uc790 \uc774\uc0c1, \ube48\ub3c4\uc21c \uc815\ub82c, \uc6d0\uc778\ubcc4 \ud655\uc778 \uba85\ub839\uc5b4 \ud3ec\ud568 |\n| \ud574\uacb0 \ubc29\ubc95 | 800\uc790 | H3\ub85c \uac01 \uc6d0\uc778\ubcc4 \ud574\uacb0\ubc95, \ucf54\ub4dc\ube14\ub85d 4\uac1c \uc774\uc0c1, \uac01 \ud574\uacb0\ubc95\uc5d0 \uc2e4\ud589 \uc804 \ud655\uc778 \u2192 \uc870\uce58 \u2192 \uc2e4\ud589 \ud6c4 \uac80\uc99d 3\ub2e8\uacc4 \uad6c\uc870 |\n| \uc608\ubc29 \uc870\uce58 | 400\uc790 | \ubaa8\ub2c8\ud130\ub9c1 \uc2a4\ud06c\ub9bd\ud2b8 \uc608\uc2dc, \uc790\ub3d9\ud654 \ud301, \uc54c\ub9bc \uc124\uc815 \ubc29\ubc95, \uc815\uae30 \uc810\uac80 \uccb4\ud06c\ub9ac\uc2a4\ud2b8 |\n| \uad00\ub828 \uc5d0\ub7ec/\ucc38\uace0 \uc790\ub8cc | 200\uc790 | \ub3d9\uc77c \uc81c\ud488\uad70\uc758 \uad00\ub828 \uc5d0\ub7ec 2~3\uac1c \uc5b8\uae09, \uacf5\uc2dd \ubb38\uc11c \ub9c1\ud06c \uc548\ub0b4 |\n| FAQ | 200\uc790 | 3\uac1c \uc774\uc0c1, \uac01 \ub2f5\ubcc0 80\uc790 \uc774\uc0c1 |\n\n## SERP \ub370\uc774\ud130 \ud65c\uc6a9 \uc9c0\uce68\n\n- \uc81c\uacf5\ub41c SERP \ub370\uc774\ud130(\uac80\uc0c9 \uc2a4\ub2c8\ud3ab, People Also Ask, \uad00\ub828 \uac80\uc0c9\uc5b4)\ub97c \ucc38\uace0\ud558\uc5ec \ucf58\ud150\uce20 \uae4a\uc774\ub97c \ud655\ubcf4\ud558\uc138\uc694\n- People Also Ask \uc9c8\ubb38\uc740 FAQ \uc139\uc158\uc5d0 \ubc18\uc601\ud558\uc138\uc694\n- \uad00\ub828 \uac80\uc0c9\uc5b4\ub294 \ubcf8\ubb38\uc5d0\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc5b8\uae09\ud558\uc138\uc694\n- SERP \uc0c1\uc704 \ucf58\ud150\uce20\uc5d0\uc11c \ub2e4\ub8e8\ub294 \ud574\uacb0 \ubc29\ubc95\uc744 \ube60\uc9d0\uc5c6\uc774 \ucee4\ubc84\ud558\uc138\uc694\n- SERP \uc0c1\uc704 \uacb0\uacfc\ub97c \ucc38\uace0\ud558\ub418 \uadf8\ub300\ub85c \ubcf5\uc0ac\ud558\uc9c0 \ub9d0 \uac83\n- \uc778\ub77c\uc778 \ucd9c\ucc98\ub294 '[\ucd9c\ucc98\uba85](URL)' \ud615\ud0dc\ub85c \uc0bd\uc785\ud558\uc138\uc694\n\n## \ucc38\uc870 URL \uaddc\uce59 (\ud544\uc218)\n\n- **references \ud544\ub4dc**: \ubc18\ub4dc\uc2dc SERP \ub370\uc774\ud130\uc5d0 \ud3ec\ud568\ub41c \uc2e4\uc81c URL\ub9cc \uc0ac\uc6a9\ud558\uc138\uc694. URL\uc744 \ucd94\uce21\ud558\uac70\ub098 \uae30\uc5b5\uc5d0 \uc758\uc874\ud558\uc5ec \uc791\uc131\ud558\uc9c0 \ub9c8\uc138\uc694\n- **\uc778\ub77c\uc778 \ucd9c\ucc98 URL**: SERP \ub370\uc774\ud130\uc758 \"URL:\" \ud56d\ubaa9\uc5d0\uc11c \uac00\uc838\uc624\uc138\uc694. user \uba54\uc2dc\uc9c0\uc758 \"\ucc38\uc870 \uac00\ub2a5 URL \ud480\" \uc139\uc158 \ucc38\uace0\n- **\uacf5\uc2dd \ubb38\uc11c \uc6b0\uc120**: SERP URL \uc911 \uacf5\uc2dd \ubb38\uc11c \ub3c4\uba54\uc778(learn.microsoft.com, docs.aws.amazon.com, cloud.google.com, developer.mozilla.org \ub4f1)\uc774 \uc788\uc73c\uba74 \uc6b0\uc120 \uc0ac\uc6a9\ud558\uc138\uc694\n- **URL\uc744 \ubaa8\ub97c \ub54c**: URL \uc5c6\uc774 \ucd9c\ucc98\uba85\ub9cc \ud14d\uc2a4\ud2b8\ub85c \uae30\uc7ac\ud558\uc138\uc694 (\uc608: \"Microsoft Learn \uacf5\uc2dd \ubb38\uc11c \ucc38\uace0\"). \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 URL\uc744 \ub9cc\ub4e4\uc5b4\ub0b4\uc9c0 \ub9c8\uc138\uc694\n\n## \ud488\uc9c8 \uc790\uac00 \uac80\uc99d \uccb4\ud06c\ub9ac\uc2a4\ud2b8\n\n\uc791\uc131 \uc644\ub8cc \ud6c4 \uc544\ub798 \ud56d\ubaa9\uc744 \ud655\uc778\ud558\uc138\uc694:\n- [ ] H2 \ud5e4\ub529\uc774 5\uac1c \uc774\uc0c1\uc778\uac00?\n- [ ] \ucf54\ub4dc\ube14\ub85d\uc774 4\uac1c \uc774\uc0c1 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \ucf54\ub4dc\ube14\ub85d\uc5d0 \ubaa8\ub450 \uc5b8\uc5b4 \ud0dc\uadf8\uac00 \uc788\ub294\uac00? (\\`\\`\\`powershell, \\`\\`\\`bash \ub4f1)\n- [ ] \uc5d0\ub7ec \uba54\uc2dc\uc9c0\uac00 \uc601\ubb38 \uc6d0\ubb38 + \ud55c\uae00 \ud574\uc11d\uc73c\ub85c \uae30\uc7ac\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \uac01 \ud574\uacb0\ubc95\uc774 \uc2e4\ud589 \uc804 \ud655\uc778 \u2192 \uc870\uce58 \u2192 \uc2e4\ud589 \ud6c4 \uac80\uc99d 3\ub2e8\uacc4 \uad6c\uc870\uc778\uac00?\n- [ ] \uac01 \uc6d0\uc778\ubcc4 \ud574\uacb0\ubc95\uc5d0 \uc2e4\ud589 \uc804\ud6c4 \ud655\uc778 \uba85\ub839\uc5b4\uac00 \uc788\ub294\uac00?\n- [ ] FAQ\uac00 3\uac1c \uc774\uc0c1\uc774\uace0 \uac01 \ub2f5\ubcc0\uc774 80\uc790 \uc774\uc0c1\uc778\uac00?\n- [ ] \uc804\uccb4 \ubcf8\ubb38\uc774 3,000\uc790 \uc774\uc0c1\uc778\uac00?\n- [ ] \uc608\ubc29 \uc870\uce58\uc5d0 \uad6c\uccb4\uc801\uc778 \uc2a4\ud06c\ub9bd\ud2b8\ub098 \uc790\ub3d9\ud654 \ud301\uc774 \uc788\ub294\uac00?\n- [ ] \uad00\ub828 \uc5d0\ub7ec/\ucc38\uace0 \uc790\ub8cc \uc139\uc158\uc774 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \uc778\ub77c\uc778 \ucd9c\ucc98\uac00 1\uac1c \uc774\uc0c1 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] internal_link_keywords\uc5d0 \ud574\ub2f9\ud558\ub294 \ud0a4\uc6cc\ub4dc\uac00 \ubcf8\ubb38\uc5d0\uc11c **\uad75\uac8c** \ud45c\uc2dc\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] [MERMAID]...[/MERMAID] \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc774 2\uac1c \uc774\uc0c1 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] Mermaid \ub178\ub4dc \ub808\uc774\ube14\uc774 \uc601\ubb38\uc73c\ub85c \uc791\uc131\ub418\uc5b4 \uc788\ub294\uac00?\n- [ ] \\`<!-- IMAGE: ... -->\\` \ub9c8\ucee4\uac00 1~2\uac1c \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uac00? (FAQ/Mermaid \uc139\uc158 \uc81c\uc678)\n- [ ] references \ud544\ub4dc\uc758 \ubaa8\ub4e0 URL\uc774 SERP \ub370\uc774\ud130\uc5d0\uc11c \uac00\uc838\uc628 \uac83\uc778\uac00?\n- [ ] \uc778\ub77c\uc778 \ucd9c\ucc98 URL\uc774 \uc2e4\uc81c \uc874\uc7ac\ud558\ub294 URL\uc778\uac00? (\ucd94\uce21 URL \uc0ac\uc6a9 \uae08\uc9c0)\n\n## \uae08\uc9c0 \uc0ac\ud56d\n\n- \uc2e4\uc81c \uae30\uc5c5\uba85\uc740 \uc0ac\uc6a9 \uac00\ub2a5\ud558\ub418, \uac00\uc0c1 \uc2dc\ub098\ub9ac\uc624\uc5d0\uc11c\ub294 'example-corp.com' \ub4f1 \uc124\uba85\uc801 \ub3c4\uba54\uc778\uba85 \uc0ac\uc6a9\n- \ubbf8\ud655\uc778 \ud574\uacb0 \ubc29\ubc95 \uc791\uc131 \uae08\uc9c0\n- \ubcf4\uc548 \uc704\ud611\uc774 \ub418\ub294 \uba85\ub839\uc5b4 (\uc608: \ubc29\ud654\ubcbd \uc804\uccb4 \ud574\uc81c) \uae08\uc9c0\n\n## \ucd9c\ub825 \ud615\uc2dd\n\n\ubc18\ub4dc\uc2dc \uc544\ub798 JSON \ud615\uc2dd\uc73c\ub85c\ub9cc \uc751\ub2f5\ud558\uc138\uc694. JSON \uc678 \ud14d\uc2a4\ud2b8\ub97c \ud3ec\ud568\ud558\uc9c0 \ub9c8\uc138\uc694.\n\n\\`\\`\\`json\n{\n \"title\": \"SEO \ucd5c\uc801\ud654\ub41c \uc81c\ubaa9 (\uc5d0\ub7ec\ucf54\ub4dc \ub610\ub294 \uc99d\uc0c1 \ud3ec\ud568, 50~60\uc790)\",\n \"meta_description\": \"120~155\uc790 \uba54\ud0c0 \uc124\uba85 (\uc5d0\ub7ec\ucf54\ub4dc + \ud574\uacb0 \ud0a4\uc6cc\ub4dc \ud3ec\ud568)\",\n \"faq_schema\": [\n {\"question\": \"\uc9c8\ubb381\", \"answer\": \"\ub2f5\ubcc01 (80\uc790 \uc774\uc0c1)\"},\n {\"question\": \"\uc9c8\ubb382\", \"answer\": \"\ub2f5\ubcc02 (80\uc790 \uc774\uc0c1)\"},\n {\"question\": \"\uc9c8\ubb383\", \"answer\": \"\ub2f5\ubcc03 (80\uc790 \uc774\uc0c1)\"}\n ],\n \"references\": [\"Microsoft Learn URL\", \"\uacf5\uc2dd \ubb38\uc11c \ucc38\uace0\uc790\ub8cc\"],\n \"tags\": [\"\ud0dc\uadf81\", \"\ud0dc\uadf82\", \"\ud0dc\uadf83\", \"\ud0dc\uadf84\", \"\ud0dc\uadf85\"],\n \"internal_link_keywords\": [\"\uad00\ub828 \ud0a4\uc6cc\ub4dc1\", \"\uad00\ub828 \ud0a4\uc6cc\ub4dc2\", \"\uad00\ub828 \ud0a4\uc6cc\ub4dc3\"],\n \"content\": \"\ub9c8\ud06c\ub2e4\uc6b4 \ubcf8\ubb38 \uc804\uccb4 (\uc5d0\ub7ec \ucf54\ub4dc\ube14\ub85d, \ud574\uacb0 \uba85\ub839\uc5b4, \ub2e8\uacc4\ubcc4 \uac00\uc774\ub4dc \ud3ec\ud568, \ucd5c\uc18c 3000\uc790 \uc774\uc0c1)\"\n}\n\\`\\`\\``;\n\nlet systemPrompt;\nlet promptType;\n\nif (category.includes('\ube44\uad50') || category.includes('\ud2b8\ub80c\ub4dc') || keyword.includes('vs')) {\n systemPrompt = PROMPT_B;\n promptType = 'B';\n} else if (category.includes('\uc5d0\ub7ec') || category.includes('\ud2b8\ub7ec\ube14\uc288\ud305') || category.includes('\ud574\uacb0')) {\n systemPrompt = PROMPT_C;\n promptType = 'C';\n} else {\n systemPrompt = PROMPT_A;\n promptType = 'A';\n}\n\n// JSON \ud615\uc2dd \uc548\uc804 \uc9c0\uc2dc \ucd94\uac00\nconst jsonSafetyNote = `\n\n## \uc911\uc694: JSON \ud615\uc2dd \uaddc\uce59\n- \ubc18\ub4dc\uc2dc \uc720\ud6a8\ud55c JSON\uc744 \ucd9c\ub825\ud558\uc138\uc694.\n- content \ud544\ub4dc\uc758 \uc904\ubc14\uafc8\uc740 \ubc18\ub4dc\uc2dc \\\\n\uc73c\ub85c \uc774\uc2a4\ucf00\uc774\ud504\ud558\uc138\uc694.\n- \ubb38\uc790\uc5f4 \ub0b4 \ud070\ub530\uc634\ud45c\ub294 \ubc18\ub4dc\uc2dc \\\\\"\uc73c\ub85c \uc774\uc2a4\ucf00\uc774\ud504\ud558\uc138\uc694.\n- \ubb38\uc790\uc5f4 \ub0b4 \ubc31\uc2ac\ub798\uc2dc\ub294 \ubc18\ub4dc\uc2dc \\\\\\\\\ub85c \uc774\uc2a4\ucf00\uc774\ud504\ud558\uc138\uc694.\n- \ucf54\ub4dc \ube14\ub85d\uc758 \ubc31\ud2f1(\\`)\uc740 \uadf8\ub300\ub85c \uc0ac\uc6a9 \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc904\ubc14\uafc8\uc740 \\\\n\uc73c\ub85c \uc774\uc2a4\ucf00\uc774\ud504\ud558\uc138\uc694.\n`;\n\n// \uc791\uc131 \uae30\uc900\uc77c (\ucd5c\uc2e0\uc131 \uac15\ud654)\\nconst today = new Date();\\nconst yearMonth = `${today.getFullYear()}\ub144 ${today.getMonth() + 1}\uc6d4`;\\n\\n// \uacf5\uc2dd \ubb38\uc11c \ubcf8\ubb38 (Fetch Official Docs \ub178\ub4dc\uc5d0\uc11c \uc804\ub2ec)\\nconst officialDocsText = inputData.official_docs_text || '';\\nconst docsSection = officialDocsText\\n ? `\\n\\n## \uacf5\uc2dd \ubb38\uc11c \ubcf8\ubb38 (\ucd5c\uc6b0\uc120 \ucc38\uace0 \uc790\ub8cc)\\n${officialDocsText}`\\n : '';\\n\\n// SERP URL \ud480 \uad6c\uc131\nconst serpUrls = inputData.serp_urls || [];\nconst urlPoolText = serpUrls.length > 0\n ? serpUrls.map((url, i) => `${i + 1}. ${url}`).join('\\n')\n : '(SERP URL \uc5c6\uc74c)';\n\nreturn {\n json: {\n keyword,\n category,\n row_index: rowIndex,\n prompt_type: promptType,\n system_prompt: systemPrompt + jsonSafetyNote,\n user_message: `\ud0a4\uc6cc\ub4dc: ${keyword}\\n\uc791\uc131 \uae30\uc900\uc77c: ${yearMonth} (\ucd5c\uc2e0 \uc815\ubcf4 \uae30\uc900\uc73c\ub85c \uc791\uc131\ud558\uc138\uc694)${docsSection}\\n\\n## SERP \uc778\ud154\ub9ac\uc804\uc2a4\\n${serpSummary}\\n\\n## \ucc38\uc870 \uac00\ub2a5 URL \ud480\\n\uc544\ub798 URL\ub9cc references\uc640 \uc778\ub77c\uc778 \ucd9c\ucc98\uc5d0 \uc0ac\uc6a9\ud558\uc138\uc694:\\n${urlPoolText}`,\n }\n};\n"
},
"id": "node-4-route-prompt",
"name": "Route Prompt (A/B/C)",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1660,
300
]
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "/**\n * Build LLM Request \u2014 provider\ubcc4 URL/headers/body \uc0dd\uc131\n * \uc785\ub825: system_prompt, user_message, _llm_purpose(optional)\n * \ucd9c\ub825: _llm_url, _llm_headers, _llm_body, _llm_provider + \uc6d0\ubcf8 \ub370\uc774\ud130 \ud328\uc2a4\uc2a4\ub8e8\n */\n\nconst provider = $env.LLM_PROVIDER || 'gemini';\nconst systemPrompt = $input.item.json.system_prompt;\nconst userMessage = $input.item.json.user_message;\nconst purpose = $input.item.json._llm_purpose || 'content_gen';\n\nconst PROVIDERS = {\n gemini: {\n url: `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${$env.GOOGLE_API_KEY}`,\n headers: { 'content-type': 'application/json' },\n body: (sys, user, opts) => ({\n contents: [{ role: 'user', parts: [{ text: user }] }],\n systemInstruction: { parts: [{ text: sys }] },\n generationConfig: { maxOutputTokens: opts.maxTokens, temperature: opts.temperature }\n }),\n },\n claude: {\n url: 'https://api.anthropic.com/v1/messages',\n headers: {\n 'x-api-key': $env.CLAUDE_API_KEY,\n 'anthropic-version': '2023-06-01',\n 'content-type': 'application/json',\n },\n body: (sys, user, opts) => ({\n model: opts.model || 'claude-sonnet-4-5-20250514',\n max_tokens: opts.maxTokens,\n temperature: opts.temperature,\n system: sys,\n messages: [{ role: 'user', content: user }],\n }),\n },\n};\n\nconst config = PROVIDERS[provider];\nif (!config) throw new Error(`\uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294 LLM provider: ${provider}`);\n\nconst opts = purpose === 'verification'\n ? { maxTokens: 800, temperature: 0, model: 'claude-haiku-4-5-20251001' }\n : { maxTokens: 32768, temperature: 0.7 };\n\nreturn {\n json: {\n _llm_url: config.url,\n _llm_headers: config.headers,\n _llm_body: config.body(systemPrompt, userMessage, opts),\n _llm_provider: provider,\n ...Object.fromEntries(\n Object.entries($input.item.json).filter(([k]) => !k.startsWith('_llm'))\n ),\n }\n};\n"
},
"id": "node-build-llm-content",
"name": "Build LLM Request (Content Gen)",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1780,
300
]
},
{
"parameters": {
"method": "POST",
"url": "={{ $json._llm_url }}",
"sendHeaders": true,
"specifyHeaders": "json",
"jsonHeaders": "={{ JSON.stringify($json._llm_headers) }}",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify($json._llm_body) }}",
"options": {
"timeout": 300000
}
},
"id": "node-5-llm-content",
"name": "LLM Request (Content Gen)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1960,
300
],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 15000
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "/**\n * Normalize LLM Response \u2014 provider\ubcc4 \uc751\ub2f5\uc5d0\uc11c \ud14d\uc2a4\ud2b8 \ucd94\ucd9c\n * Gemini: candidates[0].content.parts[0].text\n * Claude: content[0].text\n */\n\nconst provider = $input.item.json._llm_provider\n || $env.LLM_PROVIDER\n || 'gemini';\n\nlet text;\nconst data = $input.item.json;\n\nif (provider === 'gemini') {\n text = data.candidates[0].content.parts[0].text;\n} else if (provider === 'claude') {\n text = data.content[0].text;\n} else {\n throw new Error(`\uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294 provider \uc751\ub2f5: ${provider}`);\n}\n\nreturn { json: { text, _llm_provider: provider } };\n"
},
"id": "node-normalize-content",
"name": "Normalize Response (Content Gen)",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2140,
300
]
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "/**\n * Node 6: LLM \uc751\ub2f5 JSON \ud30c\uc2f1 + \ud544\uc218 \ud544\ub4dc \uac80\uc99d\n * Mode: runOnceForEachItem\n * \uc785\ub825: \uc815\uaddc\ud654\ub41c LLM \uc751\ub2f5 (text)\n * \ucd9c\ub825: \ud30c\uc2f1\ub41c JSON \ub610\ub294 \uc5d0\ub7ec\n *\n * LLM\uc774 \uc0dd\uc131\ud55c JSON\uc758 \uc77c\ubc18\uc801 \ubb38\uc81c\ub97c \uc790\ub3d9 \ubcf5\uad6c:\n * - \ubb38\uc790\uc5f4 \ub0b4 \uc774\uc2a4\ucf00\uc774\ud504\ub418\uc9c0 \uc54a\uc740 \" (YAML, \ucf54\ub4dc\ube14\ub85d \ub4f1)\n * - \uc81c\uc5b4 \ubb38\uc790 (raw newline/tab)\n * - \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc774\uc2a4\ucf00\uc774\ud504 \uc2dc\ud000\uc2a4 (\\g, \\e \ub4f1)\n */\n\nconst raw = $input.item.json.text;\n\n// \uc54c\ub824\uc9c4 \ucd5c\uc0c1\uc704 JSON \ud544\ub4dc \ubaa9\ub85d (\uad6c\uc870\uc801 \ud0a4 \ud310\ubcc4\uc5d0 \uc0ac\uc6a9)\nconst TOP_LEVEL_KEYS = new Set([\n 'title', 'content', 'meta_description', 'faq_schema',\n 'references', 'internal_link_keywords', '_warning',\n]);\n\n// === Step 1: JSON \ube14\ub85d \ucd94\ucd9c ===\nlet jsonStr;\nconst fenceStart = raw.indexOf('```json');\nif (fenceStart !== -1) {\n const contentStart = raw.indexOf('\\n', fenceStart);\n const fenceEnd = raw.lastIndexOf('```');\n if (contentStart !== -1 && fenceEnd > fenceStart + 7) {\n jsonStr = raw.substring(contentStart + 1, fenceEnd).trim();\n }\n}\nif (!jsonStr) {\n const match = raw.match(/(\\{[\\s\\S]*\\})/);\n if (!match) {\n throw new Error(\"JSON \ucd94\ucd9c \uc2e4\ud328: \" + raw.substring(0, 200));\n }\n jsonStr = match[1];\n}\n\n// === Step 2: Lenient JSON repair ===\n// \uad6c\uc870\uc801 \ud30c\uc2f1\uc73c\ub85c \uc774\uc2a4\ucf00\uc774\ud504\ub418\uc9c0 \uc54a\uc740 \" \uc640 \uc81c\uc5b4 \ubb38\uc790\ub97c \uc790\ub3d9 \ubcf5\uad6c\nfunction repairJson(str) {\n const VALID_ESCAPES = '\"\\\\\\/bfnrtu';\n let result = '';\n let i = 0;\n\n function skipWS() {\n while (i < str.length && /\\s/.test(str[i])) { result += str[i++]; }\n }\n\n function parseValue() {\n skipWS();\n if (i >= str.length) return;\n if (str[i] === '\"') parseString();\n else if (str[i] === '{') parseObject();\n else if (str[i] === '[') parseArray();\n else parseLiteral();\n }\n\n function parseString() {\n result += str[i++]; // opening \"\n\n while (i < str.length) {\n const ch = str[i];\n\n // \uc774\uc2a4\ucf00\uc774\ud504 \uc2dc\ud000\uc2a4\n if (ch === '\\\\' && i + 1 < str.length) {\n const next = str[i + 1];\n if (VALID_ESCAPES.includes(next)) {\n result += ch + next;\n } else {\n // \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc774\uc2a4\ucf00\uc774\ud504 \u2192 \ubc31\uc2ac\ub798\uc2dc \uc774\uc911 \uc774\uc2a4\ucf00\uc774\ud504\n result += '\\\\\\\\' + next;\n }\n i += 2;\n continue;\n }\n\n // \ud070\ub530\uc634\ud45c: \uad6c\uc870\uc801 \uc885\ub8cc\uc778\uc9c0 content \ub0b4 \uc778\uc6a9\ubd80\ud638\uc778\uc9c0 \ud310\ub2e8\n if (ch === '\"') {\n // \ub2e4\uc74c \ube44\uacf5\ubc31 \ubb38\uc790\ub85c \ud310\ub2e8\n let peek = i + 1;\n while (peek < str.length && /[\\s\\n\\r\\t]/.test(str[peek])) peek++;\n\n if (peek >= str.length || ',:]}'.indexOf(str[peek]) !== -1) {\n // \uad6c\uc870\uc801 \uc885\ub8cc: \ub4a4\uc5d0 , ] } : \ub610\ub294 EOF\n result += '\"';\n i++;\n return;\n } else if (str[peek] === '\"') {\n // \ub2e4\uc74c\ub3c4 \" \u2192 \ub2e4\uc74c \"...\" \uc0ac\uc774\uac00 \uc720\ud6a8\ud55c JSON \ud0a4\uc778\uc9c0 \uac80\uc99d\n let j = peek + 1;\n let candidateKey = '';\n while (j < str.length && str[j] !== '\"' && str[j] !== ':') {\n candidateKey += str[j];\n j++;\n }\n // \uc870\uac74 \uac15\ud654: (1) \" \ub85c \ub2eb\ud600\uc57c \ud558\uace0 (2) \uadf8 \ub4a4\uc5d0 : \uc774 \uc788\uace0\n // (3) \ud0a4\uac00 \uc720\ud6a8\ud55c JSON \ud0a4 \ud328\ud134 (\uc9e7\uace0, \uc54c\ud30c\ubcb3/\uc5b8\ub354\uc2a4\ucf54\uc5b4)\n // (4) \uc54c\ub824\uc9c4 \ucd5c\uc0c1\uc704 \ud544\ub4dc\uba85\uc774\uc5b4\uc57c \uad6c\uc870\uc801 \uc885\ub8cc\ub85c \ud310\ub2e8\n if (j < str.length && str[j] === '\"') {\n let k = j + 1;\n while (k < str.length && /[\\s]/.test(str[k])) k++;\n if (k < str.length && str[k] === ':'\n && candidateKey.length > 0 && candidateKey.length < 30\n && /^[a-zA-Z_][\\w_]*$/.test(candidateKey)\n && TOP_LEVEL_KEYS.has(candidateKey)) {\n // \"value\" \"known_key\": \u2192 \uc27c\ud45c \ub204\ub77d\uc774\uc9c0\ub9cc \uad6c\uc870\uc801 \uc885\ub8cc\n result += '\"';\n i++;\n return;\n }\n }\n // \uc720\ud6a8\ud55c \ud0a4\uac00 \uc544\ub2d8 \u2192 content \ub0b4 \uc778\uc6a9\ubd80\ud638\n result += '\\\\\"';\n i++;\n continue;\n } else {\n // \ub4a4\uc5d0 \uc77c\ubc18 \ubb38\uc790 \u2192 content \ub0b4 \uc774\uc2a4\ucf00\uc774\ud504\ub418\uc9c0 \uc54a\uc740 \uc778\uc6a9\ubd80\ud638\n result += '\\\\\"';\n i++;\n continue;\n }\n }\n\n // \uc81c\uc5b4 \ubb38\uc790\n const code = ch.charCodeAt(0);\n if (code <= 0x1f) {\n if (code === 0x0a) result += '\\\\n';\n else if (code === 0x0d) result += '\\\\r';\n else if (code === 0x09) result += '\\\\t';\n i++;\n continue;\n }\n\n result += ch;\n i++;\n }\n }\n\n function parseObject() {\n result += str[i++]; // {\n skipWS();\n let first = true;\n while (i < str.length && str[i] !== '}') {\n if (!first) {\n if (str[i] === ',') result += str[i++];\n // \uc27c\ud45c \ub204\ub77d: \"}\" \uc544\ub2cc \ub2e4\ub978 \ubb38\uc790\uac00 \uc624\uba74 \uc27c\ud45c \uc0bd\uc785\n else {\n skipWS();\n if (i < str.length && str[i] === '\"') result += ',';\n }\n }\n first = false;\n skipWS();\n if (i >= str.length || str[i] === '}') break;\n parseString(); // key\n skipWS();\n if (i < str.length && str[i] === ':') result += str[i++];\n parseValue(); // value\n skipWS();\n }\n if (i < str.length && str[i] === '}') result += str[i++];\n }\n\n function parseArray() {\n result += str[i++]; // [\n skipWS();\n let first = true;\n while (i < str.length && str[i] !== ']') {\n if (!first) {\n if (str[i] === ',') result += str[i++];\n else {\n skipWS();\n if (i < str.length && str[i] !== ']') result += ',';\n }\n }\n first = false;\n skipWS();\n if (i >= str.length || str[i] === ']') break;\n pa
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Blog Automation Pipeline A — Content Generation. Uses googleSheets, httpRequest. Scheduled trigger; 28 nodes.
Source: https://github.com/KIMSANGHYEON93/blog-automation/blob/eb116e8781b2080ef82ac6010eda6aa366da7b0a/n8n/workflow_complete.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow automates video distribution to 9 social platforms simultaneously using Blotato's API. It includes both a scheduled publisher (checks Google Sheets for videos marked "Ready") and a subwo
YogiAI. Uses googleSheets, googleSheetsTool, httpRequest, stopAndError. Scheduled trigger; 61 nodes.
This workflow monitors Google Calendar for events indicating that a customer will visit the company today or the next day, retrieves the required details, and sends reminder notifications to the relev
ofn hook v0.24.0 beta. Uses start, httpRequest, functionItem, itemLists. Scheduled trigger; 42 nodes.
Security teams, DevOps engineers, vulnerability analysts, and automation builders who want to eliminate repetitive Nessus scan parsing, AI-based risk triage, and manual reporting. Designed for orgs fo