GS1 Sunrise 2027: 글로벌 상거래를 위한 2D 바코드로의 전환

블로그 카테고리: 바코드.NET

2025/08/07

GS1 Sunrise 2027은 제품 투명성, 추적성 및 보안을 향상시키기 위해 기존의 1차원(1D) EAN/UPC 바코드에서 2차원(2D) 바코드로 전환하는 글로벌 프로젝트입니다. 2027년 말까지 전 세계 소매, 의료 및 기타 사업체는 판매 시점(POS) 및 서비스 시점(POC)에서 새로운 제품 식별 표준을 구현해야 할 것으로 예상됩니다. 이미 전 세계 GDP의 88%를 차지하는 48개국에서 테스트 중인 Sunrise 2027 이니셔티브는 글로벌 무역의 새로운 표준이 되고 있습니다.

바코드 인식 전문 도구인 VintaSoft Barcode .NET SDK를 개발하는 VintaSoft는 이러한 변화를 고객의 비즈니스 프로세스를 현대화하고 새로운 규제 환경에서 SDK의 기능을 확장할 수 있는 전략적 기회로 보고 있습니다.



GS1 선라이즈 2027이란 무엇인가

선라이즈 2027은 2020년대에 공식 발표된 GS1 이니셔티브로, 2027년까지 전 세계 소매 및 물류 시스템이 기존의 1D 바코드와 함께 2D 바코드를 스캔하고 해석할 수 있도록 하는 것을 목표로 합니다. 하지만 궁극적인 목표는 1D 형식을 더욱 다재다능한 2D 형식으로 대체하는 것입니다. 2D 형식은 제품 식별뿐만 아니라 유통기한, 배치 번호, 원산지, 품질 인증서 등 추가 데이터도 전송할 수 있습니다.


업계 전체가 전환하는 이유

기존 EAN/UPC 형식은 다음과 같은 한계가 있었습니다.

GS1 DataMatrix 및 GS1 Digital Link QR과 같은 2D 바코드는 다음과 같은 기능을 통해 이러한 문제를 해결합니다.


이것이 시장 참여자에게 어떤 영향을 미칠까요?

GS1이 시작한 2D 바코드 도입은 제조업체부터 소프트웨어 개발자에 이르기까지 상품 공급망의 거의 모든 참여자에게 영향을 미칠 것입니다. 이러한 변화는 단순한 기술적 업그레이드가 아니라 물류, 소매, 소비자 상호작용의 근본적인 프로세스 재구조화를 의미합니다.

제조업체는 새로운 표준의 영향을 가장 먼저 받게 될 것입니다. 새로운 바코드를 인쇄하기 위해 생산 라인과 포장 공정을 조정해야 합니다. 이전에는 포장에 GTIN이 포함된 선형 바코드를 부착하는 것으로 충분했지만, 이제 2D 형식에는 유통 기한, 배치 번호, 구성 정보는 물론 디지털 인증서 또는 웹사이트 링크까지 포함하여 훨씬 더 많은 정보가 필요합니다. 이 모든 것을 위해서는 새로운 바코드 생성 및 관리를 보장하는 장비와 IT 인프라를 모두 업그레이드해야 합니다.

소매업체와 물류 운영업체의 주요 과제는 계산대 및 창고 스캐닝 장치를 조정하는 것입니다. 대부분의 최신 스캐너는 이미 2D 바코드를 지원하지만, 모든 스캐너가 GS1 표준에 최적화되어 있는 것은 아닙니다. 즉, 장비를 업데이트해야 할 뿐만 아니라 새로운 데이터 필드를 올바르게 인식하고 처리하도록 소프트웨어도 수정해야 합니다.

회계 시스템, ERP, 금전등록기 애플리케이션 및 모바일 솔루션을 포함한 소프트웨어 솔루션 개발자는 바코드 형식 변경에 대비해야 합니다. 새로운 심볼 시스템에 대한 지원을 추가하는 것뿐만 아니라 GS1 표준에 따라 데이터 구조를 올바르게 해석하는 것도 필요합니다. 여기에는 애플리케이션 식별자(AI) 처리, 중첩 필드 구문 분석, 그리고 GS1 디지털 링크 형식을 사용하는 경우 외부 웹 서비스와의 상호 작용이 포함됩니다. 데이터 해석 오류는 물류 차질, 반품, 심지어 법적 문제로 이어질 수 있으므로 인식 정확도가 특히 중요합니다.


2D 바코드의 특별한 점

