본문으로 건너뛰기
튜토리얼

QR 코드 오류 정정 설명(L, M, Q, H): 실제로 어떤 레벨을 써야 할까?

· 11 분 소요

QR 코드 생성기를 켜면 L, M, Q, H 네 가지 옵션이 보입니다. 대부분은 기본값 그대로 두고 지나가다가 — 인쇄된 코드가 출력소에서 스캔이 안 되거나, 마케팅 팀이 가운데에 로고를 깔아놓아 코드 전체가 죽는 일이 벌어집니다. 오류 정정 레벨은 외관 설정이 아닙니다. 코드가 견딜 수 있는 물리적 손상의 양을 결정하고, 코드가 담을 수 있는 데이터 양과 직접 상충 관계에 있습니다.

이 글은 QR 명세(ISO/IEC 18004) 안에서 그 레벨들이 실제로 무엇을 하는지, 실제 숫자로 용량이 어떻게 변하는지, 그리고 사용 사례에 맞게 어떻게 고를지를 설명합니다.

오류 정정이란 실제로 무엇인가

QR 코드는 단순히 데이터를 인코딩하는 것이 아니라 — 코드의 손상되거나 읽을 수 없는 부분을 재구성할 수 있게 하는冗余(redundancy) 정보도 함께 인코딩합니다. 메커니즘은 Reed–Solomon 오류 정정으로, CD, DVD, 블루레이 디스크, 심우주 통신에서 쓰이는 것과 같은 계열의 알고리즘입니다.

QR 코드가 생성될 때 데이터 페이로드는 블록으로 나뉘고, 각 블록에 대해 인코더는 한 세트의 오류 정정 코드워드를 계산합니다. 이후 리더가 모듈(검정·흰색 사각형) 중 — 흠집, 커피 자국, 조명 불량, 위에 깔린 로고 때문에 — 읽을 수 없는 부분을 발견하면, 그 冗余 코드워드를 사용해 손실된 코드워드를 수학적으로 재구성합니다.

Reed–Solomon 코드에는 유용한 성질이 있습니다: 위치를 모르는 t개의 잘못된 코드워드를 정정하려면 2t개의 冗余 코드워드가 필요합니다. (손상된 코드워드의 위치를 아는 경우 — “이레이저(erasure)”라고 부릅니다 — 각 冗余 코드워드가 하나를 고칩니다.) 오류 정정 레벨은 단순히 전체 코드워드 예산 중에서 冗余에 쓰이는 비율과 페이로드에 쓰이는 비율을 조절합니다.

숫자로 본 네 가지 레벨

ISO/IEC 18004 명세는 다음의 대략적인 복구 능력을 가진 네 가지 오류 정정 레벨을 정의합니다 — 손상되어도 완전히 복구 가능한 코드워드의 비율입니다:

레벨이름복구 능력
LLow코드워드의 ~7%
MMedium코드워드의 ~15%
QQuartile코드워드의 ~25%
HHigh코드워드의 ~30%

하나의 퍼센트 숫자가 숨기는 두 가지 중요한 뉘앙스:

  1. 퍼센트는 코드워드에 적용되며 모듈 면적에 적용되지 않습니다. “레벨 H는 코드의 30%가 가려져도 살아남는다”는 통념은 실제로는 대략 맞습니다 — 손상은 보통 연속된 영역이기 때문입니다 — 하지만 형식적 한계는 손상된 코드워드 수에 대한 것입니다. 공간적으로 뭉친 손상(로고 등)은 같은 개수의 에러가 무작위로 흩어진 경우보다 복구하기 쉬운 경우가 많습니다. 왜냐하면 이레이저는 위치를 모르는 에러보다 정정 비용이 싸기 때문입니다.
  2. 상위 레벨은 용량을 깎아 먹습니다. 같은 버전(크기)에서 冗余가 늘어나면 페이로드에 쓸 공간이 줄어듭니다. 데이터가 안 들어가면 인코더는 더 큰 버전으로 점프해야 합니다 — 모듈이 더 많아지고, 인쇄가 더 조밀해지며, 먼 거리에서 스캔하기가 더 어려워집니다.

용량: 레벨이 실제 데이터에 대가하는 것

QR 코드는 버전이라 부르는 40가지 크기가 있습니다. 버전 1은 21×21 모듈이고, 이후 각 버전은 한 변에 4 모듈씩 추가되어 버전 40은 177×177입니다. 아래 표는 명세에서 가져온 세 가지 대표 페이로드 유형에 대한 최대 문자 용량을 네 레벨에 걸쳐 보여줍니다. (바이트 모드는 임의의 UTF-8 유사 바이너리 데이터와 일반적인 URL을, 영숫자 모드는 0–9 A–Z space $%*+-./:를, 숫자 모드는 숫자만을 담습니다.)

