CODE128 바코드 이해 - 구조부터 활용까지 실무 완벽 정리
CODE128 바코드의 문자셋 구조, 체크디짓 계산법, GS1-128과의 차이까지 실무에서 바로 쓸 수 있도록 핵심만 정리했습니다.
![]()
물류센터에서 스캐너로 상품을 찍을 때, 택배 송장의 긴 숫자를 읽을 때, 우리가 만나는 바코드 대부분은 CODE128입니다. 이름은 들어봤지만 정확히 어떤 원리로 작동하는지, 왜 다른 바코드 대신 CODE128을 쓰는지 궁금하셨을 겁니다. CODE128 바코드 이해를 위해 구조부터 실무 활용까지 하나씩 짚어보겠습니다.
CODE128 바코드란 무엇인가
CODE128은 1981년 Computer Identics Corporation에서 개발한 고밀도 1차원 바코드 규격입니다. ASCII 128개 문자를 모두 표현할 수 있어서 CODE128이라는 이름이 붙었습니다.
- 고밀도 - 같은 데이터를 CODE39보다 약 30% 더 좁은 공간에 표현합니다
- 가변 길이 - 데이터 길이에 제한이 없어 짧은 코드부터 긴 일련번호까지 대응합니다
- 높은 신뢰성 - 모듈러 103 기반 체크디짓으로 오독률이 극히 낮습니다
- 전체 ASCII 지원 - 숫자, 영문 대소문자, 특수문자, 제어문자까지 모두 인코딩 가능합니다
CODE128 바코드 이해의 첫걸음은 이 규격이 단순한 숫자 표현이 아니라 문자와 제어코드까지 포괄하는 범용 규격이라는 점을 아는 것입니다.
CODE128은 현재 물류, 유통, 제조 전 분야에서 가장 널리 사용되는 1D 바코드 표준입니다. EAN-13이 상품 식별에 특화되어 있다면, CODE128은 모든 종류의 데이터를 담을 수 있는 범용 규격입니다.
3가지 문자셋 A, B, C 비교
CODE128의 핵심 특징은 3가지 문자셋을 상황에 따라 전환하며 사용할 수 있다는 점입니다. 각 문자셋은 시작 코드가 다르고, 표현 가능한 문자 범위도 다릅니다.
| 구분 | Code Set A | Code Set B | Code Set C |
|---|---|---|---|
| 시작코드 값 | 103 | 104 | 105 |
| 숫자(0-9) | 지원 | 지원 | 지원(2자리 쌍) |
| 영문 대문자 | 지원 | 지원 | 미지원 |
| 영문 소문자 | 미지원 | 지원 | 미지원 |
| 제어문자 | 지원(NUL-US) | 미지원 | 미지원 |
| 특수문자 | 일부 | 전체 | 미지원 |
| 숫자 밀도 | 1문자/심볼 | 1문자/심볼 | 2문자/심볼 |
실무에서 가장 많이 쓰이는 조합을 정리하면 이렇습니다.
- 순수 숫자 데이터 - Code Set C를 사용합니다. 숫자 2자리를 하나의 심볼로 압축하므로 바코드 길이가 절반으로 줄어듭니다
- 영문+숫자 혼합 - Code Set B가 기본입니다. 대소문자와 특수문자를 모두 처리합니다
- 제어문자 포함 - Code Set A를 사용합니다. FNC 키나 탭, 줄바꿈 같은 특수 제어가 필요할 때 선택합니다
하나의 바코드 안에서 문자셋을 전환할 수도 있습니다. 예를 들어 앞부분은 Code Set B로 영문을 표현하고, 뒷부분의 긴 숫자열은 Code Set C로 전환하면 전체 바코드 길이를 줄일 수 있습니다.
CODE128 바코드 구조와 체크디짓 계산
CODE128 바코드는 다음 순서로 구성됩니다.
- 여백(Quiet Zone) - 바코드 양쪽에 최소 10배 모듈 너비의 빈 공간
- 시작 문자(Start Code) - 사용할 문자셋을 지정 (Start A, B, 또는 C)
- 데이터 영역 - 실제 인코딩할 데이터. 각 문자는 11개 모듈(흑백 막대)로 구성
- 체크디짓 - 모듈러 103 계산 결과
- 정지 문자(Stop Code) - 13개 모듈로 구성된 종료 패턴
체크디짓 계산 방법
체크디짓은 데이터 무결성을 보장하는 핵심 요소입니다. 계산 공식은 다음과 같습니다.
체크디짓 = (시작코드 값 + 각 데이터 값 x 위치) mod 103
예시로 "AB12"를 Code Set B로 인코딩한다고 가정합니다.
| 위치 | 문자 | 코드 값 | 위치 가중치 | 계산 |
|---|---|---|---|---|
| 시작 | Start B | 104 | - | 104 |
| 1 | A | 33 | 1 | 33 |
| 2 | B | 34 | 2 | 68 |
| 3 | 1 | 17 | 3 | 51 |
| 4 | 2 | 18 | 4 | 72 |
| 합계 | 328 | |||
| 328 mod 103 | 19 | |||
이 경우 체크디짓 값은 19이며, 이에 해당하는 문자 패턴이 바코드에 추가됩니다.
GS1-128과 CODE128의 차이
GS1-128은 CODE128의 하위 규격입니다. 과거에는 UCC/EAN-128이라고 불렸습니다. CODE128의 인코딩 방식을 그대로 사용하되, 데이터에 의미를 부여하는 AI(Application Identifier) 체계를 추가한 것이 핵심 차이입니다.
주요 차이점
FNC1 문자 - GS1-128은 시작 코드 바로 뒤에 FNC1 문자를 필수로 삽입합니다. 이 문자가 있어야 스캐너가 일반 CODE128과 GS1-128을 구분합니다.
AI 코드 - 괄호 안의 숫자가 뒤따르는 데이터의 의미를 정의합니다. 예를 들어 (01)은 상품코드, (10)은 배치번호, (17)은 유통기한을 뜻합니다.
사용 분야 - 일반 CODE128은 범용으로 쓰이지만, GS1-128은 국제 물류와 의약품 추적처럼 표준화된 데이터 교환이 필요한 분야에서 사용됩니다.
택배 송장에서 보는 긴 바코드가 대부분 GS1-128입니다. 배송 추적번호, 무게, 목적지 같은 정보를 하나의 바코드에 구조적으로 담을 수 있기 때문입니다.
실무 활용 분야와 생성 방법
CODE128 바코드는 다양한 산업에서 표준으로 자리잡고 있습니다.
- 물류/배송 - 택배 송장, 팔레트 라벨, 입출고 관리에 GS1-128 형태로 사용
- 제조업 - 공정 추적, 자재 관리, 일련번호 부여에 활용
- 의료 - 의약품 추적(시리얼라이제이션), 환자 식별 팔찌에 적용
- 도서관 - 도서 대출/반납 관리 시스템의 기본 바코드
- 사내 자산관리 - IT 장비, 비품에 CODE128 라벨을 부착하여 관리
무료 생성 도구
CODE128 바코드를 생성하는 방법은 여러 가지입니다. 프로그래밍 없이도 온라인 도구로 간단하게 만들 수 있습니다.
Python의 python-barcode 라이브러리를 사용하면 코드 몇 줄로 CODE128 바코드 이미지를 생성할 수 있습니다. JavaScript에서는 JsBarcode 라이브러리가 널리 쓰입니다. 엑셀에서도 CODE128 전용 폰트를 설치하면 셀에 바코드를 표시할 수 있지만, 체크디짓을 별도로 계산해야 하므로 주의가 필요합니다.
생성된 바코드 이미지를 라벨 크기에 맞게 조절해야 할 때가 많습니다. 이때 이미지 비율을 잘못 변경하면 스캐너 인식률이 떨어질 수 있으므로, 이미지 리사이저 같은 도구를 활용해 가로세로 비율을 유지하면서 크기를 조절하는 것이 좋습니다.
CODE128 바코드 인쇄 시 주의사항
아무리 정확하게 생성한 바코드도 인쇄 품질이 나쁘면 스캐너가 읽지 못합니다. 실무에서 자주 발생하는 문제와 해결법을 정리합니다.
인쇄 해상도
최소 300 DPI 이상으로 인쇄해야 합니다. 일반 사무용 잉크젯 프린터는 바코드 인쇄에 적합하지 않습니다. 레이저 프린터나 전용 라벨 프린터(열전사 방식)를 사용하세요.
여백 확보
바코드 좌우에 최소 10배 모듈 너비(약 6.5mm 이상)의 여백이 필요합니다. 여백이 부족하면 스캐너가 시작과 끝을 인식하지 못합니다.
크기 비율
바코드의 가로세로 비율을 임의로 변경하면 안 됩니다. 특히 세로 높이를 과도하게 줄이면 스캐너 광선이 전체 막대를 통과하지 못해 인식 실패가 발생합니다. 최소 높이는 바코드 전체 길이의 15% 또는 6.35mm 중 큰 값을 유지하세요.
색상 조합
바코드 막대는 어두운 색, 배경은 밝은 색이 원칙입니다. 흰 배경에 검정 막대가 가장 이상적입니다. 빨간 배경이나 파란 막대는 적외선 스캐너에서 인식되지 않을 수 있으니 피하세요.
CODE128 바코드 이해는 단순히 줄무늬를 읽는 것이 아니라, 데이터 구조와 인코딩 원리를 아는 것에서 시작합니다. 실무에 적용할 때는 두 가지만 기억하세요. 첫째, 데이터 특성에 맞는 문자셋을 선택하고, 둘째, 인쇄 품질을 반드시 검증하세요. 이 두 가지만 지켜도 바코드 관련 문제의 90%는 예방할 수 있습니다.