'use client'; import { useState, useCallback } from 'react'; import Link from 'next/link'; /* ── Types ─────────────────────────────────────────────── */ interface BlogSection { heading: string; body: string; imageSlot?: boolean; } interface ImageGuide { position: string; description: string; searchKeyword: string; altText: string; } interface BlogData { title: string; subtitle: string; content: BlogSection[]; tags: string[]; seoTitle: string; seoDescription: string; imageGuides: ImageGuide[]; meta: { charCount: number; sectionCount: number; estimatedReadTime: string; generatedAt: string; model: string; }; } /* ── Option configs ────────────────────────────────────── */ const STYLES = [ { value: 'informational', label: '정보 전달', desc: '사실 기반 정보 정리', icon: '📖' }, { value: 'review', label: '리뷰/후기', desc: '제품·서비스 체험기', icon: '⭐' }, { value: 'howto', label: '방법/튜토리얼', desc: '단계별 가이드', icon: '🔧' }, { value: 'listicle', label: '리스트형', desc: 'OO가지 모음', icon: '📋' }, { value: 'comparison', label: '비교 분석', desc: 'A vs B 비교', icon: '⚖️' }, { value: 'story', label: '에세이/스토리', desc: '경험 기반 서사', icon: '✍️' }, ]; const TONES = [ { value: 'professional', label: '전문적', color: 'border-blue-500/40 bg-blue-500/10 text-blue-300' }, { value: 'friendly', label: '친근한', color: 'border-emerald-500/40 bg-emerald-500/10 text-emerald-300' }, { value: 'casual', label: '캐주얼', color: 'border-amber-500/40 bg-amber-500/10 text-amber-300' }, { value: 'formal', label: '격식체', color: 'border-violet-500/40 bg-violet-500/10 text-violet-300' }, ]; const LENGTHS = [ { value: 'short', label: '짧게', desc: '800~1,200자', time: '~2분' }, { value: 'medium', label: '보통', desc: '1,500~2,500자', time: '~5분' }, { value: 'long', label: '길게', desc: '3,000~4,500자', time: '~9분' }, ]; /* ── Component ─────────────────────────────────────────── */ export default function NaverBlogPage() { // Form state const [topic, setTopic] = useState(''); const [keywordInput, setKeywordInput] = useState(''); const [keywords, setKeywords] = useState([]); const [style, setStyle] = useState('informational'); const [tone, setTone] = useState('friendly'); const [length, setLength] = useState('medium'); const [sections, setSections] = useState(5); const [imageGuide, setImageGuide] = useState(true); // Result state const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [result, setResult] = useState(null); const [viewMode, setViewMode] = useState<'preview' | 'seo' | 'image'>('preview'); const [copied, setCopied] = useState(false); /* ── Keyword management ───────────────────────────────── */ const addKeyword = () => { const kw = keywordInput.trim(); if (kw && !keywords.includes(kw) && keywords.length < 10) { setKeywords([...keywords, kw]); setKeywordInput(''); } }; const removeKeyword = (kw: string) => { setKeywords(keywords.filter((k) => k !== kw)); }; /* ── Generate ─────────────────────────────────────────── */ const handleGenerate = useCallback(async () => { if (!topic.trim()) { setError('주제를 입력해주세요.'); return; } if (keywords.length === 0) { setError('키워드를 최소 1개 추가해주세요.'); return; } setLoading(true); setError(null); setResult(null); try { const res = await fetch('/api/tools/naver-blog/generate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ topic: topic.trim(), keywords, style, tone, length, imageGuide, sections }), }); const json = await res.json(); if (!res.ok || !json.success) { throw new Error(json.error || '생성에 실패했습니다.'); } setResult(json.data); } catch (err) { setError(err instanceof Error ? err.message : '오류가 발생했습니다.'); } finally { setLoading(false); } }, [topic, keywords, style, tone, length, imageGuide, sections]); /* ── Copy full content ────────────────────────────────── */ const copyContent = () => { if (!result) return; const text = result.content.map((s) => `## ${s.heading}\n\n${s.body}`).join('\n\n'); const full = `# ${result.title}\n\n${result.subtitle}\n\n${text}\n\n태그: ${result.tags.map((t) => '#' + t).join(' ')}`; navigator.clipboard.writeText(full); setCopied(true); setTimeout(() => setCopied(false), 2000); }; return (
{/* Header */}
도구 목록

네이버 블로그 자동화

Naver Blog AI Writer

{/* ── Left: Settings Panel ──────────────────────────── */}
{/* Topic */}
setTopic(e.target.value)} placeholder="예: 2026년 제주도 가족여행 추천 코스" className="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2.5 text-white text-sm placeholder-slate-500 focus:outline-none focus:border-blue-500/50" maxLength={100} /> {/* Keywords */}
setKeywordInput(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && (e.preventDefault(), addKeyword())} placeholder="키워드 입력 후 Enter" className="flex-1 bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white text-sm placeholder-slate-500 focus:outline-none focus:border-blue-500/50" />
{keywords.length > 0 && (
{keywords.map((kw) => ( {kw} ))}
)}
{/* Style */}
{STYLES.map((s) => ( ))}
{/* Tone */}
{TONES.map((t) => ( ))}
{/* Length + Sections + Image */}
{LENGTHS.map((l) => ( ))}

3~8개

{sections}
{/* Generate Button */} {error && (
{error}
)}
{/* ── Right: Result Panel ───────────────────────────── */}
{!result && !loading && (

왼쪽에서 옵션을 선택하고
블로그 글을 생성해보세요

)} {loading && (

AI가 블로그 글을 작성하고 있습니다

주제 분석 → 구조 설계 → 본문 작성 → SEO 최적화

)} {result && (
{/* View mode tabs */}
{[ { id: 'preview' as const, label: '글 미리보기' }, { id: 'seo' as const, label: 'SEO 정보' }, { id: 'image' as const, label: '이미지 가이드' }, ].map((tab) => ( ))}
{/* Meta bar */}
{result.meta.charCount.toLocaleString()}자 {result.meta.sectionCount}개 섹션 읽기 {result.meta.estimatedReadTime}
{/* Content based on viewMode */} {viewMode === 'preview' && (
{/* Blog preview (light theme to mimic Naver Blog) */}

{result.title}

{result.subtitle}

{result.content.map((section, idx) => (

{section.heading}

{section.imageSlot && (
이미지 배치 위치
)}
{section.body}
))} {/* Tags */}
{result.tags.map((tag) => ( #{tag} ))}
)} {viewMode === 'seo' && (

{result.seoTitle}

{result.seoDescription}

{result.tags.map((tag) => ( #{tag} ))}
{result.content.map((section, idx) => (
H2 {section.heading} {section.body.length}자
))}
모델: {result.meta.model} · 생성: {new Date(result.meta.generatedAt).toLocaleString('ko-KR')}
)} {viewMode === 'image' && (
{result.imageGuides.length === 0 ? (

이미지 가이드가 없습니다.

) : (
{result.imageGuides.map((guide, idx) => (
{idx + 1} {guide.position}

{guide.description}

검색어: {guide.searchKeyword} Alt: {guide.altText}
))}
)}
)} {/* CTA */}

이런 블로그 자동화를 우리 사업에 맞게 커스텀하고 싶다면?

맞춤 자동화 상담하기
)}
); }