- 작성자
1. AI가 웹툰을 만든다고?
웹툰을 만들려면 보통 세 가지가 필요합니다:
- 스토리 — 무슨 이야기를 할 것인가
- 캐릭터 — 누가 등장하는가
- 그림 — 장면을 그리는 것
이 세 가지를 전부 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 레이아웃 템플릿
웹툰의 레이아웃도 미리 정의합니다:

지원하는 레이아웃:
- Grid (2x2) — 4컷 만화, 가장 기본
- Webtoon — 세로 스크롤, 800px 너비
- Single — 한 장짜리 드라마틱 패널
4.2 밈 템플릿
유명한 밈 형식도 템플릿으로 만들어뒀습니다:


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는 SNS에 올리기 좋고, Webtoon은 네이버 웹툰처럼 세로로 읽기 좋습니다.
7. 왜 템플릿 + 캐릭터 사전 설정이 중요한가
AI 이미지 생성에서 가장 큰 문제는 일관성입니다. 매번 "고양이를 그려줘"라고 하면 매번 다른 고양이가 나옵니다. 이걸 해결하는 방법이 사전 설정입니다.

캐릭터 일관성
- 캐릭터의 시각적 특징을 아주 구체적으로 묘사합니다
- "큰 눈", "분홍 코", "빨간 스카프" 같은 디테일이 매 프롬프트에 들어갑니다
- 캐릭터별 고유 액세서리(안경, 모자 등)로 구분합니다
스타일 일관성
- 아트 스타일 지시어를 모든 프롬프트에 동일하게 넣습니다
- "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 Image | Pro 실패 시 대체 |
템플릿과 캐릭터를 한번 세팅해놓으면, 주제만 바꿔가며 웹툰을 계속 만들 수 있습니다. 그림을 못 그려도, 스토리를 못 써도, AI가 다 해줍니다. 사람은 주제를 정하고 결과를 검수하는 역할만 하면 됩니다.