모두의 계산기
← 블로그로 돌아가기

재미있는 숫자 상식

EAN-13 바코드 검증: 홀수·짝수 자리와 체크디지트 계산법

EAN-13 바코드의 앞 12자리에서 홀수 자리 합과 짝수 자리 합의 3배를 더한 뒤 모듈로 10으로 체크디지트를 계산하고 검증하는 방법을 GS1 공식 예제로 설명합니다.

상품 포장에 적힌 EAN-13 바코드는 13개의 숫자로 이루어집니다. 맨 마지막 숫자는 상품 종류를 하나 더 나타내는 자리가 아니라 앞의 12자리가 올바르게 입력됐는지 확인하는 체크디지트입니다. 앞 12자리의 홀수 위치 숫자는 그대로 더하고 짝수 위치 숫자는 3배해서 더한 뒤, 전체 합이 10의 배수가 되도록 마지막 숫자를 정합니다.

예를 들어 GS1이 공식 계산 안내에서 사용하는 번호는 `6291041500213`입니다. 마지막 3을 제외한 `629104150021`에 가중치 1과 3을 번갈아 적용하면 합계가 57이 됩니다. 57보다 크거나 같은 가장 가까운 10의 배수는 60이므로 체크디지트는 60-57=3입니다. 전체 가중합 57+3=60은 10으로 나누어떨어져 검증을 통과합니다.

EAN-13과 GTIN-13은 무엇이 다를까

GTIN은 Global Trade Item Number의 약자로 상품을 식별하는 GS1 식별 키입니다. 13자리 GTIN을 GTIN-13이라고 합니다. EAN-13은 이 13자리 숫자를 소매점 스캐너가 읽을 수 있도록 검은 막대와 흰 여백으로 표현하는 바코드 심벌입니다. 일상에서는 번호와 바코드를 모두 EAN-13 바코드라고 부르지만 엄밀히 말하면 GTIN-13은 데이터이고 EAN-13은 그 데이터를 담는 바코드 표현 방식입니다.

GS1 설명에 따르면 GTIN은 GS1 회사 프리픽스, 품목 참조 번호와 체크디지트로 구성됩니다. 회사 프리픽스와 품목 참조 번호의 길이는 고정된 3자리·9자리처럼 일률적으로 나뉘지 않습니다. GS1 회원기관이 배정한 회사 프리픽스 길이에 따라 품목 참조 번호의 길이가 달라질 수 있습니다. 마지막 한 자리만 체크디지트라는 점은 일정합니다.

구성 요소역할주의할 점
GS1 회사 프리픽스GS1 식별 키를 만들 수 있도록 회원기관이 사용자 기업에 부여길이가 가변적이며 원산지 번호가 아님
품목 참조 번호기업이 거래 품목을 구분하도록 배정회사 프리픽스 길이에 따라 자리 수가 달라짐
체크디지트앞 숫자의 입력·스캔 오류를 탐지항상 맨 마지막 한 자리

EAN-13 체크디지트 공식

13자리 번호를 왼쪽부터 d₁, d₂, …, d₁₃이라고 하겠습니다. d₁₃이 체크디지트이고 계산에 사용하는 데이터는 d₁부터 d₁₂까지입니다. 왼쪽에서 센 홀수 위치 d₁, d₃, d₅, d₇, d₉, d₁₁에는 가중치 1을 곱합니다. 짝수 위치 d₂, d₄, d₆, d₈, d₁₀, d₁₂에는 가중치 3을 곱합니다.

S=(d₁+d₃+d₅+d₇+d₉+d₁₁)+3×(d₂+d₄+d₆+d₈+d₁₀+d₁₂)
체크디지트 c=(10-(S mod 10)) mod 10

`mod 10`은 10으로 나눈 나머지를 뜻합니다. S mod 10이 7이면 체크디지트는 10-7=3입니다. 합계가 이미 10의 배수라서 나머지가 0이면 체크디지트도 0이어야 합니다. 공식 바깥쪽에 mod 10을 한 번 더 쓰는 이유는 이 경우 10이 아니라 한 자리 숫자 0을 얻기 위해서입니다.

