도입부
웹 어플리케이션을 개발하다 보면 사용자에게 특정 URL, 결제 링크, 혹은 Wi-Fi 접속 정보를 제공하기 위해 QR코드를 즉석에서 동적으로 생성해야 하는 상황을 자주 마주하게 됩니다. 과거에는 서버 사이드에서 이미지를 생성한 뒤 클라이언트로 내려보내는 방식이 주로 사용되었으나, 이는 서버 리소스를 소모하고 네트워크 레이턴시(지연 시간)를 유발한다는 단점이 있습니다.
현대의 웹 개발에서는 브라우저 성능 향상과 훌륭한 오픈소스 라이브러리들의 등장 덕분에 **클라이언트 사이드(Client-Side)**에서 실시간으로 QR코드를 생성하는 것이 표준으로 자리 잡았습니다. 서버로 데이터를 전송하지 않기 때문에 사용자의 개인정보를 보호할 수 있고, 오프라인 환경에서도 작동한다는 뛰어난 장점이 있습니다. 이 글에서는 가장 널리 쓰이는 자바스크립트 QR코드 생성 라이브러리 4종의 특징을 비교해보고, HTML5 Canvas를 활용하여 클라이언트 사이드에서 QR코드를 렌더링하고 다운로드하는 구체적인 구현 방법을 살펴보겠습니다.
자바스크립트 QR코드 생성 라이브러리 비교
자바스크립트 생태계에는 다양한 QR코드 생성 라이브러리가 존재합니다. 프로젝트의 요구사항(단순 렌더링, 로고 삽입, 디자인 커스텀 등)에 따라 적절한 라이브러리를 선택하는 것이 중요합니다. 아래 표는 프론트엔드 개발 시 자주 검토되는 대표적인 라이브러리 4종의 특징을 정리한 것입니다.
| 라이브러리 명 | 다운로드 수 (npm) | 주요 장점 | 출력 형식 | 로고 삽입 지원 |
|---|---|---|---|---|
qrcode (node-qrcode) |
매우 높음 (표준) | Node.js와 브라우저 양대 플랫폼 완벽 지원, 높은 안정성 | Canvas, SVG, DataURL | 수동 구현 필요 |
EasyQRCodeJS |
보통 | 매우 다양하고 세부적인 디자인 옵션 기본 제공 | Canvas, SVG, Table | 기본 지원 (옵션 내장) |
qr-code-styling |
높음 | 그라데이션 효과, 부드러운 모서리 등 뛰어난 시각적 디자인 제공 | Canvas, SVG | 기본 지원 (옵션 내장) |
qrcode.js |
낮음 (레거시) | 초경량화, 외부 의존성 없음, 오래된 브라우저 지원 | Canvas, DOM | 지원 안 함 |
QR코드 오류 정정 레벨 (Error Correction Level)
QR코드는 일부가 훼손되거나 가려져도 데이터를 복구해 낼 수 있는 리드 솔로몬(Reed-Solomon) 오류 정정 알고리즘을 내장하고 있습니다. 개발 시 라이브러리 옵션으로 지정하게 되는 오류 정정 레벨은 다음과 같습니다.
- Level L (Low): 약 **7%**의 데이터 복구 가능. 픽셀 밀도가 낮아 스캔이 빠르며 데이터 양이 많을 때 유리합니다.
- Level M (Medium): 약 **15%**의 데이터 복구 가능. 가장 일반적으로 사용되는 기본 설정값입니다.
- Level Q (Quartile): 약 **25%**의 데이터 복구 가능. 오염이 발생하기 쉬운 산업 현장 등에서 유용합니다.
- Level H (High): 약 **30%**의 데이터 복구 가능. QR코드 중앙에 브랜드 로고나 아이콘을 삽입할 때 필수적으로 지정해야 합니다. 로고가 가리는 영역을 오류 정정 기능이 복구하기 때문입니다.
실무 적용 및 구현 가이드
가장 대중적이고 안정적인 qrcode (node-qrcode) 라이브러리를 활용해 브라우저 단에서 Canvas 엘리먼트에 QR코드를 실시간으로 렌더링하는 코드를 구현해 보겠습니다.
1. 패키지 설치
프로젝트 환경에 따라 npm을 통해 라이브러리를 설치하거나 CDN을 이용해 불러옵니다.
npm install qrcode
또는 CDN 스크립트를 HTML에 추가합니다.
<script src="https://cdn.jsdelivr.net/npm/qrcode@1.5.3/build/qrcode.min.js"></script>
2. HTML 구조 정의
QR코드가 그려질 Canvas 엘리먼트와 다운로드 버튼을 구성합니다.
<div class="qr-container">
<canvas id="qr-canvas"></canvas>
<button id="download-btn" class="btn">QR코드 다운로드</button>
</div>
3. 자바스크립트 구현 코드
사용자가 입력한 텍스트나 URL을 기반으로 Canvas에 QR코드를 그리고, 이를 PNG 이미지 파일로 저장할 수 있도록 기능을 작성합니다.
import QRCode from 'qrcode';
const canvas = document.getElementById('qr-canvas');
const downloadBtn = document.getElementById('download-btn');
const targetUrl = 'https://example.com';
// QR코드 생성 함수
function generateQRCode(text) {
const options = {
width: 256,
margin: 4,
errorCorrectionLevel: 'H', // 로고 삽입이나 훼손 방지를 위해 높음으로 설정
color: {
dark: '#0f172a', // QR코드 셀 색상 (기본: 검정색)
light: '#ffffff' // 배경 색상
}
};
QRCode.toCanvas(canvas, text, options, function (error) {
if (error) {
console.error('QR코드 생성 실패:', error);
return;
}
console.log('QR코드가 성공적으로 생성되었습니다!');
});
}
// 이미지 다운로드 이벤트 핸들러
downloadBtn.addEventListener('click', () => {
const imageUrl = canvas.toDataURL('image/png');
const link = document.createElement('a');
link.href = imageUrl;
link.download = 'qrcode.png';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
// 초기 실행
generateQRCode(targetUrl);
자주 묻는 질문 및 트러블슈팅
Q. QR코드 내부에 로고 이미지를 삽입하려면 어떻게 하나요?
qrcode 라이브러리로 Canvas에 QR코드를 먼저 생성한 뒤, 자바스크립트의 CanvasRenderingContext2D.drawImage() API를 이용하여 Canvas 중심부에 로고 이미지를 겹쳐 그리는 방식을 사용해야 합니다. 이때 로고의 크기는 전체 QR코드 면적의 10~15%를 넘지 않도록 해야 하며, 반드시 오류 정정 레벨을 **H**로 지정해야 스캔 오류를 방지할 수 있습니다.
Q. 생성된 QR코드가 인쇄물이나 화면에서 스캔이 잘 안 됩니다.
두 가지 원인을 확인해야 합니다. 첫째는 **대비(Contrast)**입니다. 배경색과 어두운 영역(셀)의 밝기 차이가 뚜렷해야 합니다. 셀 색상을 너무 밝게 하거나 그라데이션을 과하게 주면 리더기가 인식하지 못합니다. 둘째는 **조용한 영역(Quiet Zone / Margin)**의 확보입니다. QR코드 테두리 바깥에 최소 4셀 이상의 여백이 존재해야 인식률이 크게 올라갑니다.
교차 링크 및 추천 도구
클라이언트 사이드 QR코드 기술의 유용함과 안전성을 직접 경험해 보고 싶다면, 당사 사이트에서 제공하는 무료 QR 코드 생성 도구를 이용해 보시기 바랍니다. 서버로 데이터를 일절 전송하지 않는 100% 로컬 보안 기술로 설계되어 있습니다.
- 추천 도구: /ko/tools/qr-generator - 개인정보 노출 걱정 없는 안전한 무료 로컬 QR 코드 생성기
연관 블로그 가이드
- /ko/blog/wifi-qr-code-generator-guide - 스마트폰 카메라 스캔 한 번으로 와이파이 자동 연결하는 QR코드 만들기
- /ko/blog/qr-code-marketing-strategies - 온·오프라인을 잇는 매장 홍보용 QR 코드 마케팅 활용 비법



