바코드 끝에는 눈에 보이지 않는 검증 숫자(체크섬)가 하나 더 숨어 있습니다. 스캐너가 막대를 잘못 읽었는지 스스로 확인하는 장치입니다. CODE128 바코드의 체크섬이 정확히 어떻게 계산되는지, 뚝딱툴 바코드 생성기의 실제 코드로 직접 검증한 예시와 함께 정리했습니다.
확인 2026-11-03 · ISO/IEC 15417(CODE128 국제 표준, 뚝딱툴 바코드 생성기 FAQ에 기존 인용), Wikipedia "Code 128" 문서, 뚝딱툴 barcode.js 소스 코드를 node로 직접 실행해 대조
체크섬은 왜 필요한가
바코드 스캐너는 레이저나 카메라로 막대·공백의 폭을 읽어 숫자로 바꿉니다. 조명이 어둡거나 인쇄가 번지면 막대 하나를 잘못 읽을 수 있습니다. 이런 오류를 스캐너 스스로 걸러내도록, CODE128은 담긴 모든 글자로 만든 검증값(체크섬)을 바코드 맨 끝(정지 기호 바로 앞)에 심어 둡니다. 스캔한 값으로 체크섬을 다시 계산했을 때 바코드에 적힌 체크섬과 다르면, 스캐너는 그 결과를 버리고 "삐" 소리 없이 다시 시도합니다.
모듈로(modulo) 103 계산법
CODE128은 시작 기호(Start A·B·C)와 글자마다 0~106 사이의 고유한 심볼값을 가집니다(국제 표준 ISO/IEC 15417). 체크섬은 이 심볼값들의 가중합을 103으로 나눈 나머지입니다.
- 시작값 — 시작 기호의 심볼값을 그대로 더합니다(가중치 1).
- 데이터 글자 — 글자마다 "심볼값 × 위치(1번째 글자는 1, 2번째는 2, …)"를 계산해 모두 더합니다.
- 나머지 — 합계를 103으로 나눈 나머지가 체크섬 심볼값입니다.
실제 코드로 계산해보기
뚝딱툴 바코드 생성기에 "AB12"를 입력하면 숫자뿐 아니라 영문도 섞여 있어 Code Set B(문자 하나당 심볼 하나)로 인코딩됩니다. 이때 각 글자의 심볼값은 ASCII 코드에서 32를 뺀 값입니다 — A는 33, B는 34, 1은 17, 2는 18입니다. 시작 기호 Start B의 심볼값은 104입니다.
| 위치 | 심볼 | 심볼값 | 가중치 | 곱 |
|---|---|---|---|---|
| 0 | Start B | 104 | 1 | 104 |
| 1 | A | 33 | 1 | 33 |
| 2 | B | 34 | 2 | 68 |
| 3 | 1 | 17 | 3 | 51 |
| 4 | 2 | 18 | 4 | 72 |
합계는 104+33+68+51+72 = 328이고, 328을 103으로 나눈 나머지는 19입니다(328 = 103×3 + 19). 그래서 "AB12"의 체크섬 심볼값은 19입니다 — 뚝딱툴 바코드 생성기 코드(barcode.js)를 Node.js로 직접 실행해 같은 값(19)이 나오는 것을 확인했습니다.
EAN·UPC 바코드와는 다르다
마트 영수증이나 상품 포장에 찍힌 바코드(EAN-13·UPC-A)는 CODE128과 다른 표준입니다. 숫자 12~13자리로 상품을 식별하며, 체크섬도 모듈로 10 방식(자릿수마다 가중치 1과 3을 번갈아 곱해 더한 뒤, 10의 배수가 되게 하는 숫자)을 씁니다. 두 표준 모두 "글자를 가중치와 곱해 더한 뒤 나머지를 구한다"는 원리는 같지만, CODE128은 범용 문자(영문·숫자·기호)를, EAN·UPC는 숫자로만 된 상품 식별코드를 위한 것이라 계산식과 쓰임새가 다릅니다.
자주 묻는 질문
Q. 바코드 체크섬은 왜 필요한가요?
스캐너가 조명·각도·인쇄 상태 때문에 막대 폭을 잘못 읽는 경우가 있습니다. 체크섬은 스캔한 값과 비교해 오류가 있으면 결과를 버리고 다시 읽게 하는 안전장치입니다.
Q. CODE128과 마트 영수증의 바코드(EAN·UPC)는 같은 건가요?
아니요. CODE128은 영문·숫자·기호를 자유롭게 담는 범용 바코드이고, EAN-13·UPC-A는 숫자로 상품을 식별하는 별도 표준입니다. 체크섬 계산법도 CODE128은 모듈로 103, EAN-13은 모듈로 10으로 다릅니다.
Q. 체크섬을 직접 계산할 일이 있나요?
대부분은 없습니다. 바코드 생성기가 자동으로 계산해 넣고 스캐너도 자동으로 검증합니다. 바코드가 자꾸 인식이 안 될 때 원인을 이해하는 데 도움이 됩니다.