ICEFiction — AI와 함께 쓰는 소설 집필 데스크톱 앱 2026.07.13

ICEFiction 개발기 ⑤: AI에게 표지를 맡겼더니 'A NETVEL GON'이라고 썼다 (v0.7.0)

"글자 쓰지 마"라고 못박았는데 AI는 표지에 엉터리 영문 제목을 그려 넣었다. 범인은 내 프롬프트에 있던 'book cover'라는 두 단어였다. 결국 그림은 AI가, 제목은 앱이 얹기로 했다 — 그림에 구워진 제목은 고칠 수가 없으니까.

AI에게 소설 표지를 그려 달라고 했다. AI는 표지를 그렸고, 거기에 이렇게 썼다.

A NETVEL GON

AI가 그린 표지 — 상단에 'AUHLI BAOKEN', 'A NETVEL GON'이라는 엉터리 영문 글자가 박혀 있다

그림은 훌륭했다. 비 내리는 밤거리, 우산 쓴 사람, 청회색 톤. 딱 내가 말한 대로였다. 그런데 하늘에 저 글자가 박혀 있다. 아무 뜻도 없는 알파벳 조합이. 참고로 나는 프롬프트에 이렇게 못박아 뒀었다. “NO text, no letters, no typography, no title.”

v0.7.0에서 ICEFiction에 AI 이미지 생성을 붙였다. 캐릭터 얼굴과 책 표지. 그 과정에서 알게 된 것들이다.

1. 왜 “글자 쓰지 마”라고 해도 글자를 쓰는가

범인은 내 프롬프트에 있던 두 단어였다. “book cover”“title”.

모델에게 “이건 책 표지야”라고 말하는 순간, 모델은 자기가 학습한 수만 장의 책 표지를 떠올린다. 그리고 책 표지에는 당연히 제목이 있다. 그래서 그린다. 뒤에 “글자 쓰지 마”라고 아무리 덧붙여도, 앞에서 이미 “표지를 그려라”라고 시켜 버린 것이다.

그래서 단어를 바꿨다. “책 표지”가 아니라 “세로 일러스트”. 그리고 no-writing 제약을 훨씬 독하게 걸었다.

A vertical cinematic ILLUSTRATION (wallpaper art, NOT a poster, NOT a book cover).
...
CRITICAL CONSTRAINT — the image must contain ABSOLUTELY NO WRITING of any kind:
no text, no letters, no words, no numbers, no typography, no captions, no titles,
no signage, no shop signs, no billboards, no license plates, no watermark, no logo,
no signature. Every surface that would normally carry writing must be blank.
If you are about to render any glyph or character, do not.

글자가 완전히 사라졌다.

재미있는 건 “NOT a book cover”라고 부정으로 쓰는 건 안전하다는 점이다. 문제가 되는 건 “Book cover for a novel…”처럼 긍정으로 쓸 때다. 같은 단어인데 방향이 반대다.

2. 그림과 활자는 분리하는 게 낫다

그래서 결론은 이렇게 났다.

AI는 글자 없는 그림만 그린다. 제목은 앱이 얹는다.

이유는 엉터리 글자를 피하는 것만이 아니다. 더 실질적인 문제가 있다. 그림에 구워진 제목은 고칠 수가 없다.

글꼴을 바꾸고 싶다? 다시 그려야 한다. 제목을 조금 위로 올리고 싶다? 다시 그려야 한다. 부제를 한 줄 넣고 싶다? 다시 그려야 한다. 오타를 발견했다? 다시 그려야 한다. 그림 한 장 뽑는 데 1분이 넘게 걸리는데, 게다가 다시 그리면 그림 자체가 달라진다. 마음에 들었던 그 구도는 두 번 다시 안 나온다.

그림과 활자를 분리하면 이 모든 게 사라진다. 원본 그림은 따로 보관하고, 제목은 그 위에 얹는 레이어로 둔다. 글꼴·크기·위치·색을 만지면 미리보기가 즉시 따라온다. 재생성 없이.

마침 지난 릴리스에서 나눔명조·나눔고딕·KoPub 바탕·돋움을 앱에 내장해 뒀다. 그 글꼴로 앱이 직접 조판하니 제목이 또렷하게 박힌다.

그래서 그림을 생성할 때 상단 1/3을 비워 두라는 구도 지시를 넣는다. 제목이 앉을 자리다.

ICEFiction 표지 스튜디오 — 왼쪽에 프롬프트와 스타일 바이블, 오른쪽에 그림 위에 제목을 얹은 실시간 미리보기

3. 결과

완성된 표지 — AI가 그린 비 내리는 도시 그림 위에 나눔명조로 '폭우의 도시'가 얹혀 있다

그림은 AI가 77초에, 제목은 앱이 나눔명조로. 위쪽 하늘이 비어 있는 건 우연이 아니라 그렇게 시켰기 때문이다.

캐릭터도 같은 방식으로 그린다. 인물 시트(이름·시놉시스·본문)에서 프롬프트 초안을 뽑고, 내가 고친 뒤 생성한다. 나온 얼굴은 자동으로 그 인물의 프론트매터에 붙고, 캐릭터 갤러리의 표지가 된다.

