약사 한 명이 운영하는 동네 약국. 매대에 붙일 가격택을 매달 새로 만들어야 한다. 요구사항은 카톡으로 왔다. 색상, 약 이름, 설명, 가격, 몇 포. 멘트는 본인이 고치되 AI가 추천해 주면 좋겠다. 출력해서 코팅해 붙인다.
1. 실물을 먼저 받는다
처음엔 이름을 본문에, 설명 한 줄, 가격은 우하단에 놓았다. 매대 사진 세 장을 받고 전부 뒤엎었다. 실제 택은 이랬다. 컬러 밴드 안에 제품명과 작은 제형, 파란 불릿 두세 줄(강조는 빨강), 하단 정중앙에 큰 빨간 가격과 개입수. 제조사는 안 찍는다.
한국 오프라인 인쇄물은 참고 실물 없이 설계하지 않는다. 손님이 60대라면 그 사람이 매대에서 읽는 크기가 기준이다. 실제로 첫 출력 뒤 "노인 손님이 못 읽는다"는 피드백으로 설명 글씨를 택 폭에 꽉 채우도록 바꿨다.
2. 브라우저 인쇄가 아니라 서버 PDF
크롬 인쇄창에는 "배경 그래픽" 체크박스가 있다. 꺼져 있으면 컬러 밴드가 빠진 채 인쇄된다. 약사가 매달 그 체크박스를 기억할 거라고 기대할 수 없다. 그래서 서버에서 WeasyPrint로 PDF를 만든다. 클릭하면 항상 같은 결과가 나온다.
3. 미리보기는 PDF와 같은 HTML
미리보기용 마크업을 따로 만들면, 코팅을 끝낸 뒤에 어긋난 걸 발견한다. 미리보기는 PDF를 만드는 HTML 그 자체를 iframe에 넣는다. 화면에서 본 것이 종이에 나온다.
4. 생성기가 아니라 카탈로그
진짜 병목은 만드는 게 아니라 매달 유지하는 것이다. 세션마다 새로 만드는 생성기가 아니라 데이터가 남는 카탈로그로 지었다. 두 번째 출력부터는 5분이다.
그래서 엑셀 재임포트는 아무것도 지우지 않는다. 파일에 없는 약은 삭제가 아니라 비활성이다. 처음 버전은 "기존 데이터 교체" 체크박스 하나로 승인해 둔 멘트 수백 개를 영구 삭제할 수 있었다. 그건 데이터가 남는 도구에서 있을 수 없는 동작이다. 이름 대조도 공백·괄호·대소문자만 무시하고 숫자와 단위는 남긴다. 160mg과 500mg은 다른 약이다.
5. AI 멘트는 초안까지
멘트 초안은 Gemini가 쓴다. 하지만 약사법 제68조가 금지하는 효능 과장·의약품 광고 표현은 모델을 믿지 않고 코드에서 걸러낸다. 금지어 목록과 정제 함수가 프롬프트와 별개로 있고, 최종 승인은 약사가 택마다 누른다. 일괄 덮어쓰기 버튼은 요청으로 없앴다. 개별 조작이 기본이다.
139개 SKU를 적재하고 첫 실물을 출력했다. 5.5cm 기준선이 맞는지는 종이를 잘라 매대에 붙여 봐야 안다. 그것도 기록에 남겨 두었다.