logo
게시일

AI로 웹툰 만들기

다른 언어로 읽기: English
작성자

1. AI가 웹툰을 만든다고?

웹툰을 만들려면 보통 세 가지가 필요합니다:

  1. 스토리 — 무슨 이야기를 할 것인가
  2. 캐릭터 — 누가 등장하는가
  3. 그림 — 장면을 그리는 것

이 세 가지를 전부 AI가 해줄 수 있습니다. 이 글에서는 Gemini API를 사용해서 주제만 입력하면 스토리 생성 → 이미지 생성까지 자동으로 웹툰을 만드는 과정을 공유합니다.

핵심은 템플릿캐릭터를 미리 설정해두는 것입니다. 한번 세팅해놓으면 주제만 바꿔가며 웹툰을 계속 찍어낼 수 있습니다.


2. 전체 구조

전체 파이프라인

2단계 파이프라인이 핵심입니다. 텍스트 생성과 이미지 생성을 분리해서, 중간에 사람이 스크립트를 수정할 수 있습니다. AI가 쓴 대사가 마음에 안 들면 바꾸고, 괜찮으면 그대로 이미지 생성으로 넘깁니다.


3. 캐릭터 설정

3.1 캐릭터 라이브러리

캐릭터를 미리 정의해둡니다. 각 캐릭터는 이름과 참조 이미지를 가집니다:

const CHARACTERS = [
  { name: "토리", image: "tori.jpg" },
  { name: "민수", image: "minsu.jpg" },
  { name: "하나", image: "hana.jpg" },
  { name: "로봇K", image: "robot-k.jpg" },
  // ... 원하는 만큼 추가
];

const MAX_CHARACTERS = 5; // 한 웹툰에 최대 5명
캐릭터 일관성 원리

캐릭터를 미리 정의해두는 이유는 일관성 때문입니다. 매번 "고양이 캐릭터를 그려줘"라고 하면 매번 다른 캐릭터가 나옵니다. 하지만 "이 캐릭터의 특징은 이렇다"라고 상세히 설명해두면 AI가 매 컷에서 비슷한 캐릭터를 그립니다.

3.2 캐릭터 묘사

이미지 생성 프롬프트에 캐릭터의 시각적 특징을 상세하게 넣습니다:

CHARACTERS:
These are cute animal mascot characters with these EXACT features:
- Round cartoon faces with BIG expressive eyes (sparkly, emotional)
- Small pink noses and happy/expressive mouths
- Each character wears a UNIQUE distinctive outfit/accessory:
  * 토리: yellow bird, wears a red scarf, always cheerful
  * 민수: blue cat, wears glasses and a hoodie, nerdy
  * 하나: pink rabbit, wears a beret, artistic
  * 로봇K: silver robot, square head, LED eyes
- Rounded chibi body proportions (big heads, small bodies)
- Human-like poses (sitting, talking, using devices, gesturing)

이 묘사가 모든 이미지 생성 요청에 동일하게 들어갑니다. 덕분에 어떤 장면을 그리든 캐릭터의 기본 스타일이 유지됩니다.


4. 템플릿

4.1 레이아웃 템플릿

웹툰의 레이아웃도 미리 정의합니다:

4컷 만화 템플릿

지원하는 레이아웃:

  • Grid (2x2) — 4컷 만화, 가장 기본
  • Webtoon — 세로 스크롤, 800px 너비
  • Single — 한 장짜리 드라마틱 패널

4.2 밈 템플릿

유명한 밈 형식도 템플릿으로 만들어뒀습니다:

Drake 밈 템플릿
This is Fine 밈 템플릿
const MEME_TEMPLATES = [
  {
    id: "drake",
    name: "Drake Like/Dislike",
    description: "캐릭터가 좋아하는 것 / 싫어하는 것 표현",
    fields: [
      { id: "character", type: "character", label: "캐릭터" },
      { id: "dislike", type: "text", label: "싫어하는 것" },
      { id: "like", type: "text", label: "좋아하는 것" },
    ],
  },
  {
    id: "this-is-fine",
    name: "This is Fine",
    description: "불 속에서 괜찮은 척하는 밈",
    fields: [
      { id: "character", type: "character", label: "캐릭터" },
      { id: "situation", type: "text", label: "상황" },
    ],
  },
];
템플릿 사용 흐름

