유피테르
유피테르
🧙 AI 위자드
🏅 베스트오브베스트

이미지 생성 실패, 기관 포맷 누락, 웹 업로드 잘림을 고쳐 법무 뉴스레터를 완성한 과정

모델을 여러 번 바꿨지만 이미지가 나아지지 않았다. 26개 자동 검사를 모두 통과한 뉴스레터에서는 정작 법무처 표기가 빠졌고, 형식을 복원한 긴 PNG는 웹 게시판에서 잘렸다. 문제를 보여주려고 올린 화면 캡처마저 Slack 권한 부족으로 읽을 수 없었다. 이번 작업은 네 번의 실패를 각각 고친 뒤 제작·검수·발송·웹 배포 절차를 하나의 스킬로 묶은 기록이다.

시작은 평범한 뉴스레터 제작이었다

요가·필라테스 장기 선결제 계약의 중도 해지 환급 기준을 설명하는 뉴스레터를 만들었다. 원문에서 벗어난 법률 해석은 추가하지 않고, 독자가 먼저 분쟁의 맥락을 이해한 뒤 결론을 읽도록 본문을 네 부분으로 나눴다.

구성은 다음과 같았다.

  1. 장기 선결제 할인 계약에서 분쟁이 생기는 이유

  2. 환급금 계산의 기준이 할인 전 정상가가 아니라 실 결제금액이라는 점

  3. 공정위가 지적한 환급금 과소 산정 관행

  4. 헬스장·피부관리 계약 등 유사 업종에 미칠 가능성과 한계

가로 폭은 700px로 정했다. 데스크톱에서는 본문 400px, 이미지 280px, 간격 20px로 배치했다. 홀수 섹션은 본문 왼쪽·이미지 오른쪽, 짝수 섹션은 그 반대다. 모바일에서는 한 열로 쌓이도록 했다.

본문과 레이아웃까지는 순조로웠다. 문제는 이미지부터 시작됐다.

첫 번째 실패: 모델을 바꿔도 이미지가 좋아지지 않았다

첫 번째 인포그래픽의 주제는 분쟁의 흐름이었다. 선결제 할인, 중도 해지, 정상가 공제, 환급금 분쟁을 한 장에서 읽을 수 있어야 했다.

처음 만든 이미지는 정보 자체는 들어 있었지만 제목의 위계가 약했다. 분쟁의 흐름이 전체 제목이 아니라 왼쪽 아래의 작은 장식처럼 보였다. 제목을 상단 중앙으로 옮긴 뒤에는 레이아웃이 나아졌지만, 질감과 서체가 여전히 일반적인 AI 일러스트에 가까웠다.

여기서 흔히 하는 선택을 했다. 더 좋은 모델을 쓰면 해결될 것이라고 생각했다.

실제로 겪은 실패

  • gpt-image-2를 private Codex와 codex-cli 경로로 호출했지만 현재 ChatGPT Codex 계정에서 지원되지 않았다.

  • gpt-image-1.5도 HTTP 400과 함께 같은 이유로 실패했다.

  • Hermes의 FLUX 2 Klein 9B는 이미지 생성에는 성공했지만 편집 엔드포인트가 Portal 프록시에서 403을 반환했다.

  • FLUX로 새로 만든 후보에는 가짜 문자와 불필요한 숫자가 섞였다.

  • 한국어를 이미지 모델에 직접 맡기면 글자는 읽혀도 서체의 위계가 흐려지거나, 일부 글자가 일러스트처럼 변했다.

모델 이름만 바꿔서는 해결되지 않았다. 생성 경로와 글자 처리 방식이 더 큰 문제였다.

이미지 문제를 푼 방법: 구조와 문자를 분리했다

해결책은 한 번에 완성된 이미지를 얻으려는 시도를 버리는 것이었다.

먼저 이미지 모델에는 정보 구조와 질감, 색상, 도형 배치에 집중하도록 했다. 가짜 문자와 숫자가 적은 후보를 골랐고, 남은 오류는 로컬 후처리로 제거했다. 정확해야 하는 한국어는 별도의 오버레이로 관리했다.

그다음 사용자가 알려준 god-tibo-imagen 저장소를 다시 확인했다. 로컬 패키지를 0.3.0에서 0.3.1로 업데이트하면서 호출 방식도 바로잡았다. gpt-image-2를 모델 이름으로 직접 지정하는 방식이 아니라, Codex 조정 모델 gpt-5.4가 private backend의 내장 image_generation 도구를 호출하도록 해야 했다.

이 경로로 만든 v06은 구도와 질감이 안정적이었다. 마지막 남은 문제는 서체였다. v06을 다시 참조 이미지로 넣고 글자만 현대적인 한국어 고딕체로 바꿨다.

  • 전체 제목: ExtraBold

  • 네 단계 제목: Bold

  • 말풍선: Medium

이렇게 만든 v07에서야 분쟁의 흐름이 첫눈에 들어오고, 280px로 축소해도 여섯 개의 한국어 문구를 읽을 수 있었다.

