EPC, 바코드 다음의 사물 식별 표준이 작동하는 방식
GS1의 EPC 식별 스키마와 ALE 필터링, ONS/Discovery 해석, EPCIS 이벤트 공유로 이어지는 아키텍처를 코드 예시와 함께 정리한다.
2026-08-13 · 최초 발행 2025-11-26
RFID 태그 하나가 창고 게이트를 통과하는 순간, 시스템은 "이건 티셔츠다"가 아니라 "이건 어제 저 컨베이어를 지나간 바로 그 티셔츠다"를 알아야 한다. 이 차이를 만드는 것이 EPC(Electronic Product Code)다. GS1이 제정한 전자 제품 코드 표준으로, 개체(상품, 물류단위, 위치, 자산) 각각에 고유 식별자를 부여하는 체계다.
코드 한 줄이 태그부터 시스템까지 이동하는 방식
EPC는 두 가지 형태로 존재한다. RFID 태그 메모리에는 바이너리(96/128/256-bit)로 저장되고, 시스템 간 교환 시에는 Pure Identity URI(urn:epc:id:…)나 Tag-URI로 표현된다. 이 코드 하나가 실제로 쓸모 있으려면 물리 계층부터 애플리케이션까지 이어지는 표준 에코시스템이 필요하다: EPCglobal Class-1 Gen2 UHF RFID(물리 계층), ALE(Application Level Events, 캡처·필터링), ONS(Object Name Service)/Discovery(해석), EPCIS(EPC Information Services, 이벤트 공유)로 구성되는 종단 간 프레임워크다.
식별 체계: 상품마다 다른 스키마
EPC는 산업별 시나리오에 맞춘 여러 스키마를 제공한다. SGTIN은 개별 상품, SSCC는 물류단위, SGLN은 로케이션, GRAI·GIAI는 자산을 식별한다. SGTIN-96을 예로 들면 필드는 Header, Filter, Partition, GS1 Company Prefix, Item Reference, Serial로 구성되며, 기업 식별자 기반의 계층 구조로 글로벌 유일성을 확보한다.
ALE: 태그 이벤트가 시스템에 닿기 전 걸러지는 곳
리더·안테나에서 수집되는 다중 태그 이벤트는 그대로 시스템에 전달되지 않는다. ALE(Application Level Events)가 디듀플리케이션, 윈도우 집계, 필터를 적용해 노이즈를 줄이고 데이터량을 제어한다. 이벤트 전송 품질은 재시도, 배치·스트리밍 모드, NTP 기반 시각 동기화로 관리된다.
ONS/Discovery: EPC를 리소스로 해석하기
EPC 코드 자체는 아무 정보도 담고 있지 않다. 그 코드가 가리키는 문서, API, EPCIS 엔드포인트를 찾아주는 것이 ONS·Discovery의 역할이다. DNS/DNSSEC 기반 ONS 또는 HTTPS 기반 Discovery 서비스를 통해 파트너 간 상호운용성을 강화한다.
EPCIS: 표준화된 이벤트로 데이터를 공유하기
EPCIS는 ObjectEvent, AggregationEvent, TransactionEvent, TransformationEvent 네 가지 표준 이벤트 모델을 정의한다. 각 이벤트에는 비즈니스 단계(BizStep), 상태(Disposition), 위치(ReadPoint/BizLocation)가 포함된다. 교환은 EPCIS Capture(입력)와 Query(조회) 인터페이스로 이뤄지며, 온프레미스나 클라우드 저장소에 저장돼 파트너 간 안전하게 공유된다.
RFID 물리 계층과의 결합
Class-1 Gen2 프로토콜은 안티콜리전, CRC, 인벤토리 라운드를 수행해 비가시선 상태에서도 다중 태그를 동시에 인식한다. 태그 메모리는 User/EPC/TID/Reserved 뱅크로 나뉘고, 액세스·킬 패스워드 기반의 보호 옵션을 쓸 수 있다.
입력에서 출력까지 데이터가 흐르는 경로
충돌·누락은 세션·슬롯 조정, 리더 재시도 정책, 다중 안테나 다수결로 대응한다. 중복은 시간창 디듀플리케이션(EPC+안테나+RSSI)과 이동 평균 기반 스무딩으로 제거한다. 일관성은 에지 타임스탬프의 NTP 동기화, EPCIS 전송의 재시도·멱등 키 적용, 파트너 간 최종적 일관성 합의로 확보한다.
도입되는 곳: 리테일부터 제약까지
리테일 재고 가시성에서는 매장·창고의 사이클카운트를 자동화하고, 박스를 열지 않고도 읽어 OOS(품절)를 줄이고 피킹 정확도를 높이며 반품 동선을 최적화한다. 제조 WIP·공정 추적에서는 WIP 단위에 EPC를 부여해 공정 통과 이벤트를 기록하고, Assembly·TransformationEvent로 부품-완제품을 추적해 리콜 범위를 최소화한다. 물류·운송 단위 추적은 SSCC 팔레트·케이스 단위 식별로 도크패스를 자동 검증하고 크로스도킹 속도를 높이며, 컨테이너 밀폐 상태를 추적해 시점별 책임소재를 명확히 한다. 제약·의료 시리얼라이제이션은 단위 제품에 SGTIN+Serial을 관리해 위변조를 막고 회수 정확성을 높이며, 냉장체인 이력과 연계해 규제 준수를 지원한다(EPCIS 2.0 센서 확장 이벤트는 최신 정보 확인 필요).
이 도입이 실제로 만드는 숫자는 다음과 같다: 재고 정확도가 1030%p 향상되고 사이클카운트 시간은 5080% 단축된다. 입출고 처리량은 2040% 증가하고 인건비는 1025% 절감되는데, 현장·환경에 따라 편차가 있다. 정성적으로는 실시간 가시성 기반의 의사결정 고도화, 리콜·컴플라이언스 리스크 저감, 파트너 간 데이터 신뢰성 제고가 뒤따른다.
보안과 거버넌스에서 절충해야 하는 것
태그·리더 보안은 Access/Kill 패스워드, 사용자 메모리 잠금, 민감 데이터 미저장 원칙으로 시작한다. 전송 구간은 리더→에지→EPCIS 전 구간 TLS와 상호 인증서 기반 접근 제어를 적용한다. 데이터 거버넌스 차원에서는 EPCIS 이벤트 스키마 관리, 데이터 보존·마스킹 정책, 파트너별 권한 분리가 필요하고, Discovery/ONS에는 DNSSEC/HTTPS와 엔드포인트 인증·감사 로깅을 적용한다.
트레이드오프도 분명하다. 태그 단가와 RF 인프라 투자는 처리량·자동화 이점과 저울질해야 한다. 금속·액체·간섭 환경에서는 안테나 설계와 파워 최적화 튜닝이 필요하다. 프라이버시 측면에서는 소비자 영역 노출을 최소화하고 K-익명화·필터링을 적용하며 바코드·디지털 링크와 병행 운용하는 것이 실무적이다.
EPC+RFID와 바코드, 무엇이 다른가
| 지표 | EPC+RFID | 바코드(GS1-128/UPC) |
|---|---|---|
| 성능 | 다중태그 동시 인식, 수백 태그/초, 비가시선 읽기 | 가시선 필요, 1:1 스캔, 오퍼레이터 의존 |
| 확장성 | 96~256비트 ID 공간, 전사·글로벌 확장 용이 | 코드 길이·레이블 면적 제약 |
| 일관성 | ALE 디듀플·윈도우 제어 필요, EPCIS 멱등 처리 | 스캔 이벤트 단순, 중복 관리 부담 적음 |
| 안정성 | 금속/액체·간섭 영향, RF 튜닝 필요 | 인쇄 품질/오염·훼손 영향 |
| 운영 편의 | 벌크 처리·자동화 최적, 무인 인식 가능 | 단순·저비용, 장비·교육 부담 낮음 |
구축할 때 확인할 것들
태그 전략은 SGTIN-96을 기본으로 하고, 시리얼 전략(랜덤·시퀀셜)을 표준화하며, 금속 환경에는 온-메탈 태그를 채택한다. 리더 튜닝에서는 세션·슬롯·파워·듀티사이클 파라미터를 사전 검증하고 안테나 지향성·편파를 매칭해야 한다. 데이터 모델을 설계할 때는 EPCIS 2.0 이벤트의 BizStep·Disposition·ILMD 규칙을 일관되게 세운다(최신 정보 확인 필요). 운영 지표로는 Read Rate, First-Pass Yield, Duplication Rate, Event Latency, EPCIS Capture 실패율을 모니터링한다.
SGTIN URI를 파싱하고 EPCIS 이벤트를 만드는 예시
전제조건: Python 3.10+, 외부 라이브러리 불필요.
import json
from datetime import datetime, timezone
def parse_sgtin_uri(uri: str):
# 예: urn:epc:id:sgtin:8800123.001234.1234567890123
prefix = "urn:epc:id:sgtin:"
if not uri.startswith(prefix):
raise ValueError("SGTIN URI 형식 아님")
body = uri[len(prefix):]
company, itemref, serial = body.split(".")
return {
"scheme": "sgtin",
"companyPrefix": company,
"itemReference": itemref,
"serial": serial
}
def build_epcis_object_event(epc_uri: str, readpoint: str, bizloc: str):
now = datetime.now(timezone.utc).isoformat(timespec="seconds")
return {
"type": "ObjectEvent",
"eventTime": now,
"eventTimeZoneOffset": "+00:00",
"epcList": [epc_uri],
"action": "OBSERVE",
"readPoint": {"id": readpoint},
"bizLocation": {"id": bizloc},
"bizStep": "urn:epcglobal:cbv:bizstep:shipping",
"disposition": "urn:epcglobal:cbv:disp:in_transit"
}
epc = "urn:epc:id:sgtin:8800123.001234.1234567890123"
parts = parse_sgtin_uri(epc)
event = build_epcis_object_event(epc, "urn:epc:id:sgln:8800123.000001.0", "urn:epc:id:sgln:8800123.000100.0")
doc = {"@context": ["https://gs1.github.io/EPCIS/epcis-context.jsonld"], "type": "EPCISDocument", "schemaVersion": "2.0", "creationDate": datetime.now(timezone.utc).isoformat(timespec="seconds"), "epcisBody": {"eventList": [event]}}
print(json.dumps({"parsed": parts, "epcisDocument": doc}, ensure_ascii=False, indent=2))
출력물은 SGTIN 구성요소와 EPCIS 2.0 ObjectEvent JSON이다. 실제 전송은 EPCIS Capture 엔드포인트로 HTTP POST를 수행한다.
EPC가 하는 일은 하나다 — 글로벌 유일 식별과 이벤트 표준화를 통해 공급망 가시성·자동화·컴플라이언스라는 목표에 도달하는 인프라를 만드는 것이다. RFID 물리 계층, ALE 필터링, Discovery/ONS 해석, EPCIS 데이터 공유로 이어지는 절차를 그대로 따라가는 설계가 가장 안정적이며, 단계적 파일럿 후 확대 롤아웃하면서 보안·거버넌스를 처음부터 내재화하는 접근이 유효하다.