바코드 체크 디지트의 원리 (EAN-13, UPC-A, EAN-8)
당신이 사는 거의 모든 제품의 바코드에서 마지막 숫자는 사실 제품 번호의 일부가 아닙니다 — 그것은 체크 디지트로, 스캔·입력 실수를 잡아내기 위해 나머지 숫자들로부터 계산한 한 자리 숫자입니다. 이 가이드는 가장 흔한 세 가지 소매 형식 — EAN-13, UPC-A, EAN-8 — 에서 이 숫자가 어떻게 작동하는지를 손으로 따라 할 수 있는 예제와 함께 설명합니다.
체크 디지트는 무엇을 위한 것인가
체크 디지트는 내장된 일종의 중복성입니다. 바코드의 데이터 숫자는 이미 제품을 식별합니다; 체크 디지트는 제품 자체에 대한 새로운 정보를 더하지 않습니다. 대신 모든 숫자 사이에 성립해야 하는 관계를 인코딩하여, 스캐너가 막대를 잘못 읽거나 사람이 번호를 잘못 입력하면 그 관계가 깨져 오류가 조용히 받아들여지는 대신 즉시 감지됩니다.
소매 바코드가 쓰는 방식은 GS1 모듈로 10입니다. 계산대 스캐너가 하루에 수천 번을 즉시·확실하게 검증해야 하므로, 곱셈 몇 번과 뺄셈 한 번으로 의도적으로 단순하게 설계되었습니다.
GS1 모듈로-10 알고리즘
마지막 체크 디지트를 제외한 모든 숫자를 가져옵니다. 그 데이터 숫자들의 가장 오른쪽에서 시작해 왼쪽으로 이동하며 숫자에 3과 1을 번갈아 곱합니다. 모든 곱을 더합니다. 체크 디지트는 그 합을 다음 10의 배수로 만들기 위해 더해야 하는 값입니다.
공식으로 쓰면: 체크 = (10 − (가중합 mod 10)) mod 10. 바깥쪽 'mod 10'은 합이 이미 10의 배수인 경우를 처리하며, 그때 체크 디지트는 0이 됩니다.
- 가중치는 가장 오른쪽 데이터 숫자부터 3, 1, 3, 1 … 로 번갈아 적용됩니다.
- 마지막 숫자만 체크 디지트이며, 그 앞은 모두 데이터입니다.
- EAN-13, UPC-A, EAN-8 모두 같은 알고리즘을 쓰며 길이만 다릅니다.
예제로 따라하기
EAN-13 데이터 400638133393(12자리; 열세 번째가 체크 디지트)을 봅시다. 오른쪽에서부터 3, 1, 3, 1 … 로 가중하면 곱은 3×3 + 9×1 + 3×3 + 3×1 + 3×3 + 1×1 + 8×3 + 3×1 + 6×3 + 0×1 + 0×3 + 4×1 이고, 이를 모두 더하면 89입니다.
89보다 큰 다음 10의 배수는 90이므로 체크 디지트는 90 − 89 = 1입니다. 완전한 유효 바코드는 4006381333931입니다. 만약 스캐너가 마지막 숫자를 7로 읽었다면, 다시 계산한 체크가 일치하지 않아 그 자리에서 판독이 거부됩니다.
왜 3으로 가중하면 더 많은 오류를 잡나
3이라는 교대 가중치는 임의로 정한 것이 아닙니다. 단순한 숫자 합도 한 자리가 틀린 것은 잡지만, 매우 흔한 인간의 실수 — 인접한 두 숫자를 바꿔 입력하는 것(예: 21을 12로) — 은 놓칩니다. 교대 위치에 3을 곱하면 자리가 바뀐 이웃 숫자에 서로 다른 가중치가 부여되어, 대부분의 자리 바꿈이 합을 바꾸므로 잡힙니다.
어떤 한 자리 체크 디지트도 가능한 모든 오류를 잡을 수는 없습니다 — 가중치 3의 모듈로 10은 차이가 5인 두 숫자의 자리 바꿈과, 우연히 상쇄되는 두 오류는 놓칩니다. 이는 가장 흔한 실수에 대한 저렴하고 빠른 안전장치이지, 암호학적 보장이 아닙니다.
EAN-13, UPC-A, EAN-8
세 형식은 길이만 다릅니다. EAN-13은 데이터 12자리 + 체크 1자리로 전 세계 표준입니다. 북미에서 흔한 UPC-A는 데이터 11자리 + 체크 1자리이며, 실제로는 앞에 0이 붙은 EAN-13입니다. EAN-8은 전체 바코드가 들어가지 않는 작은 품목을 위해 데이터 7자리 + 체크 1자리를 더 짧은 심볼에 담습니다.
세 형식이 모듈로-10 알고리즘을 공유하므로 같은 계산이 셋 모두를 검증합니다; 자릿수만 알면 됩니다. 바코드로 인쇄된 13자리 ISBN도 EAN-13이며 바로 이 체크 디지트를 쓰기 때문에, 책의 바코드도 콩 통조림과 같은 방식으로 검증할 수 있습니다.