AI가 생성한 캐릭터 얼굴 — 비 내리는 밤거리를 배경으로 선 여성 기자

“스타일 바이블”을 책에 저장해 두면 모든 그림이 같은 화풍으로 나온다. 장편에서 인물 열 명을 그렸는데 화풍이 제각각이면 쓸모가 없다.

4. 엔진은 내 컴퓨터에 있다

이미 깔려 있는 CLI 에이전트를 그대로 쓴다. 별도 API 키도, 결제도 없다.

  • agy (Antigravity) — 기본. 내가 codex 사용량 병목을 자주 겪어서 이쪽을 우선으로 뒀다.
  • codex — 폴백. 참고로 *-codex 모델은 이미지 툴을 지원하지 않아서 일반 모델을 써야 한다.
  • gemini — 그 다음.

여기서 하나 배운 게 있다. 에이전트는 실패해도 종료코드 0으로 끝난다. 그림을 못 그려 놓고 “죄송합니다, 이러이러해서…”라고 설명하며 정상 종료한다. 그래서 성패 판정을 종료코드가 아니라 “결과 파일이 실제로 생겼는가, 그리고 그게 방금 만들어진 것인가”로 한다.

5. 이번에도 타입 검사는 아무것도 못 잡았다

버그 네 개를 잡았다. 넷 다 타입 검사와 빌드를 멀쩡히 통과했다.

① 표지를 저장할 수가 없다

그림 위에 제목을 얹으려면 <canvas>에 그린 다음 이미지로 내보내야 한다. 그런데 그림을 앱 내부 프로토콜로 불러오니 “오염된(tainted) 캔버스”가 되어 내보내기가 보안 오류로 막혔다. 표지 만들기가 통째로 불가능하다는 뜻이다.

② 그래서 CORS를 켰더니, 이번엔 그림이 아예 안 뜬다

①을 고치려고 크로스오리진 설정을 붙였다. 그러자 이미지가 로드조차 되지 않았다.

Cross origin requests are only supported for protocol schemes:
http, https, data, chrome, chrome-extension, ...

커스텀 프로토콜은 애초에 CORS 대상이 아니었던 것이다. 프로토콜을 등록할 때 corsEnabled 권한을 함께 줘야 비로소 성립한다. ①과 ②는 한 쌍이었다 — 둘 다 해야 되고, 하나만 하면 각각 다른 방식으로 깨진다.

③ 캐릭터를 그린 다음 표지를 그리면 깨진다

순서가 있어야만 터지는 버그. 모달이 이전에 그린 이미지의 주소를 물고 있다가, 표지용 로직을 캐릭터 이미지에 적용해 버렸다. 표지만 단독으로 테스트하면 절대 안 나온다. E2E를 실제 사용 순서대로 짰기 때문에 잡혔다.

④ “그리기”를 누르는 순간 파일이 깨질 수 있었다

가장 조용하고 가장 위험했던 것. 버튼 하나를 누르면 두 가지가 동시에 저장된다 — 스타일 설정과 표지 정보. 그런데 둘 다 같은 파일을 고친다. 동시에 덤벼들자 윈도우가 권한 오류를 뱉었다.

에러가 난 건 차라리 다행이었다. 타이밍이 조금만 달랐으면 에러 없이 한쪽 저장이 조용히 사라졌을 것이다. 파일 쓰기를 책 단위로 줄 세워 해결했고, E2E를 세 번 반복해 확인했다.

검증

  • 타입 0 / 유닛 57 / 편집기 E2E 32 / 책장 E2E 5 / 이미지 E2E 8(신규)
  • 이미지 E2E는 AI 호출만 가짜로 바꾸고 나머지 배선은 전부 진짜로 돌린다 — 저장, 첨부, 갤러리 반영, 캔버스 오염 검사, 제목 합성, 표지 저장까지. 매번 진짜 그림을 뽑으면 몇 분씩 걸리니까.
  • 패키지 스모크 — 개발 빌드가 아니라 설치파일과 동일한 산출물을 띄워 다시 확인한다. 위 ②번 같은 프로토콜 권한은 패키지에서 따로 깨질 수 있다.
  • 실기: 앱에서 실제로 표지 한 장 생성(77초) + 제목 합성 확인.

이번 작업의 교훈은 이거다. AI에게 무엇을 시키지 말지를 정하는 게, 무엇을 시킬지 정하는 것만큼 중요하다.

모델은 그림을 잘 그린다. 그러면 그림만 시키면 된다. 제목은 언제든 고칠 수 있어야 하고, 고칠 때마다 그림이 바뀌면 안 된다. 그건 모델의 일이 아니라 코드의 일이다.

잘하는 것만 시키고, 나머지는 내가 채운다. 그게 더 빠르고 결과도 좋았다.

AI가 “A NETVEL GON”이라고 쓴 그 표지가, 결국 제일 좋은 스승이었다.

ICEFiction — AI와 함께 쓰는 소설 집필 데스크톱 앱 프로젝트로