버전모듈레벨숫자영숫자바이트
121×21L412517
121×21M342014
121×21Q271611
121×21H17107
537×37L255154106
537×37M20212284
537×37Q1448760
537×37H1066444
1057×57L652395271
1057×57M513311213
1057×57Q364221151
1057×57H288174119
2097×97L20611249858
2097×97M1600970666
2097×97Q1120679466
2097×97H861521358
40177×177L708942962953
40177×177M559633912331
40177×177Q399324201663
40177×177H305718521273

버전 1을 주의 깊게 보세요. L에서 H로 올리면 바이트 용량이 17에서 7로 떨어집니다 — 59% 감소. 이 트레이드오프는 보통 인쇄에는 값지지만, 실제로는 비용입니다. 레벨 M에서 버전 4 코드에 편안하게 들어가는 긴 URL이 레벨 H에서는 버전 6 코드를 강제할 수 있고, 더 큰 코드는 같은 인쇄 크기에서 더 작은 모듈을 의미합니다.

짧은 페이로드는 항상 더 강한 오류 정정을 이깁니다. 레벨 H의 저버전 코드에 담긴 짧은 URL은 거의 모든 경우 레벨 L의 고버전 코드에 담긴 긴 URL보다 더 잘 스캔됩니다. URL을 인코딩한다면 짧은 도메인이나 리디렉션을 사용하세요. 이게 다른 어떤 최적화보다 중요합니다.

인쇄 크기와 스캔 거리: 10:1 규칙

오류 정정은 단순히 너무 작아서 분해되지 못하는 코드를 살릴 수 없습니다. 널리 쓰이는 현장 규칙은 10:1 비율입니다. 스캔 거리는 코드 폭의 약 10배를 넘지 않아야 합니다. 일부 자료는 10:1을 보수적이라고 보고 좋은 카메라와 조명에서 15:1까지 성공한 사례를 언급하지만, 설계 기준은 10:1입니다.

  • 명함용 코드, 폭 2 cm → 안정적 스캔 ~20 cm까지
  • 포스터용 코드, 폭 10 cm → 안정적 스� ~1 m까지
  • 빌보드용 코드, 폭 1 m → 안정적 스� ~10 m까지

두 가지 연관된 제약:

  1. 모듈 크기. 각 모듈은 최소한 대략 0.4 mm 정도는 되어야 합니다(약 2 mil은 너무 작고, 0.4 mm가 흔한 인쇄 하한입니다) 그래야 스마트폰 카메라가 분해할 수 있습니다. 버전 10 코드(57 모듈)의 경우, 데이터 영역만으로 최소 약 2.3 cm의 물리적 크기가 필요합니다.
  2. 쿼이어 존(quiet zone). 명세는 코드 주변에 최소 4 모듈의 흰 여백을 요구합니다. 쿼이어 존을 잘라내는 것은 인쇄된 코드가 실패하는 가장 흔한 이유 중 하나이며, 어떤 오류 정정 레벨로도 고칠 수 없습니다 — 리더는 코드의 가장자리를 찾기 위해 쿼이어 존을 사용합니다.

왜 로고는 레벨 H를 요구하는가

QR 코드 중앙에 로고를 깔아넣는 것은 레벨 H가 존재하게 된 고전적인 이유입니다. 로고는 물리적으로 모듈을 덮어 그 아래의 코드워드를 파괴합니다. 레벨 H의 ~30% 복구 예산이 이것을 견딜 수 있게 만드는 것입니다.

로고 오버레이의 실용 규칙:

  • H를 쓰세요. 항상. M(~15%)에서는 적당한 크기의 로고만으로도 예산의 대부분을 먹어버립니다.
  • 로고를 전체 코드 면적의 ~30% 미만으로 유지하세요 — 가능하면 훨씬 더 작게, �인 영역이 코드워드 블록에 깨끗하게 분산되는 경우는 거의 없기 때문입니다. 레벨 H에서 20% 면적을 덮는 로고는 편안한 디자인이고, 28%는 도박입니다.
  • 중앙에 두세요. 세 개의 파인더 패턴(모서리의 큰 사각형)과 타이밍/얼라인먼트 패턴은 구조 데이터를 담고 있어 오류 정정이 똑같은 방식으로 보호하지 않습니다. 중앙 배치는 그것들을 피합니다.
  • 실제 휴대전화로, 실제 거리에서, 나쁜 조명에서 테스트하세요. 책상 위의 최신 플래그십만으로 테스트하지 마세요. 카메라가 평범한 구형 안드로이드 기기가 설계의 바닥입니다.

