13. ์๋ฒฝํ ์ปค๋ฎค๋ํฐ๋ฅผ ์ํ ๊ด๋ฆฌ์์ ๊ณ ๊ตฐ๋ถํฌ: OpenCV ์ธ๋ค์ผ๊ณผ ์๋ฌ ๋์ฒ๋ฒ
๋ค์ด๊ฐ๋ฉฐ: ์ฌ์ดํธ์ '์์ฅ๋ง'์ ์น๊ณ ๋ณธ๊ฒฉ์ ์ธ ๊ณต์ฌ์ ๋ค์ด๊ฐ๋ค
์น์ฌ์ดํธ์ ๊ธฐ๋ฅ์ด ํ๋๋ ๋ถ์ด๊ฐ๊ณ ์ ์ (์์ง์ ์ง์ธ๋ค์ด์ง๋ง)์ ํ๋์ด ์์๋๋ฉด์, ๊ฐ๋ฐ์์ธ ์ ์ ์ญํ ์ ๋จ์ํ '์ฝ๋'๋ฅผ ๋์ด '์ด์ ๊ด๋ฆฌ์(Admin)'๋ก ์งํํด์ผ ํ์ต๋๋ค. ์๋ฒ ๋ก์ง์ ๋๋์ ์ผ๋ก ๋ฏ์ด๊ณ ์ณ์ผ ํ ์ผ๋ค์ด ์์ฌ๊ฐ์ฃ .
์์ ํ ์ ๋ฐ์ดํธ๋ฅผ ์ํด ์ ๋ ๊ฐ์ฅ ๋จผ์ ์ฌ์ดํธ ๋๋ฌธ์ ์์๋ก ๊ฐ๋ฆฌ๋ **'์์ฅ๋ง(๋ธ๋ผ์ธ๋) ์ฝ๋'**๋ถํฐ ์ธํ ํ์ต๋๋ค. ์ ์ ๋ค์ด ์ ์ํ์ ๋ ์๋ฌ ํ๋ฉด์ ๋ณด๊ณ ๋๋ผ์ง ์๋๋ก, ์ต์๋จ ๋ผ์ฐํฐ(Router)์ ์์ HTML์ ๋์ "ํ์ฌ ๋ ๋ฉ์ง ๊ธฐ๋ฅ์ ์ํด ์ฌ์ดํธ ์ ๊ฒ ์ค์ ๋๋ค"๋ผ๋ ์๋ด ํ์ด์ง๋ฅผ ๋ฎ์ด์์ด ๊ฒ์ ๋๋ค. ์ธ๋ถ์ ์ ๊ทผ์ ์ฐจ๋จํ๊ณ ๋๋ ๋ฌํ ์๋๊ฐ๊ณผ ํจ๊ป, ๋๋์ด ๋ฒผ๋ฅด๊ณ ๋ฒผ๋ฅด๋ 3๊ฐ์ง ํต์ฌ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ค์ ํด๊ฒฐํ ์ฌ์ ๊ฐ ์๊ฒผ์ต๋๋ค.
1. ์ธ๋ค์ผ์ด ๋น์ด์๋ค? ํ์ด์ฌ OpenCV๋ก ๋์์ ์ธ๋ค์ผ ์๋ ์ถ์ถํ๊ธฐ
์ฒซ ๋ฒ์งธ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ ์ ๊ฐ ์ฌํ์ ๊ธฐ์ธ์ฌ ๋ง๋ '์น์งํ ์ธ๋ค์ผ ๊ฒ์ํ'์์ ๋ฐ์ํ์ต๋๋ค. ์ธ์คํ๊ทธ๋จ ์คํ์ผ์ ์ปค๋ฎค๋ํฐ๋ค ๋ณด๋ ์ ์ ๋ค์ด ์ฌ์ง(JPG, PNG)๋ฟ๋ง ์๋๋ผ ์งง์ ๋์์(MP4) ํ์ผ๋ ์์ฃผ ์ ๋ก๋ํ๊ธฐ ์์ํ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ ๊ฒ์ํ์ ์ด๋ฏธ์ง ํ์ผ๋ง ์ธ๋ค์ผ๋ก ๋ณด์ฌ์ฃผ๋๋ก ์ฝ๋ฉ๋์ด ์์์ต๋๋ค. ๋๊ตฐ๊ฐ ๋์์์ ์ฌ๋ฆฌ๋ฉด, ๊ฒ์ํ ๋ชฉ๋ก์์ ํด๋น ๊ธ์ ์ธ๋ค์ผ ์๋ฆฌ๊ฐ ๋ปฅ ๋ซ๋ ค๋ฒ๋ฆฌ๊ฑฐ๋ ๋ ์ด์์์ด ์์ฅ์ฐฝ ๊นจ์ง๋ ์ฐธ์ฌ๊ฐ ๋ฒ์ด์ก์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ด์ฌ ์ต๊ณ ์ ์ปดํจํฐ ๋น์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ OpenCV๋ฅผ ๋์ ํ์ต๋๋ค.
์๋ฆฌ๋ ๊ฐ๋จํ์ง๋ง ๊ฐ๋ ฅํฉ๋๋ค. ์ ์ ๊ฐ ๋์์ ํ์ผ์ ์ ๋ก๋ํ๋ฉด, ๋ฐฑ์๋ ์๋ฒ์์ ํ์ผ์ด ์ ์ฅ๋จ๊ณผ ๋์์ <code>cv2.VideoCapture()</code> ํจ์๊ฐ ๋ชฐ๋ ์คํ๋ฉ๋๋ค. ์ด ํจ์๊ฐ ์ ๋ก๋๋ ๋์์์ '์ฒซ ๋ฒ์งธ ํ๋ ์(0์ด ๋ถ๋ถ)'์ ์ฐฐ์นต ํ๊ณ ์บก์ฒํ ๋ค, ์ด๋ฏธ์ง๋ฅผ ์ถ์ถํ์ฌ ์ธ๋ค์ผ์ฉ JPG ํ์ผ๋ก ๋ฐ๋ก ์ ์ฅํด ์ฃผ๋ ๋ก์ง์ ๊ตฌํํ์ต๋๋ค.
์ด์ ์ ์ ๊ฐ ๋์์์ ์ฌ๋ฆฌ๋ ์ฌ์ง์ ์ฌ๋ฆฌ๋ , ์ธ๋ค์ผ ๊ฒ์ํ์๋ ๋ฌด์กฐ๊ฑด ์์๊ณ ๊ฝ ์ฐฌ ์ด๋ฏธ์ง๊ฐ ๋ ธ์ถ๋ฉ๋๋ค. ๋ฐฑ์๋์์ ์์์ ์ด๋ฏธ์ง๋ก ๋ณํํด ์ฃผ๋ ์ด ๋ง๋ฒ ๊ฐ์ ์๋ํ ๋ก์ง์ ์์ฑํ๊ณ ๋๋ ์ ๋ฒ ์ค๋ฌด ๊ฐ๋ฐ์์ ๊ฐ๊น์์ง ๊ฒ ๊ฐ์ ์ด๊นจ๊ฐ ์ผ์ฑํด์ก์ต๋๋ค.
2. ๋ณด๊ธฐ ํํ ์์ค๋ฐ์ค์ 'None' ํ ์คํธ ์ค๋ฅ ์์ธ ๋ฐ ํด๊ฒฐ๋ฒ
๋ ๋ฒ์งธ ๋ฌธ์ ๋ ์์ฃผ ๊ธฐ์ด์ ์ด์ง๋ง ์น์ฌ์ดํธ์ ํ๋ฆฌํฐ๋ฅผ ํ ๋จ์ด๋จ๋ฆฌ๋ ์น๋ช ์ ์ธ ๋ฒ๊ทธ์์ต๋๋ค. ๊ฒ์ํ์ ๋ด๋ฆฌ๋ค ๋ณด๋ฉด ๊ฐํน ์ธ๋ค์ผ ์๋ฆฌ์ ์ฐข์ด์ง ์ด๋ฏธ์ง ์์ด์ฝ(์์ค๋ฐ์ค)์ด ๋จ๊ณ , ๊ทธ ๋ฐ์ **'None'**์ด๋ผ๋ ์ ์ ์๋ ํ ์คํธ๊ฐ ๋กํ๋ ์ถ๋ ฅ๋์ด ์๋ ๊ธ๋ค์ด ๋ณด์์ต๋๋ค.
์ฒ์์ "๋๊ฐ ์ด์ํ ํ์ผ์ ์ฌ๋ ธ๋?" ์ถ์๋๋ฐ, ์๊ณ ๋ณด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB)์ Jinja2 ํ ํ๋ฆฟ ์์ง ์ฌ์ด์ ์ํต ์ค๋ฅ์์ต๋๋ค. ์ ์ ๊ฐ ๊ธ์ ์ธ ๋ ์ค์๋ก ๋ฏธ๋์ด ํ์ผ์ ์ฒจ๋ถํ์ง ์๊ณ ํ ์คํธ๋ง ๋๋ ์ฌ๋ฆฐ ๊ฒฝ์ฐ, DB์ <code>image_url</code> ์ปฌ๋ผ์๋ ๊ฐ์ด ์๋ค๋ ๋ป์ธ <code>Null</code> (ํ์ด์ฌ์์๋ <code>None</code>)์ด ์ ์ฅ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ HTML ํ๋ฉด์ ๊ทธ๋ ค์ฃผ๋ Jinja2๋ ์ด๋ฅผ ๋์น์ฑ์ง ๋ชปํ๊ณ <code></code> ํ๊ทธ์ ๋ฌธ์ ๊ทธ๋๋ก "None"์ด๋ผ๋ ๊ธ์๋ฅผ ์ค์
๋ฃ์ด๋ฒ๋ฆฐ ๊ฒ์
๋๋ค. ๋น์ฐํ 'None'์ด๋ผ๋ ์ด๋ฆ์ ์ด๋ฏธ์ง ํ์ผ์ ์์ผ๋ ๋ธ๋ผ์ฐ์ ๋ ์์ค๋ฐ์ค๋ฅผ ๋์๋ฒ๋ฆฐ ๊ฒ์ด์ฃ .
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Jinja2 HTML ํ์ผ์ **์กฐ๊ฑด๋ฌธ(If statement)**์ ์ถ๊ฐํ์ต๋๋ค.
<code>{% if post.image_url %}</code> ๋ก ์์ํ์ฌ ์ด๋ฏธ์ง ์ฃผ์๊ฐ ์์ ๋๋ง <code></code> ํ๊ทธ๋ฅผ ์ถ๋ ฅํ๊ฒ ํ๊ณ , <code>{% else %}</code> ๊ตฌ๋ฌธ์ ๋ํด ์ฒจ๋ถ ํ์ผ์ด ์๋ ๊ธ์๋ ์ฌ์ดํธ ๋ก๊ณ ๊ฐ ๋ฐํ **'๊ธฐ๋ณธ ์ด๋ฏธ์ง(Default Image)'**๊ฐ ์ถ๋ ฅ๋๋๋ก ์์ ํ์ต๋๋ค. ์์ฃผ ๊ฐ๋จํ ์์ธ ์ฒ๋ฆฌ ํ๋๊ฐ ์น์ฌ์ดํธ์ ๊น๋ํจ์ 200% ๋์ด์ฌ๋ ค ์ฃผ์์ต๋๋ค.
3. ๊ด๋ฆฌ์(Admin)์ ์ ๋ ๊ถํ: ์๋ชป๋ ๊ฒ์๋ฌผ ๊ฐ์ ์ด๋ ์์คํ

