QR코드 안에는 무엇이 있는가: 구조, 용량, 오류 정정

QR코드가 데이터를 저장하는 방식, 파인더 패턴과 조용한 영역의 역할, 오류 정정 수준이 인코딩 가능한 양을 바꾸는 이유, 그리고 코드를 생성하기 전에 알아둘 만한 실질적 한계를 설명합니다.

QR코드는 무작위로 흩뿌려진 흑백 잡음처럼 보이지만, 모든 부분이 구조를 갖고 있습니다. 모서리의 큰 정사각형 세 개, 타이밍 선, 조용한 여백, 데이터 영역에는 각각 맡은 역할이 있습니다. 대부분의 경우 그저 작동하는 코드만 있으면 되지만, 이 부분들 중 몇몇은 코드가 안정적으로 스캔되는지, 얼마나 많은 데이터를 담을 수 있는지, 얼마나 작게 인쇄할 수 있는지에 직접 영향을 줍니다. 각 요소가 하는 일을 알면 "가끔 스캔이 안 된다"는 문제가 수수께끼에서 점검 목록으로 바뀝니다.

고정 패턴

데이터에 앞서 QR코드에는 스캐너가 코드를 찾고 방향을 잡도록 하는 패턴이 들어 있습니다.

  • 파인더 패턴 . 모서리에 있는 큰 중첩 정사각형 세 개입니다. 스캐너는 이것을 먼저 감지하며, 고정된 비율을 통해 코드의 위치를 파악하고 이미지가 비스듬할 때도 회전 정도를 계산해 냅니다.
  • 정렬 패턴 . 더 작은 정사각형으로(가장 작은 코드를 제외한 모든 코드에 있습니다), 코드가 굽거나 기울어진 표면에 있을 때 왜곡을 보정합니다.
  • 타이밍 패턴 . 파인더들 사이를 가로지르는 점선으로, 스캐너에 각 모듈의 격자 크기를 알려 줍니다.
  • 조용한 영역 . 코드 전체를 둘러싼 빈 여백으로, 네 모듈 너비가 권장됩니다. 이것은 장식이 아닙니다. 이 영역이 없으면 스캐너가 주변 콘텐츠로부터 코드를 분리하지 못할 수 있습니다. QR코드를 다른 그래픽에 바짝 붙여 두는 것은 인쇄된 코드가 스캔되지 않는 가장 흔한 이유입니다.

그 밖의 모든 것, 즉 얼룩덜룩한 내부는 인코딩된 데이터와 그 오류 정정 바이트입니다.

버전과 용량

QR코드에는 1부터 40까지의 버전이 있으며, 버전은 곧 격자 크기입니다. 버전1은 21×21모듈이고, 한 단계 올라갈 때마다 한 변에 4모듈씩 더해집니다. 격자가 클수록 더 많은 데이터를 담습니다. 용량은 무엇을 인코딩하느냐에도 좌우되는데, QR에는 전용 모드가 있기 때문입니다.

  • 숫자(Numeric) . 숫자만 가능하며, 가장 밀도가 높습니다.
  • 영숫자(Alphanumeric) . 숫자, 대문자, 몇 가지 기호를 담습니다.
  • 바이트(Byte) . 임의의 바이트로, URL과 대소문자가 섞인 텍스트가 이 모드를 사용하며, 밀도가 가장 낮습니다.

흔히 내세우는 최대치, 즉 수천 자라는 수치는 가장 큰 버전에서 오류 정정을 최소화한 숫자 모드를 가정한 것입니다. 실제 URL을 바이트 모드로 담으면 실질적 한계에 훨씬 빨리 도달하며, 그래서 긴 링크는 빽빽하고 스캔하기 어려운 코드를 만들어 냅니다. 해결책은 보통 코드를 키우는 것이 아니라 URL을 줄이는 것입니다.

오류 정정은 실질적인 절충점입니다

이것은 사람들이 이해하지 못한 채 생성하는 설정이지만, 중요합니다. QR코드는 Reed-Solomon 오류 정정을 사용하는데, 이는 코드의 일부가 더럽거나 손상되거나 가려져도 여전히 읽히도록 중복 바이트를 더하는 방식입니다. 네 가지 수준이 있습니다.

수준 복구 가능 범위 비용
L (Low) 약 7% 데이터 용량 대부분 확보
M (Medium) 약 15% 균형 잡힌 기본값
Q (Quartile) 약 25% 용량 감소
H (High) 약 30% 용량 가장 적음

높은 수준은 가운데에 로고가 들어간 QR코드가 작동하게 해 주는 요소입니다. 로고가 데이터를 가리면 오류 정정이 그것을 복원합니다. 그러나 중복은 용량을 소모합니다. H 수준에서는 코드의 거의 3분의 1이 정정 바이트이므로, 같은 데이터라도 더 크고 빽빽한 격자가 필요합니다. M 수준이 합리적인 기본값이며, 손상이 예상되거나 로고를 덧입히려 할 때만 Q나 H로 올리고, 그 결과로 커지는 코드를 감수하면 됩니다.

알아둘 만한 실질적 한계

흔한 통념과 달리 어떤 QR코드도 할 수 없는 몇 가지가 있습니다.

  • QR코드는 암호화되지 않으며 비공개도 아닙니다. 이것은 개방형 인코딩이라, 스캐너를 가진 누구나 그 안의 내용을 그대로 읽습니다. 형식이 보호해 주리라 기대하며 비밀 정보를 담지 마십시오.
  • 정적입니다. 데이터는 생성 시점에 고정됩니다. 나중에 편집할 수 있는 "동적" QR코드는 코드 자체를 바꾸지 않습니다. 짧은 리디렉션 URL을 인코딩해 두고 그 대상을 다시 가리키는 것이므로, 제3자 서비스가 계속 유지되는 데 의존합니다.
  • 대비와 크기는 선택 사항이 아닙니다. 조용한 영역을 온전히 유지한 채 밝은 바탕에 어두운 코드를 쓰고, 각 모듈이 촬영 해상도에서 살아남을 만큼 충분히 크게 인쇄해야 합니다. 색상 반전과 좁은 여백은 어떤 폰에서는 스캔되고 다른 폰에서는 안 되는 코드의 흔한 원인입니다.

콘텐츠가 URL이라면 코드는 그 텍스트를 그대로 저장할 뿐이므로, 링크 자체의 인코딩 규칙은 여전히 적용됩니다. 공백과 특수 문자는 코드에 넣기 전에 퍼센트 인코딩에서 다루는 대로 처리해야 합니다. 모드와 오류 정정 수준을 명시적으로 설정해 생성하려면, 우리 QR코드 생성기가 브라우저 안에서 코드를 만들어 데이터가 기기를 벗어나지 않게 합니다.