편의점 알바하며 배운 바코드 이야기 — Code 39, Code 128, EAN-13, QR 차이
대학 2학년 때 동네 편의점에서 야간 알바를 8개월 정도 했습니다. 그때 제일 짜증났던 게 뭐였냐면, 새벽 2시에 대학생이 컵라면을 들고 왔는데 바코드가 안 찍히는 상황이었어요. 손님은 피곤한 얼굴로 저를 쳐다보고, 저는 뒤쪽 포스기에 숫자 13자리를 하나씩 눌러야 했죠. 어떨 땐 바코드 라벨 자체가 구겨져서 아예 못 읽는 경우도 있었고요. 그때는 "왜 이따구야"라고 속으로만 욕하고 말았는데, 지금 개발자가 되고 보니 그 13자리 숫자 뒤에 생각보다 복잡한 체계가 숨어 있다는 걸 알게 됐습니다.
이 글은 그때의 경험 + 회사에서 재고 관리 시스템 만들면서 공부했던 내용을 섞어서 정리한 거예요. 바코드 규격이 4~5가지가 돌아다니는데, 막상 "뭘 써야 해요?"라고 물어보면 답이 제각각이더라고요.
왜 바코드는 이렇게 여러 종류인가
처음엔 저도 궁금했습니다. 그냥 검은 줄 몇 개인데 왜 규격이 여러 개야? 답은 간단해요. 용도가 달라서입니다. 편의점 상품은 전 세계에서 동일한 형식이어야 하니까 고정 자릿수를 씁니다. 반면 택배 송장처럼 내부에서만 쓰는 건 자릿수가 유동적이어야 하고, 오히려 영문·기호까지 들어가야 하죠. 한 규격으로 다 처리하려고 했으면 지금처럼 효율적으로 돌아가지 못했을 겁니다.
역사적으로 바코드 아이디어 자체는 1948년에 나왔는데, 실제로 상업 매장에서 처음 찍힌 건 1974년 6월 오하이오주의 한 슈퍼마켓이었습니다. 리글리 츄잉껌 한 팩. 저는 처음 이 사실을 알았을 때 "겨우 50년이네" 싶었어요. 그 사이에 물류 산업 전체가 뒤집어진 걸 생각하면 대단한 기술이죠.
1차원 바코드가 작동하는 방식
얇은 선과 굵은 선, 그 사이의 공백. 이게 다입니다. 스캐너에서 레이저나 LED를 쏘면 검은 바는 빛을 흡수하고 흰 공백은 반사해요. 반사 강도를 전기 신호로 바꾸면 굵기 패턴이 나옵니다. 그 패턴이 "숫자 5" "문자 K" 같은 식으로 약속돼 있는 거죠. 편의점에서 쓰는 핸디 스캐너나 포스기 바닥에 달린 레이저 스캐너나 원리는 전부 같습니다.
바코드가 안 찍히는 이유도 대부분 여기서 옵니다. 라벨이 구겨지면 선이 왜곡돼서 패턴이 깨져요. 햇볕에 바랬거나 프린터 잉크가 번지는 것도 마찬가지고. 알바 시절 제가 겪은 "안 찍히는 바코드"의 7할은 라벨 문제였습니다.
Code 39 — 오래됐지만 여전히 쓰이는 이유
1974년에 나온 규격인데, 아직도 현장에서 봅니다. 왜냐면 구현이 단순하거든요. 각 글자가 9개 요소(바 5개 + 공백 4개)로 구성되고, 그중 3개가 굵은 요소라서 'Code 3 of 9'이라는 별명이 붙었어요.
대문자 알파벳 A~Z, 숫자 0~9, 그리고 몇 가지 특수문자(-, ., $, /, +, %, 공백)만 지원합니다. 소문자는 안 돼요. 저도 처음에 "왜 대문자만?" 싶었는데, 산업 현장에서 쓰는 표찰에 소문자를 쓸 일이 많지 않아서 그렇답니다. 군수 산업, 자동차 부품, 사원증 같은 데서 자주 봅니다. 체크 디짓이 선택 사항이라 간단하게 뽑을 수 있는 게 장점, 밀도가 낮아서 자리를 많이 차지하는 게 단점이에요.
Code 128 — 물류가 사랑하는 바코드
제가 회사에서 재고 시스템을 만들 때 실무진이 "그냥 128 쓰세요"라고 해서 그대로 썼는데, 써보니 왜 다들 이걸 쓰는지 알겠더라고요. ASCII 128개 문자를 전부 지원하면서도 밀도가 높습니다. 같은 정보라도 Code 39보다 짧게 뽑을 수 있어요.
특히 서브셋 C가 재미있는데, 숫자를 두 자리씩 묶어서 한 글자처럼 처리합니다. "123456"을 넣으면 "12" "34" "56" 이렇게 3글자로 인코딩되는 거죠. 숫자만 있는 데이터면 길이가 대폭 줄어듭니다. 체크 디짓이 필수라 오류 검출 능력도 우수하고요.
택배 송장 아래쪽에 찍혀 있는 긴 바코드, 그거 거의 다 GS1-128이라고 부르는 Code 128 변형입니다. 저도 이걸 알고 나서부터 택배 기다릴 때 괜히 한 번씩 쳐다봅니다.
EAN-13 — 편의점 바코드의 정체
편의점에서 찍는 그 13자리 숫자 바코드. 이게 EAN-13이에요. 전 세계 소매 상품에 붙는 표준 규격입니다. 북미에서만 UPC-A(12자리)를 따로 쓰고, 나머지 세계는 거의 이걸 써요.
13자리 중 처음 3자리는 국가 코드입니다. 한국은 880으로 시작해요. 한국 상품 바코드 살펴보시면 대부분 880으로 시작할 겁니다. 그다음 4~5자리는 제조업체, 또 4~5자리는 개별 상품, 마지막 1자리는 체크 디짓. 이 체크 디짓이 재미있는데, 앞 12자리를 특정 방식으로 계산해서 나온 값이라서 하나라도 숫자를 잘못 읽으면 틀렸다는 걸 감지할 수 있습니다.
알바할 때 제가 수동 입력하다가 숫자 하나 잘못 눌러도 포스기가 "잘못된 바코드입니다" 하고 튕겨내던 이유가 이거였어요. 당시엔 "왜 이 기계는 아무것도 모르면서 틀렸다고 하지"라고 생각했는데, 사실은 가장 똑똑한 기능이었던 겁니다.
💡 개발자 TIP. EAN-13을 직접 생성할 일이 있다면 체크 디짓 계산을 꼭 넣으세요. 라이브러리 대부분은 자동으로 해주지만, 직접 구현할 경우 "홀수 자리 합 + 짝수 자리 합×3"을 10의 배수로 만드는 값이 체크 디짓입니다. 이거 빼먹으면 리테일 POS에서 통과를 못 해요. 저도 초보 시절에 이걸로 반나절을 날린 적이 있습니다.
QR코드가 끼어든 이유
QR코드는 1994년 일본 덴소웨이브가 만들었습니다. 이름이 Quick Response라서 QR이에요. 자동차 부품 관리용으로 만든 게 지금은 전 세계 결제, 메뉴판, SNS 링크까지 점령했죠.
1차원 바코드가 가로 한 방향으로만 정보를 담는 반면 QR은 2차원이라 훨씬 많은 데이터가 들어갑니다. 숫자만이면 최대 7,089자, 영숫자 섞으면 4,296자까지. URL을 통째로 넣어도 여유가 있죠. 그리고 오류 정정 기능이 있어서 일부가 찢어지거나 오염돼도 읽힙니다. 이게 편의점 바코드랑 결정적으로 다른 지점이에요. 편의점 바코드는 조금만 구겨져도 못 읽었는데, QR은 25~30%까지 손상돼도 복원됩니다.
그렇다고 QR이 무조건 우월한 건 아닙니다. 상품 식별처럼 단순한 용도엔 오히려 과잉이에요. 프린터도 더 정교해야 하고, 스캐너도 카메라 기반이라 레이저 스캐너보다 살짝 느립니다. 슈퍼마켓이 아직도 EAN-13을 고수하는 건 이유가 있어요.
실무에서 뭘 써야 하나
이건 제가 질문받으면 답하는 방식입니다. 완벽한 답은 아니지만 90%는 커버해요.
- 소매점에서 물건을 팔 거다 — EAN-13(한국 국내라면 880 발급 필요), 북미 수출도 하면 UPC-A 병기
- 택배나 창고 관리 시스템을 만든다 — Code 128 고민 없이 써도 됩니다. 물류 업계 표준이에요
- 사내 자산 번호, 장비 태그 같은 내부용 — Code 39. 프린터 프로파일이 단순해서 예산을 아낄 수 있습니다
- URL이나 연락처, 이벤트 정보를 넣고 싶다 — 두말할 것 없이 QR
개인적으로 저는 고민되면 Code 128을 먼저 생각합니다. 만능은 아니지만 가장 유연하고, 문자/숫자 어떻게 섞어도 비교적 잘 나오거든요. 반대로 소매 상품이 아닌데 EAN-13을 쓰려는 사람도 가끔 있는데, 그건 국가 번호 체계를 오용하는 거라 권장하지 않습니다.
마지막으로 — 편의점 알바에게 드리는 말
혹시 지금 편의점에서 알바하면서 바코드 안 찍혀서 짜증나는 분이 이 글을 읽는다면, 포스기 어딘가에 "수동 입력" 버튼이 분명히 있습니다. 그리고 13자리 숫자를 누를 때 맨 마지막 자리는 "검증용"이라서 실수로 잘못 눌러도 시스템이 잡아줘요. 너무 자책하지 마세요. 제가 8개월간 실수하면서 배운 거니까요.
혹시 글에서 잘못된 부분 보이면 메일 주세요. 제가 실무 경험이 크지 않아서 빠진 내용도 있을 거라 언제든 고쳐나갈 생각입니다.
QR코드(QR Code)는 주식회사 덴소웨이브의 등록 상표입니다. 본 문서에서 언급된 각 바코드 규격명은 해당 개발사 또는 표준화 기관의 지식재산입니다.
필요한 바코드를 직접 만들어 보세요. binopp 바코드 생성기에서 Code 39, Code 128, EAN-13 등 다양한 규격의 바코드를 무료로 생성할 수 있습니다.
무료 바코드 생성기 사용하기