목차
요약: QR 코드는 메시지만 저장하지 않습니다. 메시지로 계산한 예비 바이트, 즉 리드-솔로몬(Reed–Solomon) 오류 정정을 덧붙입니다. 음악 CD에 쓰이는 것과 같은 수학이라, 빠지거나 틀린 바이트를 리더가 복원할 수 있습니다. 예비를 얼마나 둘지는 직접 고릅니다. L, M, Q, H 네 레벨이 각각 코드워드의 약 7, 15, 25, 30%를 복원하고, 예비 바이트가 많을수록 코드가 커집니다. 가운데에 로고를 넣어도 스캔되는 이유가 이것입니다. 리더에게 로고는 손상일 뿐입니다. 세 모서리의 사각형은 다릅니다. 데이터가 아니라 리더가 코드를 찾고 똑바로 펴는 데 쓰이므로, 대부분의 리더에게 꼭 필요합니다.
찢기고 얼룩져도 스캔된다
QR 코드를 개발한 DENSO WAVE(덴소 웨이브): "QR Code has error correction capability to restore data if the code is dirty or damaged."(QR 코드에는 코드가 더럽거나 손상되어도 데이터를 복원하는 오류 정정 기능이 있다). 특징 목록에는 이렇게도 적혀 있습니다: "Data can be restored even if the symbol is partially dirty or damaged."(심벌이 부분적으로 더럽거나 손상되어도 데이터를 복원할 수 있다).
영상 속 코드는 진짜이고, 내용은 oliverz.dev입니다. 한 모서리가 찢기고, 가장자리에 얼룩이 지고, 가운데를 로고가 덮어 44개 코드워드 중 13개가 틀렸지만 그래도 디코딩됩니다(jsQR과 ZXing 두 디코더로 테스트했습니다).
메시지로 계산한 예비 바이트
DENSO WAVE: "The QR Code error correction feature is implemented by adding a Reed-Solomon Code… to the original data."(QR 코드의 오류 정정 기능은 원래 데이터에 리드-솔로몬 부호를 더해 구현된다). 캔터베리 대학교의 『Computer Science Field Guide』는 더 간단히 말합니다: "it adds extra bits to the data so that errors can be corrected."(오류를 정정할 수 있도록 데이터에 여분의 비트를 더한다).
단위는 코드워드입니다. DENSO WAVE: "codeword is a unit that constructs the data area. One codeword of QR Code is equal to 8 bits."(코드워드는 데이터 영역을 구성하는 단위다. QR 코드의 코드워드 하나는 8비트다). CS Field Guide: "Each black or white square (“dot” or “module”) corresponds to one bit of data."(검은색 또는 흰색 사각형('점' 또는 '모듈') 하나가 데이터 1비트에 해당한다). 그러니 모듈 8개가 1바이트입니다.
새로운 수학은 아닙니다. DENSO WAVE: "Reed-Solomon Code is a mathematical error correction method used for music CDs etc. The technology was originally developed as a measure against communication noise for artificial satellites and planetary probes."(리드-솔로몬 부호는 음악 CD 등에 쓰이는 수학적 오류 정정 방식이다. 이 기술은 원래 인공위성과 행성 탐사선의 통신 잡음 대책으로 개발되었다).
1바이트를 고치려면 예비 2바이트
DENSO WAVE: "Reed-Solomon Code requires twice the amount of codewords to be corrected."(리드-솔로몬 부호는 정정할 코드워드 수의 두 배가 필요하다). CS Field Guide: "The maximum number of errors that a Reed-Solomon code can correct is one half of the amount of extra error correcting data added to it."(리드-솔로몬 부호가 정정할 수 있는 최대 오류 수는 덧붙인 오류 정정 데이터 양의 절반이다).
우리 코드는 가장 높은 레벨에서 메시지 코드워드 16개와 예비 코드워드 28개, 모두 44개입니다. 28의 절반은 14이므로 틀린 코드워드를 최대 14개까지 고칠 수 있습니다. 44개 중 14개는 약 32%(직접 계산)로, DENSO의 "Approx. 30%"(약 30%)에 해당합니다. 테스트에서도 한계는 정확히 거기였습니다. 코드워드 14개가 틀리면 읽혔고, 15개면 결과가 없었습니다.
틀린 결과가 아니라 결과가 없습니다. CS Field Guide: "they won’t read the data incorrectly, instead they just refuse to give any data at all, rather than giving you incorrect data."(데이터를 잘못 읽지 않는다. 틀린 데이터를 주느니 아예 어떤 데이터도 내주지 않는다).
네 가지 레벨: 7%에서 30%까지
DENSO WAVE가 정리한 표준(ISO/IEC 18004) 개요: "Level L Level M Level Q Level H Approx. 7% of codewords can be restored. Approx. 15% of codewords can be restored. Approx. 25% of codewords can be restored. Approx. 30% of codewords can be restored."(레벨 L, M, Q, H: 코드워드의 약 7% 복원 가능. 약 15% 복원 가능. 약 25% 복원 가능. 약 30% 복원 가능).
이 비율은 눈에 보이는 면적이 아니라 코드워드를 셉니다: "*Data restoration rate for total codewords" … "QR Code therefore represents its error correction rate as a ratio of the total codewords."(*전체 코드워드 대비 데이터 복원율 … 그래서 QR 코드는 오류 정정률을 전체 코드워드에 대한 비율로 나타낸다).
예비 바이트가 늘면 자리를 차지합니다. DENSO WAVE: "Raising this level improves error correction capability but also increases the amount of data QR Code size."(이 레벨을 높이면 오류 정정 능력이 좋아지지만 데이터 양과 QR 코드 크기도 늘어난다). 그리고: "as the amount of data increases, more modules are required to comprise QR Code, resulting in larger QR Code symbols."(데이터 양이 늘면 QR 코드를 이루는 데 더 많은 모듈이 필요해져 QR 코드 심벌이 커진다). oliverz.dev를 담은 우리의 네 코드, 메시지 + 예비 코드워드:
- L: 19 + 7, 21 × 21 모듈
- M: 16 + 10, 21 × 21 모듈
- Q: 13 + 13, 21 × 21 모듈
- H: 16 + 28, 25 × 25 모듈(H에서는 "oliverz.dev"의 11바이트가 21 × 21에 더 이상 들어가지 않음)
로고는 고칠 수 있는 손상
그래서 가운데 로고도 괜찮습니다. 리더는 로고를 손상으로 보고 가려진 부분을 복원합니다. 우리 H 코드에서 7 × 7 모듈 로고는 44개 코드워드 중 9개를 틀리게 만들고, 한도인 14개 안에 들어옵니다.
다만 공짜는 아닙니다. 예비 바이트를 써 버립니다. 색이나 그림을 넣은 코드에 대한 DENSO WAVE의 FAQ: "If it is deformed, the QR Code's error correction function is invoked where even a tiny missing or smeared part renders the reading operation impossible, or the response of the operation may become slow."(변형되어 있으면 QR 코드의 오류 정정 기능이 작동하는데, 이때는 아주 작은 누락이나 번짐만으로도 읽을 수 없게 되거나 읽는 반응이 느려질 수 있다).
모서리는 가리지 말 것
세 개의 큰 사각형은 데이터가 아닙니다. DENSO WAVE: "QR Code accomplishes this task through position detection patterns located at the three corners of the symbol."(QR 코드는 심벌의 세 모서리에 있는 위치 검출 패턴으로 이 일을 해낸다). QR 코드의 역사 페이지에 따르면, 이 덕분에 "the orientation of their code could be determined regardless of the angle of scanning, which could be any angle out of 360°"(스캔 각도가 360° 중 어느 각도든 상관없이 코드의 방향을 알아낼 수 있었다).
CS Field Guide: "Don’t colour in near the three large squares in the corners, as most QR scanners need these to align the image."(모서리의 큰 사각형 세 개 근처는 칠하지 말 것. 대부분의 QR 스캐너가 이미지를 정렬하는 데 이것이 필요하다).
우리 테스트에서는 모서리 사각형 하나의 가운데에 3 × 3 모듈짜리 작은 스티커를 붙이자, 데이터 바이트는 하나도 건드리지 않았는데도 두 디코더 모두 읽지 못했습니다. 로고는 모듈 49개를 덮어도 스캔되고, 스티커는 9개만 덮어도 스캔되지 않습니다.
핵심 정리
- QR 코드는 메시지와 그것으로 만든 예비 바이트(리드-솔로몬)를 저장하므로, 리더가 찢기거나 얼룩지거나 가려진 바이트를 복원합니다.
- 예비의 양은 고를 수 있습니다. L, M, Q, H, 코드워드의 약 7~30%. 예비 바이트가 많을수록 코드가 커집니다. 가운데 로고는 예비 바이트가 메워 주는 손상입니다.
- 세 모서리의 사각형은 데이터가 아닙니다. 리더가 코드를 찾고 똑바로 펴는 데 쓰이므로, 대부분의 리더에게 꼭 필요합니다.
출처
- DENSO WAVE: Error Correction Feature, QR Code Standardization, What is a QR Code?, Information capacity and versions of the QR Code, History of QR Code, FAQ
- 캔터베리 대학교(University of Canterbury), Computer Science Field Guide, QR codes
영상은 코드로 애니메이션을 만들었고, 대본은 AI의 도움을 받아 썼습니다. 위의 모든 인용은 원문과 대조해 확인했으며, "직접 계산"으로 표시한 수치는 제가 직접 계산한 값입니다. 코드는 진짜이고(생성한 뒤 jsQR과 ZXing으로 디코딩), 그 바이트와 코드워드 수도 진짜입니다. 설명을 위한 연출: 찢긴 자국, 얼룩, 로고(특정 브랜드가 아닌 일반 마크로, 테스트한 모듈 위에 정확히 그림), 카메라 뷰파인더, 그리고 기울어진 코드(같은 코드를 원근법으로 그림). 실제 마모는 모듈을 따라 그린 손상만큼 깔끔하지 않습니다. "QR Code"는 DENSO WAVE INCORPORATED의 등록 상표입니다. 영상 내레이션은 영어입니다. 영상은 Shotloop으로 만들었습니다. 코드로 설명 영상을 만들고 한 샷씩 고칠 수 있는 제가 만든 무료 Mac 앱입니다.






