자동화 · 2026

오픈마켓 주문서 기반 라벨 인쇄 원본 생성 프로그램

네 곳의 마켓에서 내려받은 주문서를 읽어 인쇄용 PSD 조판 파일을 만드는 데스크톱 앱

마켓별로 제각각인 주문서 엑셀을 읽어 주문 옵션대로 라벨을 배치하고, 인쇄소에 바로 넘길 수 있는 300dpi PSD 조판 파일을 자동으로 만듭니다. 처리하지 못한 주문은 사유와 함께 따로 보여 줍니다.

고객
비공개 고객
분야
자동화
생성된 PSD 조판 파일. 눈금자 배경 위에 이름 문구와 이미지가 들어간 라벨이 띠 단위로 배치되어 있다

개요

어린이집 가방이나 의류에 붙이는 면 네임라벨을 주문 제작해 오픈마켓에 파는 업체를 위해 만든 Windows 데스크톱 프로그램입니다. 구매자가 주문할 때 고른 문구, 라벨 크기, 캐릭터 이미지, 폰트를 그대로 읽어 인쇄용 조판 파일을 만듭니다.

하루치 주문서를 프로그램에 끌어다 놓고 버튼 하나를 누르면, 마켓과 라벨 높이별로 나뉜 PSD 파일이 나옵니다. 각 PSD는 실제 원단 폭에 맞춘 60 × 32 cm 판이고, 라벨이 띠 단위로 채워져 있어 그대로 인쇄 공정으로 넘어갑니다.

주문서 목록과 생성 버튼만 있는 메인 화면
메인 화면

과제

주문은 스마트스토어, 쿠팡, ESM, 11번가 네 곳에서 따로 들어오고, 마켓마다 주문서 엑셀의 열 구성과 옵션 표기 방식이 전부 다릅니다. 같은 "1.5 cm / A 디자인 / 3번 폰트"라는 주문이 마켓마다 다른 칸에 다른 문자열로 적혀 있습니다.

이전에는 이 주문서를 보면서 포토샵에서 라벨 한 칸씩을 직접 배치했습니다. 글자 길이가 제각각이라 칸마다 폰트 크기를 눈으로 맞춰야 했고, 라벨 높이가 바뀌면 판 전체를 다시 짜야 했습니다. 주문 하나를 빠뜨리거나 다른 문구를 넣어도 인쇄가 끝난 뒤에야 알 수 있었습니다.

해결 방법

주문서 파일을 창에 끌어다 놓고 생성 버튼을 누르면 나머지는 프로그램이 처리합니다.

  • 주문서의 머리글 위치를 보고 어느 마켓의 주문서인지 스스로 판별합니다
  • 마켓별 상품번호를 등록된 디자인에 연결하고, 옵션 문자열에서 문구, 라벨 높이, 이미지 번호, 폰트 번호를 뽑아냅니다
  • 주문 수량만큼 라벨을 배치해 마켓과 라벨 높이별로 PSD 파일을 나눠 저장하고, 한 판이 다 차면 다음 파일로 넘어갑니다
  • 비밀번호가 걸린 주문서는 비밀번호를 받아 복호화한 뒤 읽습니다

생성이 끝나면 주문서별 처리 현황과 주문 한 건 단위의 결과를 함께 보여 줍니다. 어떤 주문이 어느 PSD 파일에 들어갔는지 행 번호와 주문번호로 확인할 수 있고, 처리하지 못한 주문은 상품번호 오류, 옵션 파싱 실패, 정의되지 않은 디자인처럼 사유별로 나뉘어 표시됩니다.

주문서별 처리 현황과 주문 단위 결과를 보여 주는 생성 결과 화면
생성 결과 화면

생성된 판은 바로 인쇄에 넘길 수 있는 상태입니다. 라벨이 행 단위로 묶인 레이어 그룹으로 들어 있어, 필요하면 포토샵에서 특정 라벨만 열어 고칠 수 있습니다.

생성된 PSD 조판 파일. 눈금자 배경 위에 이름 문구와 이미지가 들어간 라벨이 띠 단위로 배치되어 있다
생성된 조판 파일

시스템 구조

구성

  • 화면: wxPython 데스크톱 UI
  • 조판: Pillow로 라벨 한 칸을 그리고 psd-tools로 레이어 구조를 가진 PSD를 만듦
  • 저장소: 로컬 SQLite 하나에 디자인, 사이즈별 타입, 이미지, 폰트를 모두 보관
  • 배포: PyInstaller로 묶은 단일 실행 폴더