2D 바코드는 자동 식별 시스템의 차세대 기술입니다. 기존의 선형 바코드를 대체할 뿐만 아니라, 다용도성과 풍부한 정보 덕분에 비즈니스, 생산 및 물류에 새로운 가능성을 열어줍니다.

기본 제품 식별자(GTIN)만 포함할 수 있는 1D 바코드(예: EAN/UPC)와 달리 2D 바코드는 현대 공급망 및 디지털 서비스에 필요한 다양한 매개변수를 전달할 수 있습니다.

2D 바코드의 주요 장점은 다음과 같습니다.

새로운 바코드 시스템으로의 전환은 기업들이 표준을 준수하는 것뿐만 아니라 물리적 포장과 온라인 경험을 연결하는 디지털 생태계를 구축하도록 장려합니다.


GS1 선라이즈 2027 구현 단계

정보 및 자발적 참여 단계

지식 보급, 시범 프로젝트, 내부 시스템 적응, 이중 라벨링(1D + 2D) 테스트. 기업은 기술을 현대화하고 테스트할 시간을 확보하게 됩니다.


산업 및 지역별 의무 구현

특정 제품 카테고리 및 지역에 대한 2D 바코드 의무 사용으로의 전환. 주요 초점은 POS 장비 업데이트, 담당자 교육, 공급망 호환성 확보입니다.


완전한 준수 및 통합

2027년 말까지 표준 적용 대상 기업은 가능한 경우 기존 EAN/UPC를 2D 바코드로 완전히 전환해야 합니다. 표준의 지속적인 업데이트 및 지원이 필요합니다.


전환 과정의 과제 및 해결책

기존 선형 바코드에서 2D 형식으로의 전환은 단순한 기술적 업그레이드가 아니라 조직적인 과제이기도 합니다. 특히 기업의 인프라가 여전히 기존 스캐닝, 인쇄 또는 바코드 처리 솔루션에 의존하는 경우, 기업은 여러 가지 실질적이고 기술적이며 규제적인 문제에 직면하게 됩니다.

가장 일반적인 어려움은 다음과 같습니다.

이러한 어려움에도 불구하고 적절한 계획 수립과 올바른 도구 선택을 통해 전환을 훨씬 수월하게 진행할 수 있습니다.

실제로 적용하는 것이 권장되는 주요 솔루션:

2D 바코드로의 전환은 포괄적인 접근 방식이 필요한 프로젝트이지만, 최신 도구와 파트너를 활용하면 실현 가능할 뿐만 아니라 비즈니스 개발 전망 측면에서도 수익성이 높아집니다.


VintaSoft Barcode .NET SDK가 기업의 GS1 Sunrise 2027 준수를 지원하는 방법

VintaSoft의 제품인 VintaSoft Barcode .NET SDK는 DataMatrix 및 QR 코드 바코드를 포함한 1차원 및 2차원 바코드를 빠르고 정확하게 인식하는 문제를 해결합니다. 이를 통해 기업은 다음과 같은 이점을 얻을 수 있습니다.

GS1 Sunrise 2027로의 전환은 현대 공급망에서 디지털화, 투명성 및 보안을 증진합니다. 변화에 대비하여 지금 바로 마킹 및 인식 도구를 현대화하는 것이 중요합니다. 이를 위해 새로운 2D 바코드를 효율적으로 읽고 처리할 수 있는 VintaSoft Barcode .NET SDK와 같은 솔루션에 투자해야 합니다.


다음은 GS1 디지털 링크 바코드를 생성하고 생성된 바코드를 인식하는 방법을 보여주는 C# 코드입니다.
using System;
using System.Text;

using Vintasoft.Barcode;
using Vintasoft.Barcode.BarcodeInfo;
using Vintasoft.Barcode.SymbologySubsets;
using Vintasoft.Barcode.GS1;
using Vintasoft.Imaging;

/// <summary>
/// Test that shows how to encode the barcode data in GS1 Digital Link format,
/// create image with GS1 Digital Link barcode,
/// read GS1 Digital Link barcode from image and print data stored in GS1 format.
/// </summary>
class GS1DigitalLinkExample
{