<๊ด๋ฆฌ์์ ํ์ ๋๋ ์ ์๋ ๊ฒ์ํ ์ด๋>
๋ง์ง๋ง ํ์ด๋ผ์ดํธ๋ '์ฌ์ดํธ ์ด์'์ ์์ด ์ ๋์ ์ผ๋ก ํ์ํ ์ ์ด ๊ธฐ๋ฅ์ด์์ต๋๋ค. ์ผ๋ง ์ , ๋จ์ ์์ด๋ ํฌ ๊ฒ์ํ์ ๋ชจ๋ํฐ๋งํ๋ค๊ฐ ํ ์นซ ๋๋์ต๋๋ค. ๋๊ตฐ๊ฐ ์ค์์ธ์ง ๊ณ ์์ธ์ง, ๋จ์ ์์ด๋ ๊ฒ์ํ ํ๊ฐ์ด๋ฐ์ ์ฌ์ ์์ด๋ ์ฌ์ง์ ๋กํ๋ ์ฌ๋ ค๋ ๊ฒ์ ๋๋ค.
์์ ๊ฐ์์ผ๋ฉด ์๋ฒ DB(๋ฐ์ดํฐ๋ฒ ์ด์ค)์ ์ง์ ์ ์ํด์ SQL ๋ช ๋ น์ด๋ฅผ ์ณ์ ๊ธ์ ์ญ์ ํ๊ฑฐ๋ ์์ ํด์ผ ํ์ ํ ๋ฐ, ๋งค๋ฒ ๊ทธ๋ ๊ฒ ๊ด๋ฆฌํ๋ ๊ฑด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋์ ํ๋ก ํธ์๋ ํ๋ฉด์์ ์ง๊ด์ ์ผ๋ก ๊ธ์ ์ฎ๊ธธ ์ ์๋ **'๊ด๋ฆฌ์ ์ ์ฉ ๊ฒ์๊ธ ๊ฐ์ ์ด๋ ๊ธฐ๋ฅ'**์ ๊ฐ๋ฐํ๊ธฐ๋ก ๋ง์๋จน์์ต๋๋ค.
๋จผ์ ๋ฐฑ์๋์ ๊ถํ ๊ฒ์ฌ ๋ก์ง์ ๋ง๋ค์์ต๋๋ค. ํ์ฌ ๋ก๊ทธ์ธํ ์ ์ ์ ์ ๋ณด๊ฐ <code>is_admin = True</code> (๊ด๋ฆฌ์)์ผ ๊ฒฝ์ฐ์๋ง ๊ฒ์๊ธ ์์ธ ํ์ด์ง์ ๋นจ๊ฐ์์ [๊ฒ์ํ ์ด๋] ๋ฒํผ๊ณผ ๋๋กญ๋ค์ด(Dropdown) ๋ฉ๋ด๊ฐ ๋ณด์ด๋๋ก ์ค์ ํ์ต๋๋ค.
๊ด๋ฆฌ์ ๊ณ์ ์ผ๋ก ์ ์ํด ์ด ๋ฒํผ์ ๋๋ฅด๊ณ '์ฌ์ ์์ด๋ ๊ฒ์ํ'์ ์ ํํ๋ฉด, ์๋ฒ์ SQLAlchemy๊ฐ ์ฆ์ ์๋ํ์ฌ ํด๋น ๊ฒ์๊ธ ๋ฐ์ดํฐ์ <code>board_id</code>๋ฅผ ๋์ ๊ฒ์ํ์ ID๋ก ์ฑ์น ๋ฎ์ด์์ ์ค๋๋ค. ๊ฒ์๊ธ์ ๊ณ ์ ๋ฒํธ๋ ์ ์ ์ ๋๊ธ, ์ถ์ฒ์๋ ๊ทธ๋๋ก ์ ์งํ ์ฑ ์์๋ง ์๋ฒฝํ๊ฒ ์ด์ฌ์ํจ ๊ฒ์ด์ฃ .
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์๋ฐ๋ฅ ์์ ์ฌ๋ ค๋๊ณ ๋ง์๋๋ก ์ฃผ๋ฌด๋ฅด๋ ์ด ๋ง๊ฐํ ์ ์ด ๊ธฐ๋ฅ์ ์์ฑํ๊ณ ๋๋, ๋๋์ด ์ ์น์ฌ์ดํธ์ ์ง์ ํ ์ฃผ์ธ์ด ๋ ๊ฒ ๊ฐ์ ํต์พํจ์ด ๋ฐ๋ ค์์ต๋๋ค.
๋ง์น๋ฉฐ: ์์ฅ๋ง์ ๊ฑฐ๋๊ณ ์๋ก์ด ์์์ ๋ง์ดํ๋ค
OpenCV๋ฅผ ํ์ฉํ ์ธ๋ค์ผ ์ถ์ถ, ์์ธ ์ฒ๋ฆฌ๋ฅผ ํตํ ์์ค๋ฐ์ค ์ค๋ฅ ํด๊ฒฐ, ๊ทธ๋ฆฌ๊ณ ๊ด๋ฆฌ์์ ๊ฐ๋ ฅํ ๊ฒ์๊ธ ๊ฐ์ ์ด๋ ๊ธฐ๋ฅ๊น์ง. ์ด ๋ชจ๋ ๋๋์ ์ธ ์๋ฒ ๊ณต์ฌ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ง์น๊ณ , ์ ๋ ์ต์๋จ์ ๊ฑธ์ด๋์๋ '์์ฅ๋ง ์ฝ๋'๋ฅผ ์กฐ์ฉํ ์ญ์ ํ์ต๋๋ค.
๋ค์ ์ ์์ ์ผ๋ก ์ด๋ฆฐ ์น์ฌ์ดํธ๋ ์ด์ ๋ณด๋ค ํจ์ฌ ๋ ๋จ๋จํ๊ณ , ์๋ฆ๋ต๊ณ , ์์ ํด์ ธ ์์์ต๋๋ค. ๊ฐ๋ฐ์ ๋จ์ํ ์ฝ๋๋ฅผ ์ง๋ ๊ฒ์ ๋์ด, ์ ์ ๊ฐ ๊ฒช์ ์ ์๋ ์๋ง์ ์์ธ ์ํฉ์ ํต์ ํ๊ณ ์ฌ์ดํธ์ ์ง์๋ฅผ ์ ์งํ๋ **'ํ๋์ ์ธ๊ณ๋ฅผ ๋ค์ค๋ฆฌ๋ ์ผ'**์์ ๋ฐฐ์ด ์์คํ ๊ฒฝํ์ด์์ต๋๋ค.
๋ค์ ํฌ์คํ ์์๋ ์ด ๊ฑฐ๋ํ ์ธ๊ณ๋ฅผ ๋ ์์ ํ๊ฒ ์งํค๊ธฐ ์ํ ํ์ ๋ณด์ ์กฐ์น๋, ์ ์ ๋ค์ ํธ์์ฑ์ ๊ทน๋ํํด ์ค ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ๋ํด ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค. ๋์์์ด ์งํํ๋ ์ ์ ๊ฐ๋ฐ๊ธฐ๋ฅผ ๊ณ์ ์์ํด ์ฃผ์ธ์!
์ง๋ํธ ๋ณด๋ฌ๊ฐ๊ธฐ: 12. ๋ชจ๋ฐ์ผ ์ ์ ๋ฅผ ์ก์๋ผ! ๋ฐ์ํ ์น ๋์์ธ๊ณผ Jinja2 ๋ํ ์ผ์ ์์ฑ
๋ค์ํธ ๋ณด๋ฌ๊ฐ๊ธฐ: 14. ์ํต ์๋ ์ปค๋ฎค๋ํฐ๋ ์๊ผฌ ์๋ ์ฐ๋นต: ๋๊ธ ์์คํ ๊ตฌ์ถ๊ณผ ์คํธ ํ ๋ฌ ๋ฐฉ์ด์
๐ฌ ๋๊ธ 0๊ฐ