DAY 1 · 3교시 · 60분

Cloud LLM 연동 및 대본 생성하기

📚1단계: 주요 개념 설명

이번 단원의 목표

외부 클라우드 인공지능 API를 연동하여 쇼츠 대본 초안을 자동으로 확보한다.

🗂️강의 슬라이드
슬라이드 1 / 10

클라우드 AI에게 질문 보내기

💻내 웹 앱☁️클라우드 AI요청: 주제·톤 →← 응답: 대본 JSON
  • 웹앱은 주제와 톤을 담아 AI 서버에 요청을 보냅니다.
  • AI 서버는 대본과 장면 정보를 만들어 응답으로 돌려줍니다.
  • 이때 응답이 성공했는지, 실패했는지를 상태 코드로 확인합니다.

🛠️2단계: 따라하기 실습

🛠 따라 만들기 · AI 바이브 코딩
AI 바이브 코딩으로 '쇼츠 대본 생성기' 만들기

주제를 입력하면 클라우드 AI가 쇼츠 대본을 써 주는 한 페이지 웹앱을 직접 만듭니다. 화면(입력) → 서버 API(키 보관·AI 호출) → 클라우드 AI → 결과 표시의 흐름을 코딩합니다. 각 단계의 프롬프트를 Kiro(키로)에 붙여넣어 따라 만들어 보세요. 막히면 아래 '완성 코드 펼치기'의 코드를 붙여넣고 이어서 따라오면 됩니다.

🎯 완성 결과: 주제를 입력하고 버튼을 누르면 AI가 쓴 30초 쇼츠 대본이 화면에 나타나는 웹앱
1강사 임시 키를 .env.local에 넣기

강사가 나눠 준 임시 키를 코드가 아닌 비밀 파일에 보관합니다.

🤖 AI에게 이렇게 시켜보세요

Next.js(App Router) 프로젝트 루트에 .env.local 파일을 만들고, 여기에 OPENAI_API_KEY를 넣어서 서버에서 쓰는 방법을 알려줘. .gitignore에 .env.local이 있는지도 확인해줘.

📄 .env.local (프로젝트 루트에 새로 생성)
OPENAI_API_KEY=강사에게_받은_임시_키_붙여넣기
💡 핵심 코드 설명
  • 1교시에 강사가 나눠 준 임시 키를 여기에 붙여넣습니다. 이 키는 수업 후 강사가 폐기합니다.
  • .env.local은 .gitignore에 등록돼 있어 GitHub에 올라가지 않습니다 — 키 유출·요금 도용을 막는 핵심 습관입니다.
  • 값을 바꾸면 개발 서버(npm run dev)를 껐다 켜야 새 키가 반영됩니다.
2백엔드 API 라우트 만들기 (키는 서버에서만)

주제를 받아 클라우드 AI에게 대본을 요청하는 서버 코드를 만듭니다.

🤖 AI에게 이렇게 시켜보세요

app/api/script/route.ts를 만들어줘. POST 요청으로 topic을 받아서, OpenAI의 /v1/chat/completions에 gpt-4o-mini 모델로 30초 분량 쇼츠 대본을 요청하고, 생성된 텍스트만 JSON으로 돌려줘. API 키는 process.env.OPENAI_API_KEY를 사용해.

📄 app/api/script/route.ts
import { NextResponse } from "next/server";

export async function POST(request: Request) {
  const { topic } = await request.json();

  const res = await fetch("https://api.openai.com/v1/chat/completions", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: "Bearer " + process.env.OPENAI_API_KEY,
    },
    body: JSON.stringify({
      model: "gpt-4o-mini",
      messages: [
        { role: "system", content: "너는 유튜브 쇼츠 대본 작가다. 짧고 강렬하게 써라." },
        { role: "user", content: "주제: " + topic + ". 30초 분량의 쇼츠 대본을 써줘." },
      ],
    }),
  });

  const data = await res.json();
  const script = data.choices?.[0]?.message?.content ?? "생성 실패";
  return NextResponse.json({ script });
}
💡 핵심 코드 설명
  • 왜 서버 라우트일까요? API 키를 브라우저에 노출하지 않으려면, 키를 아는 '서버'가 대신 AI를 호출해야 합니다. 학생 화면(브라우저)은 키를 절대 보지 못합니다.
  • fetch로 OpenAI 주소에 POST하고, Authorization 헤더에 'Bearer ' + 키를 넣어 신분을 증명합니다.
  • messages의 system은 AI의 역할, user는 실제 요청입니다. topic을 문장에 끼워 넣어 원하는 대본을 유도합니다.
  • 응답에서 choices[0].message.content가 실제 생성된 글입니다. ?.(옵셔널 체이닝)과 ??(널 병합)로 값이 없을 때도 앱이 죽지 않게 처리합니다.
3화면 만들기 (입력창 + 버튼 + 결과)

주제를 입력하고 버튼을 누르면 결과가 보이는 페이지를 만듭니다.

🤖 AI에게 이렇게 시켜보세요