첫 장을 승인받은 뒤에는 그 이미지를 스타일 기준으로 사용했다. 두 번째 이미지는 할인 전 정상가 × / 실 결제금액 ○, 세 번째는 환급금 과소 산정의 진행 과정, 네 번째는 유사 업종 적용 가능성과 확정적 적용 아님을 표현했다. 네 장 모두 700×700px PNG로 맞췄다.

첫 이미지는 v01에서 v07까지 갔다. 이 과정에서 얻은 결론은 단순했다. 한국어 인포그래픽은 모델 하나에 모두 맡기기보다 다음 세 층으로 나누는 편이 안정적이었다.

  1. 이미지 모델이 구도와 질감을 만든다.

  2. 참조 이미지로 시각 스타일을 고정한다.

  3. 정확한 한국어와 글자 위계는 별도로 검수하거나 오버레이한다.

한국의 법적 절차를 보여주는 포스터

두 번째 실패: 자동 검사는 통과했지만 뉴스레터 포맷이 달랐다

네 장의 이미지를 조립한 뒤 HTML과 Markdown을 만들었다. 이미지 경로, 섹션 순서, 700px 폭, 지그재그 배열, 모바일 적층, 핵심 법률 문구를 자동 검사했다. 결과는 26/26 통과였다.

Playwright로 데스크톱과 모바일도 렌더링했다. 모바일 제목의 단어 중간 줄바꿈을 수정했고, 700px 단일 PNG도 만들었다. 파일은 열렸고 이미지도 잘 보였다. 기술적으로는 완성된 것처럼 보였다.

하지만 사용자가 이전 호의 HTML과 비교하자 문제가 바로 드러났다.

본문 배열과 이미지는 괜찮았지만, 뉴스레터의 기관 정체성이 사라져 있었다.

  • 상단 7월의 LEGAL 뉴스가 없었다.

  • *********사 ***처 · ****부 표기가 빠졌다.

  • 흰색 타이틀 카드와 ****부 배지가 없었다.

  • 하단 *****처 고정 문구도 없었다.

  • 전체 색상은 기존 샘플의 남색·흰색 계열이 아니라 베이지색 중심이었다.

26개 검사는 모두 통과했지만, 가장 중요한 포맷은 틀렸다. 자동 검사가 본문과 파일 구조만 확인했고, 이전 뉴스레터가 가진 기관용 외곽 틀을 검사하지 않았기 때문이다.

포맷을 다시 맞춘 방법: 이전 호를 디자인 계약으로 읽었다

첨부된 이전 HTML을 열어 CSS 변수와 문서 구조를 직접 추출했다. 이번에는 “비슷한 느낌”을 내는 것이 아니라, 바뀌지 않아야 할 요소와 이번 호에서 바뀌는 요소를 나눴다.

매호 유지해야 하는 요소

  • ***********사 *****처·*******부 표기

  • 월별 LEGAL 뉴스 헤더

  • 흰색 메인 타이틀 카드

  • 부서 배지와 발행 정보

  • 고정 푸터 문구

  • 메인 남색 #283C61

  • 보조 남색 #3A5280

  • 이미지 영역 #EDF0F6

  • 월 숫자 강조색 #F5C842

이번 호에 맞게 바꾸는 요소

  • 발행 월

  • 제목과 부제

  • 네 섹션의 제목과 본문

  • 승인된 인포그래픽 네 장

기존 결과는 v01로 백업했다. 사용자가 이미 괜찮다고 한 문단 순서, 이미지, 700px 지그재그 배치는 건드리지 않았다. 기관 헤더와 타이틀 카드, 색상, 푸터만 이전 호의 형식에 맞췄다.

수정본은 700×2903px PNG로 다시 렌더링했다. 390px 모바일 화면에서도 한 열 적층, 한국어 줄바꿈, 이미지 너비, 푸터를 확인했다. 기존 26개 자동 검사와 함께 실제 화면을 이전 샘플과 눈으로 비교했다.

다양한 정보가 담긴 포스터

세 번째 실패: 완성된 PNG가 웹 게시판에서 잘렸다

기관 포맷을 복원한 v02는 파일 자체로는 정상이었다. 가로 700px, 세로 2903px였고, 로컬 이미지 뷰어와 Playwright 렌더링에서는 처음부터 푸터까지 모두 보였다. 그러나 실제 웹 게시판에 단일 이미지로 올리자 아래쪽이 잘렸다.

이 문제는 뉴스레터 내용이나 PNG 손상이 아니라 배포 환경의 제약이었다. 웹 편집기 중에는 긴 이미지를 고정 높이 컨테이너 안에 넣거나, 미리보기 단계에서 높이를 제한하고 overflow: hidden 또는 유사한 크롭 동작을 적용하는 곳이 있다. 파일이 정상이라는 검증만으로는 실제 게시 화면을 보장할 수 없었다.

해결할 때 임의의 1000px 간격으로 자르지 않았다. HTML에서 네 개 섹션 헤더와 본문 표의 실제 위치를 읽어 의미 단위 경계를 잡았다.

  1. 표지와 Section 1

  2. Section 2

  3. Section 3

  4. Section 4, 핵심 요약, 푸터