다른 곳에서 설정한 레벨을 묻지 않고 로고를 코드 위에 얹게 해주는 생성기는 사실상 당신이 다른 곳에서 고른 레벨에 베팅하는 셈입니다. L로 설정하고 로고를 추가하면, 가끔 실패하는 코드가 만들어집니다 — 가장 나쁜 결과입니다. 평소 테스트는 통과하지만 현장에서 실패하기 때문입니다.

실제로 어떻게 고르는가

레벨 L (~7%) — 이미지가 완벽하게 렌더되는 디지털 전용 상황: 앱 간 핸드오프, 화면, �에 표시되는 생성 티켓. 깨끗한 픽셀에서는 거의 잘못될 수 없으므로 예산을 용량과 작은 크기에 쓰세요. 그 외에는 거의 올바른 선택이 아닙니다.

레벨 M (~15%) — 깔끔한 인쇄의 일반 기본값: 명함, 제품 포장, 문서. 일반적인 취급 마모, 사소한 인쇄 결함, 글레어를 견딘니다. 대부분의 생성기 기본값이 여기에 있고, 그럴 만한 이유가 있습니다.

레벨 Q (~25%) — 로고 오버레이 없이 험한 물리적 환경: 산업 라벨, 창고 선반, 장비 태그, 날씨에 노출된 야외 표지판. 표면이 정상 사용에서 긁히고, 더럽혀지고, 일부 가려진다면 Q가 일터용입니다.

레벨 H (~30%) — 로고 오버레이, 매우 험한 환경, 또는 스캔 실패가 비용이 큰 상황(결제 코드, 안전 관련 라벨). 매우 작게 인쇄해야 하고 저품질 카메라를 예상하는 경우에도 올바른 선택입니다.

결정 트리는 이렇게 압축됩니다: 디지털 → L 또는 M; 깔끔한 인쇄 → M; 거친 환경 → Q; 로고 또는 결정적 신뢰성 → H. 그리고 레벨에 관계없이: 페이로드를 짧게 유지하고, 쿼이어 존을 유지하고, 10:1 거리 규칙을 지키세요.

직접 검증하세요

이론은 좋지만 QR 오류 정정은 경험적으로 테스트하기 쉽습니다. 같은 URL을 QR 코드 생성기로 각 레벨에 대해 생성해 비교하세요:

  1. 레벨 L, 그다음 M, Q, H로 코드를 생성합니다. 모듈 밀도가 점점 높아지는 것을 보세요 — 그 시각적 밀도가 바로 冗余입니다.
  2. H 레벨 버전을 인쇄하고 가운데를 동전이나 스티커로 덮어보세요(약 20% 영역). 그래도 스캔되어야 합니다.
  3. 같은 것을 L 레벨 버전으로 해보세요. 안 됩니다.
  4. H 레벨 코드를 가지고 점점 더 많은 영역을 덮어가며 스캔이 실패할 때까지 진행하세요 — 실제 한계가 이론적인 ~30%에 가깝다는 것을 알게 될 겁니다.

용량 트레이드오프도 직접 볼 수 있습니다: 긴 URL을 붙여넣고 각 레벨이 어떤 버전(크기)을 요구하는지 지켜보세요. 이 실험이 어떤 표보다 빠르게 트레이드오프를 가르쳐줍니다.

요약

  • QR 코드의 오류 정정은 Reed–Solomon 冗余이며, 레벨은 코드워드 예산 중 冗余의 비율을 결정합니다: L ≈ 7%, M ≈ 15%, Q ≈ 25%, H ≈ 30% 복구.
  • 더 높은 레벨은 용량을 깎아 먹습니다 — 버전 1에서 H는 L이 담을 수 있는 바이트의 절반도 못 담습니다.
  • 짧은 페이로드가 더 강한 정정을 이깁니다; 레벨을 올리기 전에 URL을 짧게 만드세요.
  • 인쇄 크기는 10:1 거리 규칙으로 설계하고 4 모듈 쿼이어 존을 절대 자르지 마세요.
  • 로고 오버레이 ⇒ 레벨 H, 로고는 면적의 ~30% 미만, 중앙 정렬, 저가형 폰에서 테스트.

QR 코드 생성기로 몇 가지 변형을 생성해 보면, 사용 사례에 맞는 레벨이 5분 안에 명확해질 것입니다.