이미지 프롬프트 생성기, DALL-E 모드에만 있는 숨은 버그
Midjourney·DALL-E·Stable Diffusion 세 가지 모델용 프롬프트를 자동으로 만들어주는 도구가 있다면, 세 모델 모두 같은 방식으로 값이 조립될 것이라 생각하기 쉽습니다. 하지만 실제 소스 코드를 뜯어보면 DALL-E 모드만 완전히 다른 조립 방식을 쓰고 있고, 그 차이 때문에 눈에 보이는 공백 버그와, 눈에 안 보여서 더 위험한 네거티브 프롬프트 소실 버그가 동시에 존재합니다. 이 가이드는 실제 도구의 JS 코드를 그대로 인용해서 두 버그가 정확히 어디서, 왜 생기는지 설명합니다.
1. 모델별로 조립 방식이 다르다
이 도구는 스타일·분위기·조명·카메라·품질태그 등 사용자가 고른 값들을 parts라는 배열에 모아둡니다. 문제는 이 배열을 최종 프롬프트 문자열로 바꾸는 방식이 모델마다 다르다는 점입니다. Midjourney와 Stable Diffusion 모드는 다음처럼 배열을 그대로 이어붙입니다.
prompt = parts.join(', ');쉼표+공백 하나만 각 요소 사이에 들어가므로 값이 몇 개든, 비어있든 문제가 생기지 않습니다.
반면 DALL-E 모드는 배열을 쓰지 않고, 값을 문장 템플릿 리터럴에 직접 끼워 넣는 방식을 씁니다.
prompt = `A ${mood?mood+' ':''} ${style?style+' image of ':''} ${subject}`;
2. 공백 중복 버그: 삼항연산자와 템플릿 고정 공백의 충돌
위 코드를 자세히 보면 문제가 두 겹으로 겹쳐 있습니다. 첫째, mood?mood+' ':'' 부분은 mood 값이 있을 때 이미 그 값 뒤에 공백 하나(+' ')를 직접 붙입니다. 둘째, 그 뒤 템플릿 리터럴 자체에도 ${...} 사이사이에 고정된 공백이 그대로 남아 있습니다. 즉 값이 있을 때는 "값이 붙인 공백"과 "템플릿이 원래 갖고 있던 공백"이 겹쳐서 단어 사이에 공백이 두 번씩 들어갑니다.
더 눈에 띄는 문제는 값이 없을 때입니다. mood나 style을 선택하지 않으면 삼항연산자는 빈 문자열('')만 반환하지만, 그 자리 앞뒤에 있던 템플릿의 고정 공백은 삼항연산자와 무관하게 그대로 남습니다. 그 결과 스타일·분위기를 아무것도 선택하지 않고 주제만 "a cat"으로 입력하면 실제 출력은 다음과 같습니다.
"A a cat" — "A"와 "a cat" 사이에 공백이 3개.스타일·분위기를 둘 다 선택한 경우:
"A dramatic photorealistic image of a cat" — 단어 사이 공백이 매번 2개.
3. 네거티브 프롬프트가 조용히 사라지는 버그
더 심각한 문제는 네거티브 프롬프트(제외하고 싶은 요소)입니다. 이 도구는 모델 선택과 무관하게 항상 네거티브 프롬프트 입력창을 보여주고, 입력도 정상적으로 받습니다. 하지만 실제로 그 값을 최종 프롬프트에 반영하는 코드는 모델별로 완전히 갈립니다.
| 모델 | 네거티브 프롬프트 처리 코드 |
|---|---|
| Midjourney | if(negative)prompt+=` --no ${negative}`; — 정상 반영 |
| Stable Diffusion | if(negative)prompt+=`\nNegative prompt: ${negative}`; — 정상 반영 |
| DALL-E | 해당 분기 코드 전체에 negative 변수를 참조하는 줄이 단 한 줄도 없음 |
즉 사용자가 DALL-E 모드에서 "blurry, low quality, text" 같은 네거티브 프롬프트를 입력해도, 생성 버튼을 눌렀을 때 그 값은 어디에도 쓰이지 않고 조용히 버려집니다. 에러도, 경고도 뜨지 않습니다 — 입력창이 계속 활성화돼 있으니 사용자는 자신이 입력한 내용이 반영됐다고 믿기 쉽습니다.
4. 이게 버그인가, DALL-E의 한계인가
여기서 짚어야 할 중요한 구분이 있습니다. DALL-E의 공식 API 자체가 Midjourney의 --no 파라미터나 Stable Diffusion의 negative prompt 같은 "네거티브 프롬프트" 개념을 지원하지 않는다는 것은 사실입니다. 이건 이 도구만의 문제가 아니라 OpenAI DALL-E API의 실제 설계 특성입니다. 하지만 그 사실과 별개로, 이 도구가 DALL-E 모드에서도 네거티브 프롬프트 입력창을 비활성화하거나 안내 문구를 띄우지 않고 계속 입력 가능한 상태로 놔둔다는 것은 순수하게 UX/구현 버그입니다. API가 지원하지 않는다면 최소한 그 사실을 사용자에게 알려야 하는데, 이 도구는 그렇게 하지 않습니다.
5. 실무 대응: DALL-E에서 네거티브 프롬프트 대신 쓸 방법
DALL-E용 프롬프트를 만들 때는 애초에 "제외" 개념을 쓸 수 없다는 걸 알고, 원하지 않는 요소를 긍정문으로 바꿔 본문에 녹이는 방식으로 우회해야 합니다. 예를 들어 "no text"라고 제외 지시를 넣는 대신, 본문 프롬프트 자체에 "a clean image with no visible text or lettering"처럼 긍정적으로 서술하는 식입니다. 이 방식이 완벽하지는 않지만, DALL-E API에 존재하지도 않는 채널에 값을 흘려보내는 것보다는 실제로 결과에 영향을 줍니다.
자주 묻는 질문
Q. 공백 중복 버그는 실제로 재현되나요?
A. 네. 실제 코드(prompt=\`A ${mood?mood+' ':''} ${style?style+' image of ':''} ${subject}\`)를 그대로 실행하면, 스타일·분위기 미선택 시 "A"와 주제 사이에 공백 3개, 선택 시 단어 사이마다 공백 2개가 재현됩니다.
Q. 네거티브 프롬프트를 입력했는데 DALL-E 결과에 왜 반영이 안 되나요?
A. DALL-E 분기 코드에는 negative 변수를 참조하는 코드가 아예 없기 때문입니다. Midjourney·Stable Diffusion 분기에만 반영 코드가 있고, DALL-E 분기는 입력값을 그대로 무시합니다.
Q. Midjourney·Stable Diffusion 모드에도 같은 공백 문제가 있나요?
A. 아니요. 두 모드는 parts.join(', ')로 배열을 이어붙이는 방식이라 값이 몇 개든 정확히 쉼표 하나씩만 들어가며, 이번 버그와 무관합니다. 문제는 DALL-E 분기의 템플릿 리터럴 조립 방식에서만 발생합니다.
Q. DALL-E는 원래 네거티브 프롬프트를 지원하지 않나요?
A. 맞습니다. DALL-E API 자체가 이 개념을 공식 지원하지 않습니다. 다만 이 도구가 DALL-E 모드에서도 네거티브 프롬프트 입력창을 계속 활성화 상태로 보여주는 것은 API 제약과는 별개의 UX 결함입니다.