데이터 흐름

  1. 주문서 엑셀을 읽어 마켓을 판별하고 행 단위로 주문을 해석한다
  2. 주문의 상품번호로 디자인을, 옵션으로 타입과 이미지와 폰트를 찾는다
  3. 디자인 좌표를 라벨 높이에 맞춰 비례 확대하고 한 칸을 그린다
  4. 한 띠를 가로로 채우고, 판이 가득 차면 새 PSD를 연다
  5. 완성된 판들을 저장하고 주문별 결과를 돌려준다

구현

사이즈 하나만 설계하면 나머지가 따라오게

디자인은 라벨 높이 1.5 cm를 기준으로 한 번만 설계합니다. 이미지와 텍스트 상자의 좌표와 크기를 모두 cm로 저장하고, 2 cm나 4 cm 라벨은 같은 값을 비율만큼 곱해서 씁니다. 높이가 추가되어도 디자인을 다시 짤 필요가 없습니다.

관리 화면에서는 캔버스 위의 상자를 끌어 옮기거나 모서리를 잡아 늘릴 수 있고, 같은 값이 아래 수치 입력란과 양방향으로 연결되어 있습니다. 상자가 라벨 밖으로 나가지 않도록 각 항목의 최대값은 다른 항목의 현재 값에 따라 다시 계산됩니다.

이미지와 텍스트 상자를 끌어서 배치하는 디자인 편집 화면
디자인 편집 화면

글자가 상자를 넘지 않도록

이름 길이는 주문마다 다릅니다. 텍스트 상자에 들어갈 가장 큰 폰트 크기를 이분 탐색으로 찾아 적용하고, 좌우 정렬은 기준점 기반으로 그려서 글자 끝이 잘리지 않게 했습니다.

어느 컴퓨터에서든 같은 결과가 나오도록

폰트는 이름만 저장하지 않고 TTF 파일 자체를 데이터베이스에 담아 둡니다. 실행할 때 임시 파일로 풀어 비공개 폰트로 등록하기 때문에, 그 폰트가 설치되어 있지 않은 컴퓨터에서도 같은 글자 모양이 나옵니다. 디자인마다 폰트 슬롯을 두고 주문의 폰트 번호와 연결합니다.

디자인별 폰트 슬롯과 실제 글꼴로 그려지는 미리보기
폰트 슬롯

입력 이미지의 색을 맞춰서

업체가 등록하는 캐릭터 이미지는 촬영 앱이나 편집 프로그램에 따라 색 프로파일과 회전 정보가 제각각입니다. 등록 시점에 EXIF 회전을 적용하고 ICC 프로파일을 sRGB로 변환한 뒤 저장해, 인쇄물에서 색이 틀어지는 경우를 줄였습니다.

사이즈별 타입과 이미지를 관리하는 화면
이미지 관리 화면

화면이 멈추지 않도록

주문서 해석은 작업 스레드에서 돌리면서 진행 상황을 화면에 올려 주고, 무거운 PSD 저장은 별도 프로세스 풀로 나눠 처리합니다. 한 판에 수백 개의 레이어가 들어가기 때문에 저장이 전체 작업에서 가장 오래 걸리는 구간입니다.

업데이트가 기존 데이터를 건드리지 않도록

현장에 이미 쌓인 디자인과 이미지를 유지한 채로 프로그램만 교체할 수 있어야 했습니다. 실행할 때 모델 정의와 실제 테이블을 비교해 빠진 컬럼만 추가하도록 해서, 기능이 늘어도 기존 데이터베이스를 그대로 씁니다.

결과

주문서를 열어 보고 포토샵에서 판을 짜던 과정이 파일을 끌어다 놓고 버튼을 누르는 작업으로 바뀌었습니다. 라벨 높이별 조판, 칸 수 계산, 글자 크기 맞추기처럼 사람이 눈으로 하던 일을 프로그램이 대신합니다.

주문 한 건이 어느 PSD 파일의 결과물인지 화면에서 바로 확인할 수 있어, 인쇄 전에 누락과 오입력을 걸러 낼 수 있게 되었습니다. 처리하지 못한 주문도 조용히 빠지지 않고 사유와 함께 남습니다.

새 상품이나 새 캐릭터 이미지가 생겼을 때 개발자를 거치지 않고 관리 화면에서 직접 디자인, 이미지, 폰트를 등록할 수 있습니다.

사용 기술

  • Python
  • wxPython
  • Pillow
  • psd-tools
  • SQLAlchemy
  • SQLite
  • openpyxl
  • PyInstaller

화면

진행하려는 프로젝트가 있으신가요?

해결하려는 문제와 지금 상황을 알려 주시면, 어떤 방식이 맞을지 함께 검토합니다.

프로젝트 문의하기