ML/MLOps Engineer
[python] segno ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‚˜๋งŒ์˜ QR์ฝ”๋“œ ๋งŒ๋“ค๊ธฐ

Real Python์—์„œ ์žฌ๋ฏธ์žˆ๋Š” ํŠœํ† ๋ฆฌ์–ผ์„ ๋ฐœ๊ฒฌํ•˜์—ฌ ๋”ฐ๋ผ์„œ ๊ตฌํ˜„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค!
ํŠœํ† ๋ฆฌ์–ผ ๋ฐ”๋กœ๊ฐ€๊ธฐ

python์˜ segno ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•˜๋ฉด QR์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  QR code์˜ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋‚˜ gif ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žฌ๋ฐŒ์—ˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ํ‘๋ฐฑ QR ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์ด์ฆˆ์™€ ์—ฌ๋ฐฑ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ƒ‰์ƒ์„ ์ž…ํž ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

์ œ๊ฐ€ ํŠœํ† ๋ฆฌ์–ผ์„ ๋”ฐ๋ผํ•œ ํ™˜๊ฒฝ์€ python 3.10, window ์—์„œ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„  qr ์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•œ segno ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

python -m pip install segno

์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ segno ํŒจํ‚ค์ง€๋กœ QR ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

import segno

qrcode = segno.make_qr("https://naver.com/") # QR ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ํ…์ŠคํŠธ
# QR ์ฝ”๋“œ ์ €์žฅ
qrcode.save(
    "wide_border_qrcode.png", # ์ €์žฅ ํŒŒ์ผ๋ช…
    scale=5, # QR ์ฝ”๋“œ ์‚ฌ์ด์ฆˆ
    border=10, # ๋ฐฐ๊ฒฝ ์—ฌ๋ฐฑ ํฌ๊ธฐ
    light=(173, 216, 230), # ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ RGB
    dark=(173, 216, 230), # QR ์ฝ”๋“œ ์ƒ‰์ƒ RGB
)

์ด์™ธ์˜ ์ถ”๊ฐ€์ ์ธ ์˜ต์…˜์€ Segno ๊ณต์‹ ์‚ฌ์ดํŠธ ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”

๋‹ค์Œ์œผ๋กœ๋Š” ์ด๋ฏธ์ง€, gif๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” qrcode-artistic ๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

python -m pip install qrcode-artistic

qr ์ฝ”๋“œ์—์„œ ๋ฐฐ๊ฒฝ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—์„œ๋Š” ์ธํ„ฐ๋„ท ์ƒ์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐ๊ฒฝ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด urlopen๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
background์— ์ง์ ‘ ๋กœ์ปฌ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

import segno
from urllib.request import urlopen

slts_qrcode = segno.make_qr("https://www.youtube.com/watch?v=hTWKbfoikeg")
# ์ง์ ‘ ๋กœ์ปฌ์— ์žˆ๋Š” ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด 
# nirvana_url = './test.gif' ์™€ ๊ฐ™์ด ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
nirvana_url = urlopen("https://media.giphy.com/media/LpwBqCorPvZC0/giphy.gif")
slts_qrcode.to_artistic(
    background=nirvana_url, # ํŒŒ์ผ ๊ฒฝ๋กœ ๋˜๋Š” ์š”์ฒญํ•œ ์ด๋ฏธ์ง€
    target="animated_qrcode.gif", # ์ €์žฅ ํŒŒ์ผ๋ช…
    scale=5, # ํฌ๊ธฐ
)

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ QR ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์œ„์˜ ํŠœํ† ๋ฆฌ์–ผ์„ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ฐœ์„ฑ์ด ๋‹ด๊ธด QR ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์žฌ๋ฐŒ์—ˆ์Šต๋‹ˆ๋‹ค!
fastapi์™€ create-react-app ์„ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•œ QR ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ๊ฐœ๋ฐœํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

QR ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ ์ด์šฉํ•˜๊ธฐ  [ aws free tier๊ฐ€ ์ข…๋ฃŒ๋˜์–ด ์‚ฌ์ดํŠธ๋Š” ๋‚ด๋ ค๊ฐ„ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.]

QR ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ฃผ์†Œ์™€ ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋˜๋Š” ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ 
QR ์ฝ”๋“œ ์ƒ์„ฑ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.


์ด๋ฏธ์ง€ ํŒŒ์ผ/gif ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ๋Œ€๊ธฐ์‹œ๊ฐ„์ด 4~5์ดˆ ๊ฐ€๋Ÿ‰ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค


์ €์˜ ๋ธ”๋กœ๊ทธ ์ฃผ์†Œ QR์ฝ”๋“œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” QR์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” segno ํŒจํ‚ค์ง€๋ฅผ ์†Œ๊ฐœํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.


reference: https://realpython.com/python-generate-qr-code