GS1 공식 예제로 체크디지트 계산하기

검증할 예제는 `6291041500213`입니다. 마지막 숫자 3을 잠시 떼고 앞의 12자리 `629104150021`에 왼쪽부터 위치 번호를 붙입니다. 홀수 위치와 짝수 위치를 섞지 않도록 표로 적으면 계산 실수를 줄일 수 있습니다.

위치숫자가중치곱한 값
1616
2236
3919
4133
5010
64312
7111
85315
9010
10030
11212
12133

홀수 위치 숫자의 합은 6+9+0+1+0+2=18입니다. 짝수 위치 숫자의 합은 2+1+4+5+0+1=13이고 여기에 3을 곱하면 39입니다. 두 값을 더한 가중합 S는 18+39=57입니다.

S=18+3×13=57
c=(10-(57 mod 10)) mod 10=(10-7) mod 10=3

계산된 체크디지트 3이 실제 마지막 숫자와 같으므로 `6291041500213`은 체크디지트 규칙을 통과합니다. 다른 방식으로는 데이터 12자리의 가중합에 마지막 숫자를 더한 뒤 10으로 나누어도 됩니다. (57+3) mod 10=0이므로 결과는 같습니다.

13자리 전체 번호를 바로 검증하는 방법

이미 체크디지트가 붙은 13자리 번호가 있다면 먼저 길이가 정확히 13인지, 모든 문자가 0부터 9까지의 숫자인지 확인합니다. 그런 다음 앞의 12자리에서 S를 계산하고 마지막 숫자 c를 더합니다. 최종 합을 10으로 나눈 나머지가 0이면 수학적 검증을 통과합니다.

  1. 입력값에서 공백과 하이픈을 허용할지 먼저 정하고, 허용한다면 제거합니다.
  2. 정리한 문자열이 정확히 13자리 숫자인지 검사합니다.
  3. 앞 12자리의 왼쪽 홀수 위치에는 1, 짝수 위치에는 3을 곱해 더합니다.
  4. 가중합에 13번째 체크디지트를 더합니다.
  5. 전체 합을 10으로 나눈 나머지가 0인지 확인합니다.
유효 조건: (S+c) mod 10=0

검증 프로그램에서는 바코드 번호를 정수보다 문자열로 다루는 편이 안전합니다. 앞자리가 0이면 숫자형 변환 과정에서 0이 사라져 길이와 위치가 달라질 수 있기 때문입니다. GTIN은 덧셈에 쓰는 수량이 아니라 각 자릿값의 위치가 중요한 식별자입니다.

오른쪽부터 세면 가중치가 왜 다르게 보일까

GS1의 공통 체크디지트 규칙은 체크디지트 바로 왼쪽 숫자부터 왼쪽으로 이동하면서 3과 1을 번갈아 곱하는 방식으로도 설명할 수 있습니다. GTIN-13에서는 체크디지트의 왼쪽에 데이터 숫자가 12개 있습니다. 가장 오른쪽 데이터 자리 d₁₂에 3을 곱하고 d₁₁에는 1을 곱하는 식입니다.

이를 왼쪽부터 다시 세면 d₁에는 1, d₂에는 3이 적용됩니다. 따라서 ‘왼쪽 홀수 자리는 1, 짝수 자리는 3’과 ‘오른쪽 체크디지트 바로 앞부터 3, 1’은 같은 규칙입니다. 서로 다른 방향의 설명을 섞으면 가중치가 뒤집히므로, 계산을 시작하기 전에 체크디지트를 제외했는지와 어느 방향에서 위치를 세는지 정해야 합니다.

세는 방법첫 가중치가중치 순서
앞의 12자리를 왼쪽부터첫 번째 데이터 숫자에 11, 3, 1, 3, …, 1, 3
체크디지트 바로 왼쪽부터가장 오른쪽 데이터 숫자에 33, 1, 3, 1, …
13자리 전체를 오른쪽부터체크디지트에 11, 3, 1, 3, …