템플릿을 선택하고 빈 칸만 채우면 됩니다. "어떤 캐릭터가 무엇을 싫어하고 무엇을 좋아하는지"만 입력하면 Drake 밈이 완성됩니다.


5. 1단계: 스크립트 자동 생성

5.1 입력

사용자가 입력하는 건 이것뿐입니다:

{
  theme: "신입사원 첫 날 회사에서 생긴 일",  // 주제
  characters: ["토리", "민수", "하나"],     // 등장인물
  numPages: 4,                            // 페이지 수
  tone: "comic",                          // 톤 (comic / serious / meme)
  additionalInfo: "마지막에 반전"           // 추가 요구사항 (선택)
}

5.2 프롬프트

이 입력을 바탕으로 Gemini에 스크립트 생성을 요청합니다:

const storyPrompt = `Create a ${numPages}-page comic story about: ${theme}

Tone: ${toneInstruction}
Characters: ${characters.join(", ")}
${additionalInfo ? `Additional requirements: ${additionalInfo}` : ""}

For each page, provide:
- Scene description (visual details for the comic panel)
- Dialogue for characters (2-4 lines per page)

Format as JSON:
{
  "title": "Comic Title",
  "pages": [
    {
      "pageNumber": 1,
      "scene": "Detailed scene description",
      "dialogue": [{"character": "Name", "text": "What they say"}]
    }
  ]
}`;

5.3 결과

AI가 JSON 형식으로 스크립트를 돌려줍니다:

{
  "title": "신입의 하루",
  "pages": [
    {
      "pageNumber": 1,
      "scene": "깔끔한 사무실 입구, 토리가 긴장한 표정으로 서 있음",
      "dialogue": [
        { "character": "토리", "text": "첫 출근이다... 떨려..." },
        { "character": "민수", "text": "어, 신입? 여기 앉아!" }
      ]
    },
    {
      "pageNumber": 2,
      "scene": "사무실 책상, 민수가 모니터 세 대 앞에 앉아있고 토리가 옆에서 놀란 표정",
      "dialogue": [
        { "character": "토리", "text": "모니터가 왜 세 개예요?" },
        { "character": "민수", "text": "하나는 코드, 하나는 슬랙, 하나는 유튜브" }
      ]
    }
  ]
}
스크립트 생성 과정

Gemini 2.0 Flash 모델을 사용합니다. 텍스트 생성은 빠르고 저렴한 모델이면 충분합니다. JSON 스키마를 지정해서 항상 파싱 가능한 형식으로 받습니다.

이 단계에서 사람이 스크립트를 수정할 수 있습니다. AI가 쓴 대사가 재미없으면 직접 고치면 됩니다. 스크립트가 마음에 들면 다음 단계로 넘깁니다.


6. 2단계: 이미지 생성

스크립트가 완성되면 각 페이지를 실제 이미지로 만듭니다.

6.1 이미지 프롬프트

const imagePrompt = `Create a HIGH-QUALITY professional 4-panel comic page.

TITLE: "${script.title}" (displayed prominently at top)

STORY SCENE: ${page.scene}

CHARACTERS (${characters.join(", ")}):
Cute animal mascot characters with specific features:
- 토리: yellow bird with red scarf, cheerful
- 민수: blue cat with glasses and hoodie, nerdy
- Rounded chibi proportions, expressive eyes

DIALOGUE (include in professional speech bubbles):
${page.dialogue.map(d => `${d.character}: "${d.text}"`).join("\n")}

LAYOUT:
- 4 panels in 2x2 grid
- Clean black borders between panels
- Bold title banner at top

ART STYLE (CRITICAL):
- Premium digital illustration quality
- Dramatic cinematic lighting with rim lights
- Rich detailed backgrounds
- Professional comic speech bubbles
- High contrast, saturated colors`;
모델 선택 전략