    /// <summary>
    /// Runs the test (available barcode types QR, DataMatrix).
    /// </summary>
    public static void TestGS1DigitalLink(BarcodeType digitalLinkBarcodeType)
    {
        // GS1 Digital Link barcode
        GS1DigitalLinkBarcodeSymbologySubset barcodeSubset;
        if (digitalLinkBarcodeType == BarcodeType.QR)
            barcodeSubset = BarcodeSymbologySubsets.GS1DigitalLinkQR;
        else if (digitalLinkBarcodeType == BarcodeType.DataMatrix)
            barcodeSubset = BarcodeSymbologySubsets.GS1DigitalLinkDataMatrix;
        else
            throw new NotSupportedException();

        // form the GS1 Application identifiers
        //
        GS1ApplicationIdentifierValue[] aiValues = new GS1ApplicationIdentifierValue[4];
        GS1ApplicationIdentifier ai;
        // 01 - Global Trade Item Number
        ai = GS1ApplicationIdentifiers.FindApplicationIdentifier("01");
        aiValues[0] = new GS1ApplicationIdentifierValue(ai, "0123456789123C");
        // 310 - Net weight, kilograms
        ai = GS1ApplicationIdentifiers.FindApplicationIdentifier("310");
        aiValues[1] = new GS1ApplicationIdentifierValue(ai, "0012.55");
        // 30 - Count of Items
        ai = GS1ApplicationIdentifiers.FindApplicationIdentifier("30");
        aiValues[2] = new GS1ApplicationIdentifierValue(ai, "10");
        // 90 - Company Internal Information
        ai = GS1ApplicationIdentifiers.FindApplicationIdentifier("90");
        aiValues[3] = new GS1ApplicationIdentifierValue(ai, "ABCabc12345");
        // create GS1 value item
        GS1DigitalLinkValueItem gs1DigitalLinkValue = new GS1DigitalLinkValueItem(new GS1DigitalLink("vintasoft.com", aiValues));

        // create the barcode writer
        using (BarcodeWriter writer = new BarcodeWriter())
        {
            // specify that writer must create output image as 24-bpp image
            writer.Settings.PixelFormat = BarcodeImagePixelFormat.Bgr24;

            // encode GS1 Digital Link barcode
            barcodeSubset.Encode(gs1DigitalLinkValue, writer.Settings);

            // create image with barcode
            using (VintasoftBitmap barcodeImage = writer.GetBarcodeAsVintasoftBitmap())
            {
                // delete aiValues array
                aiValues = null;

                // read barcode with GS1 value

                // create barcode reader
                using (BarcodeReader reader = new BarcodeReader())
                {
                    // specify that reader must search for GS1 Digital Link barcodes only

                    reader.Settings.ScanBarcodeTypes = BarcodeType.None;
                    reader.Settings.ScanBarcodeSubsets.Add(barcodeSubset);

                    // read barcode from image
                    IBarcodeInfo[] infos = reader.ReadBarcodes(barcodeImage);

                    // gets GS1 value from barcode value
                    gs1DigitalLinkValue = (GS1DigitalLinkValueItem)(infos[0].ValueItems[0]);

                    // print barcode type
                    Console.WriteLine("Barcode Type: {0}", infos[0].BarcodeType);
                    Console.WriteLine();

                    // print GS1 Digital Link URI value
                    Console.WriteLine("GS1 Digital Link URI:\n{0}", gs1DigitalLinkValue.DigitalLink.DigitalLinkUri);
                    Console.WriteLine();

                    // gets a GS1 Application identifiers from barcode value
                    aiValues = gs1DigitalLinkValue.ApplicationIdentifierValues;

                    StringBuilder printableValue = new StringBuilder();
                    // print Application identifiers values
                    for (int i = 0; i < aiValues.Length; i++)
                    {
                        GS1ApplicationIdentifierValue aiValue = aiValues[i];
                        ai = aiValue.ApplicationIdentifier;
                        Console.WriteLine(string.Format("[{0}] {1}", i + 1, aiValue));
                        Console.WriteLine(string.Format("Application identifier   : {0}", ai.ApplicationIdentifier));
                        Console.WriteLine(string.Format("Value                    : {0}", aiValue.Value));
                        Console.WriteLine(string.Format("Data title               : {0}", ai.DataTitle));
                        Console.WriteLine(string.Format("Data content             : {0}", ai.DataContent));
                        Console.WriteLine(string.Format("Format                   : {0}", ai.Format));
                        Console.WriteLine(string.Format("Is contains decimal point: {0}", ai.IsContainsDecimalPoint));
                        Console.WriteLine(string.Format("Is variable length       : {0}", ai.IsVariableLength));
                        Console.WriteLine();
                        printableValue.Append(aiValue.ToString());
                    }

                    // print GS1 printable value
                    Console.WriteLine("Printable GS1 value: " + printableValue.ToString());
                }
            }
        }
    }
}