체크디지트가 오류를 찾아내는 수학적 원리

가중합과 체크디지트를 더한 값은 10의 배수가 되도록 만들어집니다. 한 자리를 잘못 입력하면 그 위치의 가중치가 1인 경우 합이 바뀐 숫자 차이만큼 달라지고, 가중치가 3인 경우 차이의 3배만큼 달라집니다. 1과 3은 모두 10과 서로소이므로 1부터 9까지의 한 자리 변화가 10의 배수로 사라지지 않습니다. 따라서 한 자리 숫자를 다른 숫자로 바꾼 오류는 모두 탐지할 수 있습니다.

서로 이웃한 두 자리 a와 b를 바꾸면 가중합 변화는 2(a-b)의 부호 차이로 나타납니다. 두 숫자의 차이가 5이면 이 값이 10의 배수가 되므로 체크디지트가 변하지 않습니다. 예를 들어 가중치가 1과 3인 이웃 자리의 `16`을 `61`로 바꾸면 원래 합은 1×1+3×6=19이고 바꾼 합은 1×6+3×1=9입니다. 두 합의 차이는 10이라 모듈로 10에서 구분되지 않습니다.

  • 0과 5, 1과 6, 2와 7, 3과 8, 4와 9의 이웃 자리 교환은 탐지되지 않을 수 있습니다.
  • 같은 가중치가 적용되는 두 위치를 서로 바꾸면 가중합이 그대로일 수 있습니다.
  • 둘 이상의 오류가 서로 상쇄되면 검증을 통과할 수 있습니다.
  • 검증 가능한 마지막 숫자가 0부터 9까지 하나이므로 임의의 13자리 숫자가 우연히 통과할 가능성은 10분의 1입니다.

체크디지트는 모든 오류를 고치는 오류 정정 코드가 아닙니다. 입력값이 틀렸다는 신호를 줄 수는 있지만 어느 자리가 틀렸는지 알려 주지 않고 원래 번호도 복원하지 않습니다. 단일 체크디지트가 제공하는 제한된 오류 탐지 기능으로 이해해야 합니다.

EAN-13과 룬 알고리즘은 같은 모듈로 10일까

EAN-13과 룬(Luhn) 알고리즘은 모두 최종 합을 10으로 나누는 체크디지트 방식이지만 중간 계산은 다릅니다. EAN-13은 숫자에 1과 3을 번갈아 곱하고 곱한 값을 그대로 더합니다. 룬 알고리즘은 오른쪽에서 두 번째 자리부터 한 칸씩 건너 2배하고, 결과가 두 자리라면 각 자릿수를 더하거나 9를 빼 한 자리 값으로 바꿉니다.

항목EAN-13·GS1 방식룬 알고리즘
주요 용도GTIN 등 고정 길이 GS1 식별 키카드번호 등 여러 식별번호
가중 처리1과 3을 교대로 곱함선택한 자리를 2배함
두 자리 곱의 처리그대로 합산자릿수 합 또는 9를 뺌
최종 연산모듈로 10모듈로 10
같은 알고리즘 여부아님아님

두 계산을 혼용하면 그럴듯한 한 자리 결과가 나오더라도 올바른 체크디지트가 아닐 수 있습니다. 카드번호 검증에 쓰이는 방식은 룬 알고리즘에서 짝수 번째 숫자를 처리하는 계산법에 별도로 정리돼 있습니다.

EAN-13 바코드 막대에는 13자리가 어떻게 들어갈까

EAN-13 심벌의 막대 영역은 시작 가드 패턴, 왼쪽 여섯 숫자, 중앙 가드 패턴, 오른쪽 여섯 숫자와 종료 가드 패턴으로 구성됩니다. 숫자 하나는 일곱 모듈 폭의 막대·공백 패턴으로 표현됩니다. 그런데 막대에 직접 나타나는 숫자는 여섯 자리씩 모두 12자리입니다. 맨 앞 숫자는 왼쪽 여섯 숫자에 적용되는 A·B 숫자 세트의 배열로 간접 부호화됩니다.

