QR Code - boostcamp-2020/Project15-C-Client-Based-Formula-Editor GitHub Wiki
QR ์ฝ๋(์์ด: QR code, Quick Response code)์ ํ๋ฐฑ ๊ฒฉ์๋ฌด๋ฌ ํจํด์ผ๋ก ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ๋งคํธ๋ฆญ์ค ํ์์ ์ด์ฐจ์ ์ฝ๋์ด๋ค. ๋น์ทํ ์ฉ๋๋ก ๋จผ์ ์ฌ์ฉ๋ ์ด ์ฐจ์ ์ฝ๋๋ก๋ ๋ฐ์ฝ๋๊ฐ ์๋ค. ๋ฐ์ฝ๋๋ ์ด๋ฆ ๊ทธ๋๋ก ๋จ์ํ ๋ง๋๊ธฐ ๋ชจ์์ ๋ฐ๋ฅผ ์ด์ฐจ์์ผ๋ก ๋์ดํ ๊ฒ์ด๋ค. QR์ฝ๋๋ ์ฃผ๋ก ํ๊ตญ, ์ผ๋ณธ, ์ค๊ตญ, ์๊ตญ, ๋ฏธ๊ตญ ๋ฑ์์ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ ๋ช ์นญ์ ๋ด์ ์จ์ด๋ธ์ ๋ฑ๋ก ์ํ 'Quick Response'์์ ์ ๋ํ์๋ค. ์ข ๋์ ๋ง์ด ์ฐ์ด๋ ๋ฐ์ฝ๋์ ์ฉ๋ ์ ํ์ ๊ทน๋ณตํ๊ณ ๊ทธ ํ์๊ณผ ๋ด์ฉ์ ํ์ฅํ 2์ฐจ์์ ํจํด์ผ๋ก ์ข ํก์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์ซ์ ์ธ์ ๋ฌธ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ค. ๋ณดํต ๋์งํธ์นด๋ฉ๋ผ๋ ์ ์ฉ ์ค์บ๋๋ก ์ฝ์ด ๋ค์ฌ ํ์ฉํ๋ค. ๊ตญ๋ฆฝ๊ตญ์ด์์์๋ QR ์ฝ๋๋ฅผ ์ ๋ณด๋ฌด๋ฌ๋ก ๋ค๋ฌ์๋ค.
QR์ฝ๋๋ 1994๋ ์ผ๋ณธ ๋์ํ ์๋์ฐจ ์ํ์ฌ์ธ ๋ด์ ์จ์ด๋ธ๊ฐ ๋์ํ ์๋์ฐจ ์ ์ฉ ๋ถํ์ ๊ตฌ๋ณํ๊ธฐ ์ํด ๊ฐ๋ฐํ๋ฉด์ ์์๋๋ค. ๊ธฐ์กด ๋ฐ์ฝ๋ ๋ฐฉ์์ด 1์ฐจ์์ ์ธ ๊ฐ๋ก ์ ๋ง์ผ๋ก๋ ๋ด์ ์ ์๋ ์ ๋ณด์ ์์ด ์ ํ๋๊ธฐ ๋๋ฌธ์, ์ผ์ ๋ฉด์ ์ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ 2์ฐจ์ ์ฝ๋๋ฅผ ๊ฐ๋ฐํ ๊ฒ์ด๋ค. ๊ธฐ์กด์ ๋ฐ์ฝ๋๊ฐ 20์ ๋ด์ธ์ ์ซ์ ์ ๋ณด๋ง ์ ์ฅํ ์ ์์ง๋ง, QR์ฝ๋๋ ์ซ์ ์ต๋ 7,089์, ๋ฌธ์ ์ต๋ 4,296์๋ฅผ ์ ์ฅํ ์ ์๋ค.
QR์ฝ๋๋ ์ ์ฌ๊ฐํ ์ ํ๋ฐฑ ๊ฒฉ์์ ์๋ก ๋ค์ํ ๋ฌด๋ฌ๊ฐ ์ ํ์ง ๊ฒ์ด๋ค. QR์ฝ๋๋ ํฌ๊ฒ 3๊ฐ์ง ํจํด์ผ๋ก ๊ตฌ์ฑ๋๋ค. ์์น ์ฐพ๊ธฐ ํจํด๊ณผ ์ผ๋ผ์ธ๋จผํธ ํจํด, ์ ํจํด ์ด๋ค. ์์น ์ฐพ๊ธฐ ํจํด์ ๋ชจ๋ QR์ฝ๋์ ์ธ ๋ชจ์๋ฆฌ์ ํฌ๊ฒ ์๋ฆฌ ์ก๊ณ ์๋ ์ฌ๊ฐํ์ด๋ค. ํด๋น ๊ธฐ๋ฅ์ QR์ฝ๋๋ฅผ ์ธ์๊ธฐ๊ฐ 360๋ ์ด๋ ๋ฐฉํฅ์์ ๊ฐ์งํ๋๋ผ๋ QR์ฝ๋์ ์์น๋ฅผ ์ ํํ๊ฒ ํ์ , ๋น ๋ฅธ ์ ๋ณด ํ์์ด ๊ฐ๋ฅํ๋๋ก ๋ง๋๋ ์ผ์ข ์ ๋์นจ๋ฐ ๊ธฐ๋ฅ์ ํ๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ์ธ์ ๋ฐ ๋ถ์ ์๋๊ฐ ๋นจ๋ผ์ ธ QR์ฝ๋๋ ์ด๋ฆ๋ โ๋น ๋ฅธ ์๋ตโ(Quick Response)์์ ๋์๋ค.
์ฌ๊ธฐ์ ์ผ๋ผ์ธ๋จผํธ ํจํด๊ณผ ์ ํจํด ๋ฑ์ด ๋ํด์ ธ QR์ฝ๋๋ฅผ ์ด๋ฃฌ๋ค. ์ผ๋ผ์ธ๋จผํธ ํจํด์ QR์ฝ๋์ ์ผ๋ฃฉ์ด ๋ฌป๊ฑฐ๋ ๋๋ ์ผ๊ทธ๋ฌ์ง๊ฑฐ๋ ํ์๋ ๊ฒฝ์ฐ์๋ ์ธ์ํ ์ ์๊ฒ ํ๋ ์ญํ ์ ํ๋ค. ์ ํจํด์ ํ๋ฐฑ ์ ๊ณผ ํฐ์ ์ฌ๋ฐฑ์ ํตํด ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณณ์ด๋ค. QR์ฝ๋์ ๋ด๊ธด ๋ฐ์ดํฐ ์ธ์์ ๋น์ ํก์์ ๋ฐ์ฌ๋ฅผ ๊ฐ์งํ๋ ์ ์ธ์ ์ผ์๋ฅผ ํตํด ์ด๋ค์ง๋ค. ์ ์ธ์ ์ผ์๋ ์ ์ธ์ ์ ๋ฐฉ์ถํ๋ ๋ฐ๊ด์์์ ์ด๋ฅผ ๊ฐ์งํ๋ ์๊ด์์๋ก ๋ถ๋ฆฌ๋ผ ์๋ค. QR์ฝ๋์ ๊ฒ์์์ ๋น์ ํก์ํ๊ณ , ํฐ์์ ๋น์ด ๋ฐ์ฌํ๋ค. ์ ์ธ์ ์ผ์๋ QR์ฝ๋์ ํจํด์ ์ธ์ํ๋ ๊ฒ์ด๋ค.
QR Code ๊ด๋ จ ์ฝ๋
QR Code ์์ฑ์ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฐ๋ฆฌ๊ฐ value๋ก Props๋ฅผ ๋๊ฒจ์ฃผ๊ฒ ๋๋ฉด
๋ด๋ถ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์คํํ์ฌ UTF-16 ์ฝ๋๋ก ๋ง๋ค์ด์ค๋ค.
function convertStr(str: string): string {
let out = '';
for (let i = 0; i < str.length; i++) {
let charcode = str.charCodeAt(i);
if (charcode < 0x0080) {
out += String.fromCharCode(charcode);
} else if (charcode < 0x0800) {
out += String.fromCharCode(0xc0 | (charcode >> 6));
out += String.fromCharCode(0x80 | (charcode & 0x3f));
} else if (charcode < 0xd800 || charcode >= 0xe000) {
out += String.fromCharCode(0xe0 | (charcode >> 12));
out += String.fromCharCode(0x80 | ((charcode >> 6) & 0x3f));
out += String.fromCharCode(0x80 | (charcode & 0x3f));
} else {
// This is a surrogate pair, so we'll reconsitute the pieces and work
// from that
i++;
charcode =
0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));
out += String.fromCharCode(0xf0 | (charcode >> 18));
out += String.fromCharCode(0x80 | ((charcode >> 12) & 0x3f));
out += String.fromCharCode(0x80 | ((charcode >> 6) & 0x3f));
out += String.fromCharCode(0x80 | (charcode & 0x3f));
}
}
return out;
}
๊ทธ ํ์ ๋ด๋ถ์ ์ผ๋ก ์ค์น๋ qr.js๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ QR์ฝ๋๋ฅผ ๋ง๋ค์ด์ canvas ํํ๋ก ๋ณด์ฌ์ค๋ค.
์ฐ๋ฆฌ๋ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ QR Code๋ฅผ ๋ง๋ค์๋ค. QR Code ์์ฑ์ imgur์ ์ฌ๋ฆฐ image์ id๋ฅผ ๋ฐ์์ '๋ฐฑ์๋์ฃผ์/id' ๋ฅผ Qr Code ์ปดํฌ๋ํธ์ value๋ก ๋๊ฒจ QR์ฝ๋๋ก ๋ง๋ค์๊ณ , QR์ฝ๋๋ฅผ ์ฐ์ ์ ์ฐ๋ฆฌ ๋ฐฑ์๋ ์ฃผ์๋ก ์ด๋ํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ณผ ์ ์๊ฒ ๋ง๋ค์๋ค. save๋ฅผ ํ ์์๋ canvas์ toDataUrl ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ QR Code ์ด๋ฏธ์ง ์์ฒด๋ฅผ ์ ์ฅํ ์ ์๊ฒ ํ์๋ค.
import QRcode from 'qrcode.react';
...
<QRcode value={imageUrl} />