700px 원본 세트와, 폭이 좁은 게시판을 위한 600px 세트를 함께 만들었다. 각 경계는 제목·문장·인포그래픽 바깥에 놓았다. 네 장을 순서대로 올렸을 때 내용이 빠지거나 반복되지 않는지도 접촉 시트로 확인했다.

이 과정에서 배포본의 정의도 달라졌다. 이제 최종 산출물은 긴 700px master 한 장만을 뜻하지 않는다. 원본 master, 이메일 첨부본, 웹 게시판용 700px·600px 분할본이 각각 별도 배포 규격이다.

네 번째 장애: 잘린 화면을 보여주는 캡처조차 읽을 수 없었다

사용자가 잘린 화면을 Slack에 첨부했지만, 에이전트는 파일 대신 HTML/login or non-media response 경고만 받았다. 처음에는 다시 첨부해 달라고 요청했지만 같은 결과가 반복됐다.

Slack 인증 상태와 실제 Bot Token 권한을 읽어 보니 원인이 분명했다.

  • 메시지 작성용 files:write는 있었지만 첨부 다운로드용 files:read가 없었다.

  • 비공개 채널 기록용 groups:history는 있었지만 채널 조회용 groups:read가 없었다.

  • Slack의 비공개 파일 URL을 권한 없는 토큰으로 요청하자 이미지가 아니라 로그인 HTML이 반환됐다.

즉, 이미지 분석 기능이 부족한 문제가 아니었다. 분석할 이미지 바이트가 에이전트에게 도착하지 않은 것이었다. 해결 절차는 Slack 앱의 Bot Token Scopes에 files:readgroups:read를 추가하고, 앱을 워크스페이스에 재설치한 뒤 피카소 게이트웨이를 다시 시작하는 것이다.

이 장애 덕분에 검수 절차에 한 가지가 더 추가됐다. 사용자가 “이렇게 보인다”고 올린 증거를 읽지 못하면 결과물을 추측으로 고치지 않는다. 먼저 첨부 전달 경로와 권한을 확인하고, 증거를 실제로 확보한 뒤 수정한다.

마지막 단계: 제작뿐 아니라 이메일 발송까지 규칙으로 묶었다

결과물을 만드는 것과 보내는 것은 다른 문제였다. 발신 계정을 명시하지 않으면 Gmail이 선택될 수 있었고, Apple Mail의 보낼편지함 객체가 남아 있다고 무작정 다시 보내면 중복 발송 위험이 있었다.

그래서 뉴스레터 제작 스킬에 이메일 발송을 여덟 번째 단계로 추가했다.

  • 기본 발신자는 사용자가 지정한 iCloud 계정

  • 수신 주소를 발송 전에 정확히 확인

  • 버전이 포함된 고유 제목 사용

  • 같은 제목이 보낼편지함이나 보낸편지함에 있으면 발송 차단

  • 발송 명령은 한 번만 실행

  • send_result=true만으로 성공 처리하지 않음

  • iCloud 보낸편지함에서 발신자, 수신자, 단일 Message-ID 한 건을 확인해야 성공으로 기록

  • 검증이 불확실하면 자동 재전송하지 않음

v02는 iCloud에서 한 번 발송했고, 보낸편지함에서 단일 Message-ID 한 건이 유지되는 것을 두 차례 확인했다.

이번 작업에서 바뀐 것

처음에는 뉴스레터 한 편을 만드는 일이었다. 작업이 끝났을 때는 다음을 재사용할 수 있는 newsletter-production v1.2.1 스킬이 남았다.

  • 원문 보존과 승인 기반 8단계 제작

  • 700px 지그재그 레이아웃

  • 한국어 인포그래픽의 구조·문자 분리 방식

  • 이전 호의 기관 포맷을 빠뜨리지 않는 참고 템플릿 충실도 검사

  • 데스크톱·모바일 실제 렌더링

  • 높이 제한이 있는 웹 게시판을 위한 의미 단위 분할 출력

  • Slack 첨부를 읽지 못할 때 scope·파일 전달 경로를 먼저 확인하는 진단 절차

  • iCloud 단일 발송과 중복 방지 검증

가장 큰 교훈은 자동 검사 숫자를 믿지 말라는 것이 아니었다. 검사 항목에 들어 있지 않은 것은 아무리 중요한 요소라도 통과한다는 점이었다. 이미지에서는 한국어 글자와 위계를 별도 검수 항목으로 만들었고, 뉴스레터에서는 기관 헤더와 색상, 푸터를 고정 조건으로 추가했다. 배포 단계에서는 게시판의 실제 렌더링과 Slack 첨부 전달 권한까지 검사 범위를 넓혔다.

실패를 다시 겪지 않으려면 결과물만 고치면 부족하다. 무엇을 놓쳤는지 찾아 다음 작업의 검사표와 도구에 넣어야 한다. 이번 뉴스레터는 그렇게 한 편의 결과물에서 반복 가능한 제작·검수·발송·웹 배포 절차로 바뀌었다.

2
3개의 답글
밀어주고 끌어주는

온·오프라인 AI 스터디

AI로 어디까지 할 수 있는지
직접 확인하실 분만 신청하세요.