예를 들어 선두 숫자가 무엇인지에 따라 왼쪽 여섯 자리의 부호 패턴 조합이 달라집니다. 스캐너는 이 패턴을 읽어 맨 앞 숫자를 복원하고, 오른쪽 끝에 직접 부호화된 체크디지트까지 포함해 13자리 GTIN을 얻습니다. 체크디지트 산술과 검은 막대의 인쇄 품질 검사는 별개입니다. 숫자가 수학적으로 유효해도 여백, 크기, 대비나 막대 폭이 규격을 벗어나면 스캔이 잘되지 않을 수 있습니다.

체크디지트 통과가 증명하지 못하는 것

체크디지트 검증은 앞 12자리와 마지막 숫자의 산술 관계만 확인합니다. 누구나 임의의 12자리 뒤에 올바른 체크디지트를 계산해 붙일 수 있으므로 다음 사실은 검증하지 못합니다.

  • 해당 번호가 GS1에서 실제로 배정된 번호인지 확인하지 못합니다.
  • 포장에 표시된 상품과 등록된 상품 정보가 같은지 확인하지 못합니다.
  • 상품이 정품인지 위조품인지 판별하지 못합니다.
  • 제조 국가나 원산지를 증명하지 못합니다.
  • 가격, 유통기한, 일련번호와 재고 상태를 체크디지트만으로 알 수 없습니다.

실제 배정 여부와 연결된 브랜드·상품 정보를 확인하려면 GS1의 Verified by GS1 같은 등록정보 조회 수단이 필요합니다. 그 경우에도 조회된 마스터 데이터와 손에 든 상품이 실제로 일치하는지 별도로 확인해야 합니다. 체크디지트는 번호가 올바르게 구성됐는지를 보는 첫 단계이지 진위 인증 수단이 아닙니다.

앞 세 자리는 제조국 번호가 아닙니다

EAN-13 앞부분을 보고 제조국을 알아낼 수 있다는 설명이 널리 퍼져 있지만 GS1 공식 안내는 이를 부정합니다. 시작 부분의 GS1 프리픽스는 바코드 번호를 배정한 GS1 회원기관과 연결될 뿐, 상품이 그 국가에서 제조됐다는 뜻이 아닙니다. 한 국가의 GS1 회원기관에서 번호를 받은 기업이 다른 국가에서 상품을 생산할 수 있습니다.

원산지는 상품 라벨이나 별도의 제품 마스터 데이터 및 관련 규정에 따라 확인해야 합니다. 체크디지트 계산도 앞 숫자의 의미를 해석하지 않습니다. 12개의 데이터 숫자가 무엇을 뜻하든 정해진 위치에 1과 3을 곱해 산술적 일관성만 검사합니다. 실제 자료의 첫 숫자 분포를 분석하는 벤포드의 법칙과 첫째 자리 확률도 번호가 등록됐는지 검증하는 체크디지트와는 목적이 다릅니다.

프로그래밍할 때 자주 생기는 오류

  • 13자리 전체에 앞 12자리용 가중치를 적용하고 체크디지트를 다시 계산하는 오류
  • 왼쪽에서 센 위치와 오른쪽에서 센 위치의 가중치를 섞는 오류
  • 합계가 이미 10의 배수일 때 체크디지트를 0이 아닌 10으로 반환하는 오류
  • 문자열을 숫자로 변환해 앞의 0을 잃어버리는 오류
  • 공백·하이픈·전각 숫자를 어떻게 처리할지 정하지 않은 채 자동 변환하는 오류
  • 체크디지트가 맞다는 이유로 실제 등록 상품이라고 판단하는 오류

안전한 구현은 입력 형식을 먼저 엄격히 정의합니다. 순수한 ASCII 숫자 13자리만 허용할지, 사용자가 보기 좋게 넣은 공백과 하이픈을 제거할지 정해야 합니다. 자동으로 문자를 삭제하는 방식은 잘못된 입력을 정상 번호처럼 바꿀 수 있으므로 사용자에게 어떤 정규화를 했는지 알려 주는 편이 좋습니다.