app/page.tsx를 클라이언트 컴포넌트로 만들어줘. 주제 입력창과 '대본 생성' 버튼이 있고, 버튼을 누르면 /api/script에 POST해서 결과를 받아 화면에 보여줘. 로딩 중에는 버튼에 '생성 중...'을 표시해. React useState를 써.

📄 app/page.tsx
"use client";
import { useState } from "react";

export default function Home() {
  const [topic, setTopic] = useState("");
  const [script, setScript] = useState("");
  const [loading, setLoading] = useState(false);

  async function generate() {
    setLoading(true);
    const res = await fetch("/api/script", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ topic }),
    });
    const data = await res.json();
    setScript(data.script);
    setLoading(false);
  }

  return (
    <main style={{ maxWidth: 600, margin: "40px auto", padding: 20 }}>
      <h1>AI 쇼츠 대본 생성기</h1>
      <input
        value={topic}
        onChange={(e) => setTopic(e.target.value)}
        placeholder="예: 블랙홀의 비밀"
      />
      <button onClick={generate} disabled={loading}>
        {loading ? "생성 중..." : "대본 생성"}
      </button>
      {script && <pre>{script}</pre>}
    </main>
  );
}
💡 핵심 코드 설명
  • 'use client'는 이 파일이 브라우저에서 동작(버튼 클릭·입력 등 상호작용)한다는 표시입니다.
  • useState로 입력값(topic), 결과(script), 로딩 여부(loading)를 기억합니다. 값이 바뀌면 화면이 자동으로 다시 그려집니다.
  • generate 함수는 우리가 만든 /api/script로 요청을 보내고, 돌아온 대본을 script에 저장합니다. 여기에 키는 없습니다 — 서버가 대신 처리하니까요.
  • loading 값으로 버튼 문구를 바꿔, 기다리는 동안 사용자에게 진행 상태를 알려줍니다.
4실행하고 확인하기

직접 돌려서 대본이 생성되는지 눈으로 확인합니다.

▶ 터미널에서 실행
npm run dev
# 브라우저에서 http://localhost:3000 접속
💡 핵심 코드 설명
  • 주제를 입력하고 '대본 생성'을 누르면 몇 초 뒤 AI가 쓴 대본이 화면에 나타납니다.
  • 안 되면? 401 오류는 키가 틀렸다는 뜻입니다 — .env.local의 키를 확인하고 개발 서버를 재시작하세요.
  • 결과가 비어 있으면 모델명 오타나 요청량 초과일 수 있습니다. 터미널에 찍힌 에러 메시지를 함께 확인하세요.
5AI에게 더 시켜서 키우기 (바이브 코딩)

완성된 앱에 작은 기능을 자연어로 하나씩 요청해 확장합니다.

🤖 AI에게 이렇게 시켜보세요

지금 만든 쇼츠 대본 생성기에 (1) 톤 선택(재미있게 / 진지하게) 드롭다운과 (2) 결과 복사 버튼을 추가해줘. 기존 코드 구조는 최대한 유지해줘.

💡 핵심 코드 설명
  • 바이브 코딩의 핵심은 완성 코드를 통째로 받기보다, 작은 기능을 하나씩 자연어로 요청하고 → 결과를 읽고 → 실행해 확인하는 반복입니다.
  • AI가 준 코드를 그대로 믿지 말고, 이번 단원에서 배운 요청/응답·키 보안 개념으로 '왜 이렇게 동작하는지'를 스스로 설명할 수 있어야 진짜 실력이 됩니다.
실습 미션 체크리스트
1개념 직관

클라우드 AI API는 멀리 있는 AI에게 질문을 보내고 답을 받는 방식입니다. 이때 API Key는 '사용 허가증'과 같으므로 안전하게 다뤄야 합니다.

2실습 미션

우측 API 연동 실습 칸에 발급받은 임시 API Key를 기입하고 통신 테스트를 개시해 대본 JSON 데이터를 무사히 긁어오는지 확인해 보세요.

브라우저에서 내 서버 라우트로 요청하기
async function generateShorts(formData) {
  const res = await fetch("/api/generate-shorts", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(formData)
  });

  if (!res.ok) throw new Error("AI 요청 실패");
  return await res.json();
}

💡 코딩 중 막히나요? 모범 솔루션 코드

🧩3단계: 개념 검증 퀴즈

검증 챌린지 미션

리턴 메시지 창에 HTTP 200 OK 사인이 뜨며 대본 JSON 파싱 데이터 로그가 출력되는지 확인합니다.

📝 객관식 개념 확인 (2문항)

Q1. API Key를 .env.local에 두고 .gitignore에 등록하는 이유는?

Q2. API 요청이 정상 처리됐을 때 돌아오는 성공 응답 코드는?

🔬 인터랙티브 체험 (선택)— 개념을 직접 조작하며 확인해 보세요
Cloud API Credentials
API Key는 개인 열쇠입니다. 실제 서비스에서는 브라우저 화면에 오래 보관하지 않고, 서버 환경변수에 넣어 서버가 대신 호출하게 만듭니다.
💻 화면
☁️ AI 서버
다음 교시로 이동하기 (4교시: 대본 구조화와 프롬프트 엔지니어링) ➡️