"use client"; import { useState } from "react"; // ====================================================== // ๐Ÿ”ฅ ๊น€์„ ์ฃผ ๋Œ€๋ฆฌ โ€” ์ผ๋ณธ SEO ํŠนํ™” ๋ธ”๋กœ๊ทธ ์ž๋™ ์ƒ์„ฑ ์‹œ์Šคํ…œ // - ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ AI ์‹คํ–‰ // - ์ผ๋ณธ SEO ์ตœ์ ํ™” ๊ตฌ์กฐ // - ์ด๋ฏธ์ง€ ํ”„๋กฌํ”„ํŠธ ๊ฐœ๋ณ„ ๋ณต์‚ฌ ๊ฐ€๋Šฅ // - ๋ธ”๋กœ๊ทธ ์ „์ฒด ๋ณต์‚ฌ ๋ฒ„ํŠผ // ====================================================== const API_ENDPOINT = "/api/research"; export default function Page() { const [jpBlog, setJpBlog] = useState(""); const [dailyTopic, setDailyTopic] = useState(""); const [images, setImages] = useState([]); const [seoScore, setSeoScore] = useState("0 / 100"); const [generatedAt, setGeneratedAt] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); // ๐Ÿ”ฅ Canvas ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ „์šฉ ๋ฒ„์ „ // ChatGPT ์˜ค๋ฅธ์ชฝ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์—์„œ๋Š” Next ์„œ๋ฒ„ API๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ // ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ๋Š” ์ง์ ‘ AI ํ˜ธ์ถœ ๋Œ€์‹  ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์—์„œ ๋ฐ”๋กœ ์ƒ์„ฑ // ๐Ÿ”ฅ ๋กœ์ปฌ ์„œ๋ฒ„ ํ˜ธ์ถœ ๋ฒ„์ „ (์‹ค์ œ OpenAI + ํŒŒ์ผ ์ €์žฅ) const startResearch = async () => { setLoading(true); setError(""); try { const res = await fetch(API_ENDPOINT, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ periodMonths: 3 }), }); const data = await res.json(); if (!res.ok) { throw new Error(data.error || `์„œ๋ฒ„ ์˜ค๋ฅ˜ ${res.status}`); } setDailyTopic(data.topic || ""); setJpBlog(data.blog || ""); setImages(data.images || []); setSeoScore(data.seo_score || "0 / 100"); setGeneratedAt(data.generatedAt || ""); } catch (e: any) { setError(e.message); } finally { setLoading(false); } }; const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text); alert("๋ณต์‚ฌ ์™„๋ฃŒ"); }; // ๐Ÿ”ฅ Gemini Canvas๋กœ ๋„˜๊ธธ ์ž‘์—… ์ง€์‹œ์„œ ์ž๋™ ์ƒ์„ฑ // ๐Ÿ”ฅ Gemini Canvas๋กœ ๋„˜๊ธธ ์ผ๋ณธ SEO ๊ฐ•ํ™” ์ž‘์—… ์ง€์‹œ์„œ const generateGeminiInstruction = () => { return `๋‹น์‹ ์€ ์ผ๋ณธ YahooใƒปGoogle ๊ฒ€์ƒ‰ ์ƒ์œ„ ๋…ธ์ถœ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” SEO ์ „๋ฌธ ์ฝ˜ํ…์ธ  ์—๋””ํ„ฐ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ๋ณธ ๋…์ž๋ฅผ ์œ„ํ•œ ํ•œ๊ตญ ๊ด€๊ด‘ยทํ•œ๋ฐฉยท๋ฌธํ™”ยท์Œ์‹ ์ฒดํ—˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”. [์˜ค๋Š˜์˜ ์ฃผ์ œ] ${dailyTopic} [๊ฒ€์ƒ‰ ํŠธ๋ Œ๋“œ ๋ฐ˜์˜ ์ง€์นจ] ์ตœ๊ทผ 3๊ฐœ์›” ์ผ๋ณธ ๊ฒ€์ƒ‰ ํŠธ๋ Œ๋“œ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ๋‹ค์Œ ์œ ํ˜•์˜ ํ‚ค์›Œ๋“œ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํฌํ•จํ•˜์„ธ์š”: - ้Ÿ“ๅ›ฝๆ—…่กŒ - ้Ÿ“ๅ›ฝใƒ’ใƒผใƒชใƒณใ‚ฐ - ใ‚ฝใ‚ฆใƒซๆ—…่กŒ ใŠใ™ใ™ใ‚ - ๆผขๆ–นไฝ“้จ“ ้Ÿ“ๅ›ฝ - ้Ÿ“ๅ›ฝใ‚ซใƒ•ใ‚งๅทกใ‚Š - ้Ÿ“ๅ›ฝใ‚ฐใƒซใƒก ไฝ“้จ“ - ้Ÿ“ๅ›ฝใ‚ฆใ‚งใƒซใƒใ‚นๆ—…่กŒ ๋‹จ, ๊ณผ๋„ํ•œ ๋ฐ˜๋ณต ์—†์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฌธ๋งฅ์— ๋…น์—ฌ ์ž‘์„ฑํ•˜์„ธ์š”. [์ž‘์„ฑ ์กฐ๊ฑด] 1. 1,500์ž ์ด์ƒ 2,000์ž ์ดํ•˜ ์ผ๋ณธ์–ด 2. H2 / H3 ๊ตฌ์กฐ ์‚ฌ์šฉ 3. ๋„์ž…๋ถ€์— ๊ฒ€์ƒ‰ ์˜๋„ ํ•ด๊ฒฐ ๋ฌธ์žฅ ํฌํ•จ 4. ์ค‘๊ฐ„์— ์ฒดํ—˜ ๊ฐ€์น˜ ๊ฐ•์กฐ ๋‹จ๋ฝ ํฌํ•จ 5. ๋งˆ์ง€๋ง‰์— ํ–‰๋™ ์œ ๋„ ๋ฌธ์žฅ(CTA) ํฌํ•จ (๋ธŒ๋žœ๋“œ๋ช… ์–ธ๊ธ‰ ๊ธˆ์ง€) [SEO ๊ฐ•ํ™” ์š”์†Œ] - ๊ฒ€์ƒ‰ ์˜๋„ํ˜• ์งˆ๋ฌธ ๋ฌธ์žฅ 1๊ฐœ ํฌํ•จ - ์ง€์—ญ ํ‚ค์›Œ๋“œ ์ตœ์†Œ 2๊ฐœ ํฌํ•จ (ไพ‹: ใ‚ฝใ‚ฆใƒซ, ้‡œๅฑฑ, ๆ™ฏ็ฆๅฎฎ ๋“ฑ) - ๊ฐ์„ฑ ํ‘œํ˜„ + ์ •๋ณดํ˜• ์„ค๋ช… ๊ท ํ˜• ์œ ์ง€ [์ด๋ฏธ์ง€ ์ œ์ž‘ ๊ฐ€์ด๋“œ] ์•„๋ž˜ 1:1 ์‹ค์‚ฌ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ธ”๋กœ๊ทธ์šฉ ์ด๋ฏธ์ง€ ์ œ์ž‘: ${images.join(" ")} [์ถœ๋ ฅ ํ˜•์‹] 1. SEO ์ตœ์ ํ™” ์ œ๋ชฉ 2. ๋ณธ๋ฌธ (H2/H3 ๊ตฌ์กฐ ์œ ์ง€) 3. SEO ํ‚ค์›Œ๋“œ ๋ชฉ๋ก 4. ๋ฉ”ํƒ€ ์„ค๋ช… (120์ž ์ด๋‚ด) ์œ„ ์กฐ๊ฑด์„ ๋ชจ๋‘ ์ถฉ์กฑํ•˜์—ฌ ์™„์„ฑ๋œ ์ผ๋ณธ์–ด ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.`; }; return (

๊น€์„ ์ฃผ ๋Œ€๋ฆฌ โ€” ์ผ๋ณธ SEO ํŠนํ™” ๋ธ”๋กœ๊ทธ ์ƒ์„ฑ ์‹œ์Šคํ…œ

{generatedAt && (
์ƒ์„ฑ ์™„๋ฃŒ: {generatedAt}
)} {error && (
{error}
)}

์˜ค๋Š˜์˜ ์ฃผ์ œ