다른 GTIN 길이에도 같은 규칙을 쓸 수 있을까

GS1의 표준 체크디지트 알고리즘은 GTIN-8, GTIN-12, GTIN-13과 GTIN-14를 비롯한 여러 고정 길이 숫자 식별 키에 사용됩니다. 공통 원칙은 체크디지트 바로 왼쪽 숫자부터 왼쪽으로 이동하며 3과 1을 교대로 곱하는 것입니다. 다만 번호 길이가 달라지면 왼쪽 첫 자리의 가중치가 달라 보일 수 있으므로 EAN-13의 ‘왼쪽 홀수 1, 짝수 3’을 모든 길이에 그대로 외워 적용하면 안 됩니다.

데이터베이스에서는 GS1 권고에 따라 짧은 GTIN을 앞에 0을 채운 14자리 형태로 저장하거나 교환하는 경우가 있습니다. 앞에 붙인 0은 가중합에 값을 더하지 않으므로 올바르게 정렬하면 원래 체크디지트가 유지됩니다. 그렇더라도 사용자에게 표시할 심벌 종류와 데이터 저장 형식은 구분해야 합니다.

EAN-13 바코드 검증에 관해 자주 묻는 질문

체크디지트가 맞으면 진짜 상품 바코드인가요?

아닙니다. 체크디지트는 숫자의 산술적 형식만 확인합니다. 실제 GS1 배정 여부와 등록된 브랜드·상품 정보는 공식 데이터 조회가 필요하며, 정품 여부는 체크디지트만으로 판별할 수 없습니다.

합계가 70이면 체크디지트는 10인가요?

체크디지트는 한 자리여야 하므로 0입니다. 70은 이미 10의 배수입니다. 식으로 계산하면 (10-(70 mod 10)) mod 10=(10-0) mod 10=0입니다.

체크디지트를 포함해 오른쪽부터 계산해도 되나요?

가능합니다. 13자리 전체를 오른쪽부터 셀 때 체크디지트에는 가중치 1을 적용하고 그 왼쪽부터 3, 1을 번갈아 적용합니다. 최종 합이 10의 배수면 유효합니다. 계산 방향과 시작 가중치를 끝까지 일관되게 유지해야 합니다.

숫자 두 개를 바꿔 썼는데도 통과할 수 있나요?

가능합니다. 같은 가중치를 가진 위치끼리 교환하거나 이웃한 숫자의 차이가 5인 경우처럼 가중합 변화가 10의 배수가 되면 오류가 탐지되지 않습니다. 체크디지트는 흔한 오류를 줄이지만 모든 두 자리 교환을 탐지한다고 보장하지는 않습니다.

EAN-13의 첫 숫자는 막대 어디에 있나요?

맨 앞 숫자는 별도의 일곱 모듈 문자로 직접 표시되지 않습니다. 왼쪽 여섯 숫자에 사용된 A·B 부호 세트의 조합으로 간접 표현됩니다. 나머지 12자리에는 마지막 체크디지트가 포함됩니다.

EAN-13 체크디지트 계산 핵심 정리

EAN-13 검증에서는 마지막 한 자리를 체크디지트로 분리합니다. 앞의 12자리를 왼쪽부터 셌을 때 홀수 위치 합에 짝수 위치 합의 3배를 더해 S를 구합니다. 체크디지트는 c=(10-(S mod 10)) mod 10입니다. 이미 완성된 번호는 (S+c) mod 10=0인지 검사하면 됩니다.

이 계산은 한 자리 오입력을 모두 탐지하지만 모든 자리 교환과 여러 오류를 찾아내지는 못합니다. 통과 결과는 번호의 형식이 산술적으로 맞다는 뜻일 뿐 실제 등록, 상품 진위, 가격이나 원산지를 증명하지 않습니다. 번호를 문자열로 보존하고 공식 GS1 등록정보 확인과 바코드 인쇄 품질 검사를 별도로 수행해야 EAN-13을 올바르게 다룰 수 있습니다.

참고 자료