이미지 생성에는 더 강력한 모델을 사용합니다. gemini-3-pro-image-preview가 기본이고, 실패하면 gemini-3.1-flash-image-preview로 폴백합니다.

6.2 실제 생성 결과

Grid 형식 웹툰
Webtoon 형식 (세로 스크롤)

같은 스크립트라도 레이아웃만 바꾸면 다른 형식의 웹툰이 나옵니다. Grid는 SNS에 올리기 좋고, Webtoon은 네이버 웹툰처럼 세로로 읽기 좋습니다.


7. 왜 템플릿 + 캐릭터 사전 설정이 중요한가

AI 이미지 생성에서 가장 큰 문제는 일관성입니다. 매번 "고양이를 그려줘"라고 하면 매번 다른 고양이가 나옵니다. 이걸 해결하는 방법이 사전 설정입니다.

일관성 3요소

캐릭터 일관성

  • 캐릭터의 시각적 특징을 아주 구체적으로 묘사합니다
  • "큰 눈", "분홍 코", "빨간 스카프" 같은 디테일이 매 프롬프트에 들어갑니다
  • 캐릭터별 고유 액세서리(안경, 모자 등)로 구분합니다

스타일 일관성

  • 아트 스타일 지시어를 모든 프롬프트에 동일하게 넣습니다
  • "Premium digital illustration", "dramatic cinematic lighting" 같은 키워드가 고정됩니다
  • 같은 스타일 가이드를 쓰니 1컷과 4컷의 그림체가 같습니다

레이아웃 일관성

  • 레이아웃 지시어도 고정합니다
  • "4 panels in 2x2 grid, clean black borders" 같은 구조 지시
  • 말풍선 위치, 타이틀 위치도 명시합니다

8. 실전 팁

잘 되는 것

  • 4컷 만화 — 짧은 개그, 밈은 결과가 좋습니다
  • 캐릭터 2-3명 — 너무 많으면 AI가 헷갈려합니다
  • 밈 형식 — Drake, This is Fine 같은 정형화된 형식은 AI가 잘 이해합니다

주의할 점

  • 텍스트는 완벽하지 않습니다 — 말풍선 안의 텍스트가 가끔 깨집니다. 중요한 텍스트는 후보정이 필요할 수 있습니다
  • 캐릭터 5명 이상은 어렵습니다 — 한 컷에 캐릭터가 많으면 구분이 어려워집니다
  • 복잡한 액션 씬은 한계가 있습니다 — 단순한 상황, 대화 위주가 결과가 좋습니다

톤 설정의 차이

const toneInstructions = {
  comic: "Use a light-hearted, humorous tone with fun dialogue and visual gags.",
  serious: "Use a dramatic, intense tone with emotional depth and cinematic scenes.",
  meme: "Use internet humor, meme references, and exaggerated reactions.",
};

톤 하나 바꾸면 같은 주제라도 완전히 다른 느낌의 웹툰이 나옵니다. "월요일 아침 출근"을 comic 톤으로 하면 개그, serious 톤으로 하면 드라마, meme 톤으로 하면 밈이 됩니다.


9. 정리

단계모델역할
스크립트 생성Gemini 2.0 Flash주제 → 장면/대사 JSON
이미지 생성Gemini 3 Pro Image장면 → 실제 이미지
폴백Gemini 3.1 Flash ImagePro 실패 시 대체

템플릿과 캐릭터를 한번 세팅해놓으면, 주제만 바꿔가며 웹툰을 계속 만들 수 있습니다. 그림을 못 그려도, 스토리를 못 써도, AI가 다 해줍니다. 사람은 주제를 정하고 결과를 검수하는 역할만 하면 됩니다.