Gallery
Search
ํ์ฌ๊น์ง ๋ฏธ๋ ํ๋ก์ ํธ์์ DB์ insert, read ๊ธฐ๋ฅ๋ง ๊ตฌํํ์ง๋ง ์ด๋ฒ์ update๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค.
์ ๊ท ๋ฒ์ ์ ์
๋ฐ์ดํธ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
โข
NEWย RELEASE
โฆ
2023.08.08 - v1.1 ์๋ฃ ์ํ ์
๋ฐ์ดํธ ๊ธฐ๋ฅ ์ถ๊ฐ ๋ฐ AWS EB ๋ฐฐํฌ
โช
์ ์ฅ๋ ๋ฒํท๋ฆฌ์คํธ์ '์๋ฃ' or '๋ฏธ์๋ฃ' ์ํ๋ฅผ ๊ตฌ๋ถ ํ ์ ์๋ DB๋ด done์ปฌ๋ผ ์ถ๊ฐ
โช
์์ผ๋ก DB๋ด ์ ๊ท ์์ฑ๋๋ ๋ฒํท ๋ฆฌ์คํธ๊ธ์ ๊ธ ๋ฒํธ, done ์ํ ์ปฌ๋ผ์ด ์ถ๊ฐ๋์ด ์
๋ ฅ ๋จ
โช
์ํ ๊ธฐ๋ฅ ์ถ๊ฐ์ ๋ฐ๋ฅธ ๋ทฐ ํ์ด์ง ๋ฒํท๋ฆฌ์คํธ ๋ชฉ๋ก์ ์ํ ๋ณ๊ฒฝ ๋ฒํผ ์ถ๊ฐ
โช
๋ฒํผ์ ํตํด '์๋ฃ' ์ํ๋ก ์ ํ ๋๋ ์๋ชป ๋๋ฅธ ๊ฒฝ์ฐ๋ฅผ ์ํ '๋ณต๊ตฌ' ๊ธฐ๋ฅ ์ถ๊ฐ
โช
๊ธฐ๋ณธ์ ์ธ ์ ํจ์ฑ ์ฒดํฌ(์ํ ๋ณ๊ฒฝ ๋ฒํผ์ ๋ํ ํ์ธ or ์ทจ์) ์๋ฆผ์ฐฝ ํ์
์ถ๊ฐ
โช
AWSย EB๋ฅผย ํตํย ๋ฐฐํฌย ์ถ๊ฐ

๋ถ๋ถ ์ฝ๋๋ ์๋ ๋
ธํธ์ ๊ธฐ๋กํ์ง๋ง ์ ์ฒด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
app.py
๋๋ณด๊ธฐ
index.html
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 09 (v1.1 ์
๋ฐ์ดํธ ๊ธฐ๋ฅ ์ถ๊ฐ ๋ฐ ๋ฐฐํฌ)
5์ฃผ ์ฐจ์์๋ 4์ฃผ ์ฐจ์ ๋น์ทํ Flask Framework ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค.
bucket์ ๊ฒฝ์ฐ ๊ธฐ๋กํ๊ธฐ, ๋ชฉ๋ก ๋ณด๊ธฐ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ์ฌ์ค์ mars ํ๋ก์ ํธ์ ๋น์ทํ ํ๋ก์ ํธ๋ฅผ ๋น ๋ฅด๊ฒ ๋ณต์ตํ๋ ๋๋์ด์๋ค. fan ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋์ผํ ๊ธฐ๋ฅ์ผ๋ก ์์งํ ์ฃผ์ ๋ง ์กฐ๊ธ ๋ณ๊ฒฝ๋๊ณ bucket๊ณผ ๋์ผํ๊ฒ ์งํ๋๋ ๊ฐ์๋ฅผ ๋ณด๊ณ ๋๋ ์ถ๊ฐ์ ์ผ๋ก DB ์ฐ๊ฒฐ๊ณผ create, read ๊ธฐ๋ฅ ์ธ์๋ ํ์ฌ๊น์ง ๋ฐฐ์ด ๋ค๋ฅธ ๊ธฐ๋ฅ๋ ๋ณต์ต ์ผ์ ๋ฃ์ด๋ณด๊ณ ์ถ์๋ค. ํนํ ์น ํฌ๋กค๋ง์์ ๋ด๊ฐ ์ํ๋ ํค์๋๋ก ํ์ฑ ๋ฐ์ HTML ์์ค ๋ด์ ํค์๋์ ๋ถ๋ชจ ํ๊ทธ๋ค์ ์ฐพ์๊ฐ๋ ๊ฒ์ ๊ตฌํํ์ง๋ง
keyword.parent.parent.parent์ ๊ฐ์ด ์กฐ๊ธ ์ง์ ๋ถํ ์ฝ๋๋ก ์ฐพ์๊ฐ๋ ๊ฒ ๋ง๋ ์์ง๋ ์์ฌ์ค๋ฝ๊ธด ํ๋ค. ๊ฒ์์ผ๋ก๋ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์ง ๋ชปํ๊ณ ์์ด ์คํ์ค๋ฒํ๋ก์ฐ๋ ํ๊ตญ ์ปค๋ฎค๋ํฐ์ ์ง๋ฌธ์ ์ฌ๋ ค๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
๊ณผ์ ์์ ์๋ด๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ์ธ์๋ ์ ํ๋ก์ ํธ๋ค์์ ๋ถ๋ถ์ ์ผ๋ก ๊ตฌํํ ๊ธฐ๋ฅ์ด์๋ ์น ํฌ๋กค๋ง์ Spotify ์ฐจํธ ์น ์ฌ์ดํธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๊ตฌํํ๋ค. ๋ํ Date ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ํ์ฌ ๋ ์ง๋ฅผ ์ป์ด ํ๊ธฐํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค.ย 4๊ฐ ๋ฏธ๋ ํ๋ก์ ํธ๋ ์ ์ฒด์ ์ผ๋ก HTML์ CSS, JS๋ฅผ ๊ธฐ๋กํ๋๋ก ์๋ด๋์์ง๋ง, Java์ Spring framework์ ์ต์ํด์ ๊ทธ๋ฐ์ง Flask๋ ์๋ฌด๋ฆฌ ๋ฏธ๋ ํ๋ก์ ํธ๋ผ๋ CSS, JS๋ ๋ชจ๋ํ ์์ผ์ค์ผ๊ฒ ๋ค๋ ์๊ฐ์ ์ฐพ์๋ณด๊ณ static์ด๋ ํด๋๋ก ๊ตฌ๋ถํ๋ ๊ฒ๋ ๋ชจ๋ ์ ์ฉํ๊ฒ ๋์๋ค.
5์ฃผ์ฐจ์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ "๋ฐฐํฌ"์๋ค. ์ด์ ๊ตญ๋น๊ต์ก์ ํตํด์๋ Spring ํ๋ก์ ํธ๋ฅผ ์๋ฃํ์์ด๋ ๋ง์ง๋ง์ ํ๋ก์ ํธ ํจํค์ง์ผ๋ก jar ํ์ผ๋ก ์์ถํ๋ ๊ฒ ์ธ์ ์ค์ง์ ์ผ๋ก ์น์์ ๋ฐฐํฌํ๋ ๊ณผ์ ์ ๋ฐฐ์ฐ์ง ๋ชปํด์ ์์ฌ์ ์๊ณ , ์ด๋ฒ ์น๊ฐ๋ฐ ์ข
ํฉ๋ฐ์ ํตํด์ ๋ง์ง๋ง์ ํด๋น ๋ถ๋ถ์ด ์์ด ์์ฃผ ํฐ ๊ฐ์ด๋๊ฐ ๋์๋ค. ํ์ง๋ง AWS์ Elastic Beanstalk๋ก ๋ฐฐํฌํ๋ ๊ฒ์ ์๊ฐ๋ณด๋ค ๋๋ฌด ๊ฐ๋จํ๊ฒ ์ข
๋ฃ๋์๋ค. ๋ฌด์ธ๊ฐ ๋ด๊ฐ ์๊ฐํ๋ ์๋ฒ์ ํ๋์ค๋ฌ์ด ์ง์์ด ๋ค์ด์๋ค๊ธฐ๋ณด๋ค๋ AWS์ ์๋ํ ์์คํ
์ ๊ทธ์ ํด๋ ๊ตฌ์กฐ๋ฅผ ๋ง์ถ๊ณ ํ๋ก์ ํธ ๋ฉ์ด๋ฆฌ๋ฅผ ๋จ์ํ ๋งก๊ฒจ๋ฒ๋ฆฐ ๋๋์ด์๋ค.
๋ฌด์ธ๊ฐ ๋ถ์กฑํ๋ค. ๋๋ ์๋ง์กด์ด ํด์ฃผ๋ ์๋น์ค๊ฐ ๋์๊ฐ๋ ๋ฐฉ์ ์์ฒด๊ฐ ๊ถ๊ธํด์ก๋ค. ๊ทธ๋์ ๋ด๊ฐ ๊ฒฐ์ ํ ๊ฒ์ ๋ด๊ฐ ์์ฅํ๊ณ ์๋ Synology์ฌ์ NAS ์๋ฒ ์ฅ๋น๋ฅผ ํตํด์ AWS์ ์น ํธ์คํ
, ์ง์ ๋๋ฉ์ธ์ผ๋ก ํฌํธ ํฌ์๋ฉ ํด์ฃผ๊ณ , ํ๋ก์ ํธ ํจํค์ง๋ ์ด๋ค ํด๋ ๊ตฌ์กฐ๋กํ๊ณ . ์ด๋์ ์ ์ฅ๋๊ณ . ์ด๋ฌํ ์๋์ผ๋ก ํด์ฃผ๋ ๋ถ๋ถ๋ค์ ๋ฏ์ด๋ณด๊ธฐ ์์ํ๊ณ ๋ด๊ฐ ์น ํธ์คํ
์ ๋ด ์๋ฒ๋ก ์ง์ ํด๋ณด์ ํ๊ณ NAS์ ์ดํด๋ถํฐ ํฌํธ, DDNS, DNS, HTTP, ํ๋กํ ์ฝ ๋ฑ ์น ๊ด๋ จ ๊ธฐ๋ณธ ์ง์๋ค์ ๊ณผ์ ์ ๋ง์ถ์ด ์ถ๊ฐ์ ์ผ๋ก ์ง์์ ์ฃผ์ฌ์ฃผ์ฌ ์ฃผ์๊ฐ๋ค.
๊ณต๋ถํ๋ฉด์ ์ฌ๋งํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ค์ค๋กํด๊ฒฐํ๊ณ , ๊ฐ์ ์ค์๋ฅผ ๋ฐ๋ณตํ์ง ์์ผ๋ ค ํ๊ณ ์ถ์ด ํ๋๋ฐ ๊ธฐ์ด java, python, html, css ๋ฑ ๋น๊ต์ ์ค๋ฅ๊ฐ ์ด๋์ ๋ํ๋ ์ง, ์คํ๊ฐ ์ด๋์ ์์ฃผ ๋ฐ์ํ๋์ง ์ด์ ์ต์ํด์ง๊ณ ์๋ ์์ ์ธ๋ฐ ์๋ฒ, ํธ์คํ
์ด์ชฝ์ ๊ฑฐ์ ๋~์ถฉ ๊ทธ๋ฐ๊ฐ ๋ณด๋ค ํ๊ณ ย ์ฌ์ ์ง์์ดย ๋ถ์กฑํ์ด์ ์๋นํ ๋ง์ ์ค๋ฅ, ์ด๋ ค์์ ๊ฒฝํํ๋ค. ์๋์ฐ์ cmd, ๋งฅ์ unix๊น์ง๋ ์ต์ํด์ก๋๋ฐ NAS๋ ๊ธฐ๋ณธ Linux๋ก ๋ช
๋ น์ด๋ถํฐ ์ต์ํ์ง ์์๋ค. ๋ํ ๋ด๊ฐ ๋ง์ง๋ง์ ๋ง๋ fan ํ๋ก์ ํธ๋ฅผ AWS EB ๋ฐฐํฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก NAS์์ ๋ฐฐํฌํ๋ ๊ฒ์ ๊ตฌํํ๊ณ ์ถ์๋๋ฐ ๊ณ์ ์ด๊ฒ์ ๊ฒ ๋ชจ๋ฅด๋ ๊ฒ์ ๋ํด์ ์ดํดํ๋ ค๊ณ ์ฐพ์๋ณด๊ณ ์์ ๋ณด๊ณ ํ๋ฉด์ ์ ์ ํ์ฌ ๋ ๋ฒจ์์ ์ดํดํ์ง ๋ชปํ ์์ค๊น์ง ๋ฅํ๊ฒ ๋ด์ฉ์ด ๋ํ๋๊ธฐ ์์ํ๊ณ ๋ฐฐํฌ๋ผ๋ ๋ชฉ์ ์ ์์ด๊ฐ๊ธฐ๋ ํ๋ค.
์ด๋ฐ ์ฐ์ฌ๊ณก์ ๋์ ์ ํํ๊ฒ ๋ฐฐํฌ๋ผ๋ ๋ชฉ์ ์ ์ํด์ ์ฐ์ ๋ก์ปฌ PC์์ ๋๋ ๊ฒ์ NAS PC์์๋ ๋๋ค๋ผ๋ ์ ์ ๋ฅผ ๊ฐํ๊ฒ ๋๊ณ . ์ฐ์ ์ ์ผ๋ก ๋ก์ปฌ PC์์๋ docker-compose๋ฅผ ํตํด ๋ก์ปฌ PC์ ํฌํธ์์ ์นํ์ด์ง๊ฐ ๋ํ๋๊ฒ ๊ตฌํ, ์ด๋ ๊ณง NAS์๋ ๋์ผํ๊ฒ docker, docker-compose๋ฅผ ์ค์นํ๊ณ ๋์ผํ๊ฒ NAS PC์์๋ ํน์ ํฌํธ๋ก ์นํ์ด์ง๊ฐ ๋ํ๋๊ฒ ๊ตฌํํ์ผ๋ฉฐ, ์ด ์์ ๊ณผ์ ๊น์ง ์ค๋ฉด์ NAS๋ฅผ ํตํด ๋๋ฉ์ธ~ DDNS๋ก ์ธ๋ถ์ ์~ ํฌํธํฌ์๋ฉ~ ์ด๋ฌํ ์ฃผ๋ณ ์ง์๋ค์ ๋ฒ๋ฆฌ์ง ์๊ณ , ๊ฐ๊ฐ ์ ์ฌ์ ์์ ์ค์ ์ ํ๋ฉด์ ๊ฒฐ๊ณผ์ ์ผ๋ก NAS๋ฅผ ํตํด ๋์ผํ ์น ํ์ด์ง๋ฅผ ์ธ๋ถ์ ์www(http://xx.xx:80))์ผ๋ก ๋ฐฐํฌํ๋ ๊ฒ์ ์ฑ๊ณตํ๋ค.
๋ด ํ๋ก์ ํธ๊ฐย ohnyong.synology.me๋ผ๋ ๋๋ฉ์ธ ๋ฉ์ธ ํํ์ด์ง์ ๋ํ๋จ
์ด๋ ๋๋ฌด ๋ฟ๋ฏํ๋ค. ์ง๊ธ ์์์ผ ๋๋ฌด ๋น์ฐํ๊ฒ ๋ก์ปฌํ๊ณ ๋์ผํ ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ฉด ๋๋ค๋ผ๊ณ ์์ฝํ ์ ์์ง๋ง ๋ก์ปฌ PC๋ ์๊ฐ๋ณด๋ค ๋ง์ ๊ธฐ๋ณธ ์ธํ
๋ค์ด ํธ๋ฆฌํ๊ณ ํ๋ คํ๊ฒ ๋์ด ์์ง๋ง NAS๋ ์ ๋ณด๋ ์กฐ๊ธ ๋ถ์กฑํ๊ธฐ๋ ํ์ผ๋ฉฐ ๋ด๊ฐ ์ํ๋ ํค์๋๋ก ๋ฑ ๋ค์ด๋ง์ง ์์๋ค. ์๋ก ๋ฐฐํฌ๋ ๋๋ถ๋ถ Web Station ํจํค์ง๋ฅผ ํ์ฉํด์ wordpress ์ ๋๋ง ์ฐ๊ฒฐํ๊ณ ์ ํด์ง ํด๋์ ๋ฃ๋ ์์ ๋ฐฐํฌ ์์, ๊ฐ์ด๋๊ฐ ๋๋ถ๋ถ์ด๋ผ ๋ด ๊ถ๊ธ์ฆ ํด์์๋ ๋ฐ์ ๋๋ฐ์ ๋์์ด ๋์ง ์์๋ค. nas docker-compose๋ผ๋ ํค์๋๋ก ๊ฒ์ํ๊ธฐ ์์ํ๋ฉด์ ๋์ ์๋ฌธ๋ค์ด ํ๋ฆฌ๊ธฐ ์์ํ๊ณ , NAS์ ํฐ๋ฏธ๋์ ๋ค์ด๊ฐ๊ธฐ ์ํ์ฌ ssh ํฌํธ๋ฅผ ์ด๊ณ ubuntu๋ฅผ docker๋ก ๊ฐ์ํ๊ฒฝ์ ์ค์นํ์ฌ ํด๋น ํฌํธ์ ์
๋ ฅํ๋ฉด์, NAS์ ์ ํ์ ์ธ GUIํ๊ฒฝ์์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ํ๋ ๊ฒ์ CLI ๋ช
๋ น์ด๋ก ์ค์นํ๋ฉด์ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๊ฒ ๋ค๋ ์์ ๊ฐ์ด ์๊ฒผ๋ค. ์๋์ ์ผ๋ก Web Station์ด ์ด๋ค ํฌํธ๋ฅผ ์ฐ๊ณ ์๋์ง, ย ๋ด๋ถ ํจํค์ง(์ฑ)์ ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒฝ์ฐ๋ ๋ง์์ ํผ๋์ค๋ฌ์ ๋ค. ํ์ง๋ง ์ค๊ฐ์ค๊ฐ ๋ด๊ฐ ํด์ผ ํ ๊ฒ์ ๋ช
ํํ๊ฒ ์ ๋ฆฌํ๊ณ ์น ์๋ฒ ์ค์ , ๋ด ๋ผ์ฐํฐ๋ก๋ถํฐ์ ์ค์ ๊ณผ NAS ๋ก์ปฌ ์ค์ ์ ๋ง์ถ๋ฉด์ ์ฐจ๊ทผ์ฐจ๊ทผ ์งํํ๋ค. ์๋ง์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๊ณ youtube์์๋ 50๋ NAS์ ์น ์ค์ ๋ถ๋ถ์ ์๋ ค์ฃผ๋ ๊ฐ์ํ์๋ ๋ถ์ ๊ฐ์๋ ์์ธํ ๋ดค๋ค.(์ฌ์ค ๋ด๊ฐ ์ํ๋ ์ค์ ๋ฐฉํฅ๋ณด๋ค๋ ๊ฐํธํ ์ชฝ๊ณผ ๋ณธ์ธ์ ์ธํ
์ ๊ธฐ์ค์ด ๋ช
ํํ์
์ ์กฐ๊ธ ๋ด์ฉ์ ๊ฑฐ๋ฅด๋ฉด์ ๋ดค๋ค. ๋ํ ๋๋ฌด ์์์ด ๊ธธ๋ค.. ํ๋ค์๋ค.) ๊ฐ์ฅ ๋์๊ฒ ๋์ ๋์๋ ์์์ ์์ธ๋ฆฌ์๋์ ์ ๋๋ค Ep.02์ด๋ค. ๊ฐ์ฅ ๋จผ์ ์ฐพ์๋ดค์ผ๋ฉด ๋จผ ๊ธธ์ ์ ๋์์ ์ ๋๋ก ๊ฐ๋ตํ๊ณ ๋ด๊ฐ ์ํ๋ ๋ฐฉํฅ๊ณผ 90% ์ผ์นํ๋ค. 10%๋ ์ด ๊ฐ์๋ ๊ทธ๋ ์ง๋ง ๋๋ถ๋ถ NAS๋ฅผ ์นํ๋์ฒ๋ผ DSM์ ์ ๊ทผํ๋ ๊ฒ์ 80 ํฌํธ๋ก ํฌ์๋ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง ๋๋ ๋ด๊ฐ ์ ์ํ ํํ์ด์ง๋ฅผ Docker์ ๋๋ฆฌ๊ณ , ๋์ปค์ ์ค์ ํ 81๋ฒ ํฌํธ๋ฅผ ๋ 80๋ฒ ํฌํธ๋ก ๋์์ผ ํ๋ค๋ ์ ์ด ํต์ฌ์ธ๋ฐ ์ง๊ธ์ ๋น์ฐํ๊ฒ ๋๊ปด์ง์ง๋ง ์ฌ์ ์ง์์ด ์๋ ์ํ์์๋ ์ธ๋ถํฌํธ? ๋ด๋ถํฌํธ?? ๋ด๋ถ IP? ์ธ๋ถ IP???? ์ด๋ฌํ ๊ถ๊ธ์ฆ์ด ๋ง์์๋ค.. ๋ฌด์ํ ๊ณผ๊ฑฐ์ ๋๋ฅผ ์ด๊ธด ์ ์์ ํ๋ณตํ๋ค. ์์ง๋ ย Spring ํ๋ก์ ํธ๋ฅผ ์ด๋ป๊ฒ ๋ฐฐํฌํ๋์ง๋ ์๋ํด๋ณด์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ฌธ์ ๋ค์ด ๋ง๋ค. ์ด๋ค ์ธํ
๋ค์ ์ด๋์ ํ๊ฒ๋ ๊น? jar? ์ด๊ฑธ ๋๊ธฐ๋๊ฒ์ธ๊ฐ? ์๋ฒ์ธํ
์ ์ด๋์ํ๋๊ฐ? ์ด ์๋ฌธ์ ๋ค์ Spring ํ๋ก์ ํธ ๊ธฐ๊ฐ์ด ๋๋ฉด ์๋ํด๋ณด๋ ค๊ณ ํ๋ค. ๋ํ NAS๋ก๋ ๋๊ฐ์ด ํด๋ณด๊ณ ์ ํ๋ค. ์ผ๋จ ๊ธฐ์ด์ ์ธ ํ์ ์ดํด๋ณธ ๊ฒ ๊ฐ์์ ์ข์๋ค.
[Flask] ๋ฏธ๋ํ๋ก์ ํธ 5์ฃผ์ฐจ bucket, fan ์คํฐ๋ ํ๊ณ (WIL)
POST ์ฐ๊ฒฐ ๊ธฐ๋กํ๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ์ผ๋ DB์ ๋ฐ์ดํฐ๊ฐ ๋์ ๋์ดย ์ ์ฅ๋๋ค.
์ด์ ํด๋น ์น ํ์ด์ง๊ฐย ๋ก๋๋ ย ๋ DB์ ์ ์ฅ๋ ๊ธฐ๋ก๋ ์์ ๋๊ธ ๋ชฉ๋ก์ GET ๋ฐฉ์์ผ๋กย ๋ถ๋ฌ์์ content ํ๋จ ๋ฆฌ์คํธ ๋ถ๋ถ์ ๋ณด์ฌ์ฃผ๊ณ ์ย ํ๋ค.
DB์ ๋ฑ๋ก๋ ๋๋ค์, ์์ ๋๊ธ ๋ด์ฉ์ ๋ฐ์์ View ํ์ด์ง์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์์ฑํด์ผ ํ๋ค.
#### ์์ ๋๊ธ ๋ชฉ๋ก ํ์ธ
โข
DB์ ์ ์ฅ๋ ๊ธฐ๋ก๋ ์์ ๋๊ธ ๋ฐ์ดํฐ ๋ฐ๊ธฐ(find(==read))
โข
๋ฐ์ ๋ฐ์ดํฐ๋ฅผ content ๋ถ๋ถ์ ํ์ค์ฉ ์ถ๋ ฅ
1. ๋ฐ์ดํฐ ๋ช ์ธ
โข
DB :ย MongoDB
โข
Collection :ย fan
โข
Document :
โฆ
๋๋ค์ :ย 'name':'name_receive'ย / from Frontend #name-> formData 'name_give':'value'
โฆ
์์ ๋๊ธ ๋ด์ฉ :ย 'comment':'comment_receive'ย / from Frontendย #comment->ย formData 'comment_give':'value'
2. ์๋ฒ ๋ง๋ค๊ธฐย ๋ฐ MongoDB ์ฐ๊ฒฐ
์๋ฒ ์คํ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ์ย ์๋ฒ ์คํ ํฌํธ ์ค์ ์ GET,POST ๊ธฐ์ด ํ
์คํธ์์ ์ด๋ฏธ ์์ฑ๋์๋ค.
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 08 (Backend ์์ ๋๊ธ ๋ชฉ๋ก ๋ณด๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
ํด๋น ๊ธฐ๋ฅ ๋ชจ๋์ ๋ณธ ํ๋ก์ ํธ์ ํ์ฉํ๊ณ ์ ํ๋ค.
์ ๋ฐ์ ์ผ๋ก GET๋ฐฉ์ ์์ฒญ, ์๋ต๊ณผ ๊ฐ์ ํ๋ฆ์ด๋ค.
์ ์ฒด์ ์ธ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํ๋ฆ์ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
1.
์ฐ์ ํ๋ก ํธ์์ ์น ํ์ด์ง ๋ก๋๊ฐ ๋๋ฉด (document).ready()์ ๋ฐ๋ผ
2.
๋ฐฑ์๋ ์์ฒญ์ JavaScript์ /ranking์ด๋ผ๋ URL๋ก ํด๋น ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ฒ ์ค๊ณํ๋ค.
3.
์ดํ ์๋ต์ app.py์์๋ /ranking ์์ฒญ์ ๋ํ ์๋ต์ ์ค๋นํ๋๋ฐ
4.
์น ํฌ๋กค๋ง์ ์์(ํ
์คํธ ์ฝ๋๋ก ์ฌ์ ์งํํจ)
a.
์ง์ ํ URL์์ ์งํ
b.
requests๋ก HTML์์ค ๋ฐ์
c.
beautifulsoup์ผ๋ก ์ ๋ฆฌํ๊ธฐ ์ฝ๋๋ก ๋ถ์, ์ ๋ ฌ
d.
soup์ find, select๋ฅผ ํตํด ์ํ๋ ๋ฐ์ดํฐ ์ถ์ถ
5.
๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ดํ->์ ๋ฆฌ(๋ฆฌ์คํธํ)ํด์ฃผ๊ณ ->jsonํํ๋ก ๋ค์ JavaScript๋ก ๋ฐํ์์ผ์ค-> Promise ๋ฐ์ดํฐ๋ก ๋ณํ -> ์๋ฆฌํ์์${variable}๋ก ์ฝ๊ฒ ์ํ๋ ๊ณณ์ ์
๋ ฅ
๋ฐ๋ผ์ ์ด๋ฏธ 08 GET๋ฐฉ์์ผ๋ก View ํ์ด์ง์ ์์ ๋๊ธ ๋ชฉ๋ก ๋ณด๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ์ ํ๊ธฐ ๋๋ฌธ์ ๋น์ทํ ํ๋ฆ ์ค์ ์๋ต ๋ถ๋ถ์ ์น ํฌ๋กค๋ง ๋ฐ์ดํฐ๋ก ๊ฐ์์ด๋ฆ, ๋
ธ๋์ ๋ชฉ, ์ค๋ ์์, ์์ ๋ณ๋์ ๋ฐ์์ View ํ์ด์ง์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์์ฑํด์ผ ํ๋ค.
#### ์น ํฌ๋กค๋ง
โข
URL๋ก๋ถํฐ Super Shy์ ๋ฐ์ผ๋ฆฌ ๋ญํน ํฌ๋กค๋ง(soup .find, .select_one)
1. ๋ฐ์ดํฐ ๋ช ์ธ
โข
Contents :
โฆ
๊ฐ์ ์ด๋ฆ :ย 'artist': artistย / from URL #spotifydaily>tbody>tr>td.text mp
โฆ
๋
ธ๋ ์ ๋ชฉ :ย 'title': titleย / from URL #spotifydaily>tbody>tr>td.text mp
โฆ
์ค๋ ์์ :ย 'rank'ย :ย rankย / from URLย #spotifydaily>tbody>tr>td.np
โฆ
์์ ๋ณ๋ : 'rankdiffer' : rankdifferย / from URL#spotifydaily>tbody>tr>td.np
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 09 (Backend Super Shy ๋ญํน ์น ํฌ๋กค๋ง ๋ฐ ๋ณด๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ)
GET ๋ฐ POST ์ฐ๊ฒฐ ํ
์คํธ ๋ฉ์๋์ ์๋์ฌ๋ถ๊ฐ ํ์ธ๋์์ผ๋
ํด๋ผ์ด์ธํธ์์ ์
๋ ฅ๊ฐ์ ๋ฐ์ DB์ ์ ์ฅํ๋ ๊ฒ๋ถํฐ POST ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐํ๊ณ ์ ํ๋ค.
ํด๋ผ์ด์ธํธ์์๋ ๋๋ค์, ์์ ๋๊ธ ๋ด์ฉ์ ๋ฐ๊ณ
์ด ๋ฐ์ดํฐ๋ค์ DB์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์์ฑํด์ผ ํ๋ค.
#### ์์ ๋๊ธ ๊ธฐ๋ก ์งํ
โข
input,textarea์ ๊ฐ ์
๋ ฅ
โข
'๋๊ธ๋จ๊ธฐ๊ธฐ' ๋ฒํผ์ผ๋ก ์
๋ ฅ๊ฐ DB๋ก ์ ์ก ๋ฐ ์ ์ฅ (insert)
1. ๋ฐ์ดํฐ ๋ช ์ธ
โข
DB :ย MongoDB
โข
Collection :ย fan
โข
Document :
โฆ
๋๋ค์ :ย 'name':'name_receive'ย / from Frontend #name-> formData 'name_give':'value'
โฆ
์์ ๋๊ธ ๋ด์ฉ :ย 'comment':'comment_receive'ย / from Frontendย #comment->ย formData 'comment_give':'value'
2. ์๋ฒ ๋ง๋ค๊ธฐย ๋ฐ MongoDB ์ฐ๊ฒฐ
์๋ฒ ์คํ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ์ ์๋ฒ ์คํ ํฌํธ ์ค์ ์ GET,POST ๊ธฐ์ด ํ
์คํธ์์ ์ด๋ฏธ ์์ฑ๋์๋ค.
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 07 (Backend ์์ ๋๊ธ ๋ฌ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
์์ธ์ ์ค์๊ฐ ๋ ์จ ์ ๋ณด OpenAPI ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ HTML ํค๋ ๋ถ๋ถ์ ํ์ํด์ฃผ๋ ค ํ๋ค.

1. ๋ฐ์ดํฐ ๋ช ์ธ
โข
Contents :
โฆ
ํ์ฌ ์จ๋ :ย 'temp': tempย / from URL list
โฆ
ํ์ฌ ๊ธฐํ :ย 'icon': iconย / from URLย list
2. ๊ธฐ๋ฅ ๊ตฌํ์ ์ํ script.js ๋ถ๋ถ ์์ ๋ฐ ์์ฑ
โข
OpenAPI ๊ธฐ๋ณธ ๊ณจ๊ฒฉ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 10 (Backend ์์ธ์ ํ์ฌ ๋ ์จ OpenAPI ๋ณด๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ)


v0.1 ํ๋ก์ ํธย ๊ฐ์ ์์ฑย ๋ฐ ํด๋ ๊ตฌ์กฐ ์์ฑ
v0.2 ๊ธฐ์ด Viewํ์ด์ง์์ฑ, ๊ธฐ์ด GET,POST ํต์ ํ
์คํธ ์๋ฃ, ์น ํฌ๋กค๋ง ๊ธฐ๋ฅ ํ
์คํธ ๋ชจ๋ ์๋ฃ



v0.2.1 POST ์์ ๋๊ธ ๊ธฐ๋กํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ ์๋ฃ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 11 (ํ๋ก์ ํธ ์๋ฃ ๋ฐ ํ์, ๋ฒ์ ๊ด๋ฆฌ)
๊ฐ๋ฐํ๊ณ ์ ํ๋ ํ๋ก์ ํธ์ ์๋ฒ๋ฅผ ์คํํ๊ณ ์น๋ธ๋ผ์ฐ์ ๋ก URL์ ์ ๊ทผ ํ์ ๋,
View ํ์ด์ง ๋ก๋"(document).ready()" ๋ฐ ์ด๋ฒคํธ"onclick()"์์ JavaScript ์์ฒญ์ ๋ํ ํ
์คํธ์ฉ ๋ฉ์์ง ์๋ฆผ์ฐฝ ์์ฑ์ ํ์ธํด์ผ ํ๋ค. Frontend์ ๋ณํฉํ์ฌ 1์ฐจ ํ
์คํธ๋ฅผ ์งํ

ํด๋น ๋ฐฑ์๋ ์์ฒญ ์๋ต ํ๋ฆ์ ์ด์ ํ๋ก์ ํธ์ธ project mars์ ์ ์ฌํ๋ค.
fetch()์ ์ฐ์๋ .then()์ ,ย ย jsonify(),ย res.json(), Promise์ ๋ํ ์ดํด๋ ์ project mars์์ ์ ๋ฆฌ๋์๋ค.
0. ์๋ฒ ์คํ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ์ ์๋ฒ ์คํ ํฌํธ ์ค์
โข
Flask Framework ๋ผ์ด๋ธ๋ฌ๋ฆฌ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 05 (Backend ๊ธฐ์ด ํ
์คํธ GET ์์ฒญ ๋ฐ ์๋ต)
1. ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฐ๊ฒฐ ํ์ธํ๊ธฐ(ํ ์คํธ์ฉ)
GET ๋ฐฉ์๊ณผ ๋น์ทํ์ง๋ง
์์ฒญ ํ ๋ body๋ฅผ ์ถ๊ฐํ์ฌ ์์ฒญํ๋ ๋ถ๋ถ์ด ๋ค๋ฅด๋ค.
body๋ฅผ request.form์ผ๋ก ๋ฐ๊ฒ๋๋ ๋ถ๋ถ์ด ์ถ๊ฐ๋๋ค.
โข
์ด๋ค ์ด๋ฒคํธ์ ํจ์๋ฅผ ์ฐ๊ฒฐ ํ ์ง ํ์ธ
โข
"๋๊ธ ๋จ๊ธฐ๊ธฐ" button์ onclick ์ด๋ฒคํธ๋กย JavaScript์ save_comment() ํจ์ ํธ์ถ
โข
JavaScript์ save_comment()๋ผ๋ ํจ์ ์คํ
โข
formData๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ
โข
{'sample_give':'์ํ๋ฐ์ดํฐ'}๋ผ๋ Dictionary ํ์ ๋ฐ์ดํฐ๋ฅผย .append()๋ฅผ ํตํดย formData์ย ๋ด๊ธฐ
โข
save_comment()๋ด๋ถย fetch()๋ฅผ ํตํด '/guestbook' URL์ ๋ํ POST ๋ฐฉ์ ์์ฒญ
(+ย ์ formData ๊ฐ์ฒด๋ฅผ body๋ก ์ถ๊ฐํ์ฌ ์์ฒญํจ)
โข
app.py์์ '/guestbook' URL์ POST ๋ฐฉ์ ์์ฒญ์ ๋ํ ๋ฉ์๋๋ก ์ ๊ทผ
โข
์ด๋ guestbook_post()๋ผ ์ ์ธ๋ ํจ์๋ฅผ ์คํํ๋๋ฐ
โข
request.form์ ํตํดย ['key']์ ํด๋น๋๋ value๋ฅผ ๊ฐ์ ธ์ค๊ณ ย "sample_receive"๋ผ๋ ๋ณ์์ ๋ด๋๋ค.
โข
print๋กย "sample_receive"์ ๋ด๊ธด ๊ฐ (= value)๋ฅผ ์ถ๋ ฅํ๋ฉด python console์ย '์ํ๋ฐ์ดํฐ'๋ฅผ ์ถ๋ ฅ
โข
์ดํ, ์ฐ๊ฒฐ ํ
์คํธ์ฉ์ผ๋กย {'msg' : 'POST ์ฐ๊ฒฐ ์๋ฃ!'}ย ๋ผ ํ๋์ฝ๋ฉ๋ key, value๊ฐ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 06 (Backend ๊ธฐ์ด ํ
์คํธ POST ์์ฒญ ๋ฐ ์๋ต)
๊ฐ๋ฐํ๊ณ ์ํ๋ ํ๋ก์ ํธ๋ย ์น ํฌ๋กค๋ง์ ์ด์ฉํ๋ค๋ ์ ์ด๋ค.
ํด๋น ๋ถ๋ถ์ ๊ธฐ๋ฅ์ ํ
์คํธ์ฉ์ผ๋ก ๋จผ์ ๊ตฌํํ๊ณ ,
๋ณธ ํ๋ก์ ํธ์ ์ฝ์
ํ ์์ ์ด๋ค.
์ค์ต ๋ด์ฉ์ ์์ง๋ง ์ค์ค๋ก ๋ณต์ต๊ฒธ ๊ตฌํํด๋ณด๊ณ ์ถ์ด์ ์ถ๊ฐํ ๊ธฐ๋ฅ์ด๋ค.
#### ์น ํฌ๋กค๋ง
โข
URL๋ก๋ถํฐ Super Shy์ ๋ฐ์ผ๋ฆฌ ๋ญํน ํฌ๋กค๋ง(soup.select_one)
1. ํ ์คํธ์ฉ URL
๊ณต์ ์ฐจํธ์์๋ ํฌ๋กค๋ง์ด ๋์ง ์์์ ํ ์น ํ์ด์ง์์ Spotify์ ์ฐจํธ๋ฅผ ์ ๊ณตํ๊ณ ์์ด ํด๋น URL์ ๋์์ผ๋ก ํ
์คํธ๋ฅผ ์งํํ๋ คํ๋ค.
2. URL๋ก ๋ค์ด๊ฐ์ Super Shy ๋ญํน ์์ค ํ์ธํ๊ธฐ
Spotify ๊ณต์ ํํ์ด์ง์ ์ฐจํธ์์๋ ํฌ๋กค๋ง์ด ๋ถ๊ฐ๋ฅํ๋ค
Spotify์ ์ผ์ผ ๋ญํน์ด ๊ธฐ๋ก๋๋ kworb.net์์ ํฌ๋กค๋ง์ ์งํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
URL๋ก ๋ค์ด๊ฐ์ ํด๋น ์น ํ์ด์ง์ ์์ค๋ฅผ ํ์ธํด๋ณด๋ฉด
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 03 (์น ํฌ๋กค๋ง ๊ธฐ๋ฅ ๋ถ๋ถ ๊ตฌํ ๋ฐ ํ
์คํธ, ์ํ์ฐฉ์ค์ ํด๊ฒฐ soup.find(string), .parent ์๋ฌธ)
์๋ก์ดย ์จ๋ฒย ๋๋ฌดย ๋ฉ์ ธ์!๊ฐ๋ฐํ๊ณ ์ ํ๋ ํ๋ก์ ํธ์ View ํ์ด์ง(HTML,CSS)์ JavaScript ์ฐ๊ฒฐ ํ
์คํธ์ฉ ์์ฑ
CSS, JavaScript ๋ชจ๋ํ(Static) ๋ฐ ์ฐธ์กฐ ๋งํฌ ์ค์
1. HTML
๊ฒฝ๋ก :ย (project_root)fan/templates/index.html
Body๋ย Container(Wrap)๋ดย Headerย /ย Content /ย Footerย ๋ก ๊ตฌ๋ถ
โข
Header :
โฆ
์น ํ์ด์งย ํ์ดํ
โฆ
ํ์ฌ ๊ธฐ์จ์ ๋ํ๋ด์ฃผ๋ ๋ถ๋ถ #temp
โฆ
ํ์ฌ ๋ ์ง #date
โฆ
๊ฐ์์ ๋
ธ๋ ์ค๋ ์์ #rank
โฆ
ํด๋น ๋
ธ๋์ ์์ ๋ณ๋ #rankdiff
โข
Content :
โฆ
(Input form)
โช
์์ ๋๊ธ์ ๊ธฐ๋กํ๋ ์์์ ๋ค์๊ณผ ๊ฐ๋ค.
โช
๋๋ค์ (#name)์ input ํ๊ทธ๋ฅผ ํตํด value ํ๋
โช
์์ ๋๊ธ (#comment)๋ฅผ textarea ํ๊ทธ๋ฅผ ํตํด value ํ๋
โช
๋๊ธ ๋จ๊ธฐ๊ธฐ ๋ฒํผ์ onclick save_comment() ํจ์๋ฅผ ํธ์ถ
โฆ
(Output List)
โช
div(#comment-list)์ 1์ด๋ก ๊ตฌ์ฑ
โช
๊ฐ ํ๋ง๋ค div(#card>div(#card-body)>blockquote๋ก 1๊ฐ์ ์นด๋ ํํ๊ฐ 1ํ์ฉ ๋ถ์
โช
blockquote ํด๋์ค ๋ถํธ์คํธ๋ฉ ํ
๋ง๊ฐ ์ ์ฉ๋จ
โช
blockquote ์นด๋์ ๋ด์ฉ์ ์๋์ฒ๋ผ 2๊ฐ์ div๋ก ๊ตฌ์ฑ
โข
์๋จ p : ์์ ๋๊ธ ๋ด์ฉ(ex: ์๋ก์ด ์จ๋ฒ ๋๋ฌด ๋ฉ์ ธ์!)
โข
ํ๋จย footer(.blockquote footer) : ๋๋ค์(ex: - ํธ๋นต๋งจ)
โข
Footer : None
div(#comment-list)>div(.card) ์ ์ถํ guestbook_post() ํจ์์ ๊ฒฐ๊ณผ๊ฐ 1ํ์ฉ ์ถ๊ฐ ๋ ์์
2. CSS
โข
(project_root)fan/static/css/style.css๋ก ๋ถ๋ฆฌ ๋ชจ๋ํ
โข
Google Fonts "Orbit" ๊ธ์จ์ฒด ์ ์ฒด ์ ์ฉ
โข
Image ๋ฐฐ๊ฒฝ ์ด๋ก๊ฒ ์ ์ฉ
โข
(Input form) ์
๋ ฅ ์์ ๋ฐ์ค์ธ div(.mypost) ๊ทธ๋ฆผ์ ํจ๊ณผ box-shadow ์ ์ฉ, ๋๋น 500px ๊ณ ์
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 04 (Frontend ๊ธฐ์ด ํ
์คํธ View ํ์ด์ง ์์ฑ ๋ฐ ๋ชจ๋ํ + ํ์ฌ๋ ์ง HTML์ ํ๊ธฐ ๊ตฌํ)
1. ํ๋ก์ ํธ sparta_project/(root)pedia/ ํด๋ ์์ฑ, app.py ๋ฉ์ธ ํ์ผ ์์ฑ
2.ย Viewํ์ด์ง์ฉย (root)/templates/ ํด๋ ์์ฑ,ย ๋ฉ์ธ ๋ทฐํ์ด์ง index.html ์์ฑ
3. CSS ๋ชจ๋ํย (root)/static/css/ ํด๋ ์์ฑ, CSS์ฉ style.css ์์ฑ
4. JS ๋ชจ๋ํ (root)/static/js/ ํด๋ ์์ฑ, JS์ฉ script.js ์์ฑ

5. venv ๊ฐ์ ํ๊ฒฝ ์ค์
6. ์ธํฐํ๋ฆฌํฐ python 3.8.2 ๋ฒ์ ์ ํ ํ (venv)๊ฐ์ํ๊ฒฝ ์ ์ฉ ํฐ๋ฏธ๋ ์ด๊ธฐ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 01 (์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ถ)
(venv) ๊ฐ์ํ๊ฒฝ์ด ์ค์ ๋ ํ๋ก์ ํธ ํด๋์ ํฐ๋ฏธ๋์์ ํด๋น ํ๋ก์ ํธ์ ํ์ํ ํ๋ ์์ํฌ์ *๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์น ํ๋ค.
1๊ฐ์ฉ ๊ฐ๊ฐ ์ค์น ํ ์๋ ์์ง๋ง ๋๋ฒ์งธ ํ๋ก์ ํธ๊ธฐ ๋๋ฌธ์ ํ์ํ ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ฒ์ ์ค์นํ๋ค.
์ด๋ฏธ ์ค์น๋ ๊ฒ๋ค๊น์ง ํ๋ฒ ๋ ํ์ธํด์ค๋ค.
๊ฐ ์ค์น ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. Flask frameworkย ์ค์น
2. Python์ผ๋ก MongoDB ์ฌ์ฉํ๋ PyMongo package ์ค์น(DB ์ฐ๊ฒฐ์ ์ฌ์ฉ)
3. Python์ฉ DNSํจํค์ง Dnspython library ์ค์น(DB ์ฐ๊ฒฐ์ ์ฌ์ฉ)
4. HTTP ์์ฒญ์ ๋ณด๋ผ ์ ์๋ ํจํค์ง requests(์น ํฌ๋กค๋ง์์ ์ฌ์ฉ)
5. html, xml ๋ฑ ๋ฐ์ดํฐ๋ฅผ ํ๋ง, ํ์ฑ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ beautifulsoup(์น ํฌ๋กค๋ง์์ ์ฌ์ฉ)
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 02 (ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น)
# Flask_project_fan
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan)
##ย
ย ํ๋ก์ ํธย ์๊ฐ
๋ด์ง์ค ์์ด๋ ๊ทธ๋ฃน์ ์์๋๊ธ์ ๊ธฐ๋กํ๋ ํฌ์ฌ์ดํธ ์ปจ์
์ ๊ฐ๋จํ ๋ฉ๋ชจ ๊ฒ์ํ ํํ์ ์น ํ์ด์ง ์๋น์ค
##ย
ย ๊ฐ๋ฐย ๊ธฐ๊ฐ
โข
23.07.16์ผ - 23.07.18์ผ
###ย
ย ๋งด๋ฒ๊ตฌ์ฑ
-ย ๊น์ธ์ฉย -ย ์ฑ๊ธย ํ๋ก์ ํธ
###ย
ย ๊ฐ๋ฐย ํ๊ฒฝ
โข
**MainLanguage**ย :ย `PYTHON`
โข
**IDE**ย :ย VisualStudioย Codeย 1.79.2ย (Universal)
โข
**Framework**ย :ย Flaskย Framework
โข
**Database**ย :ย MongoDB(5.0.11)
โข
**SERVER**ย :ย Flask
##ย
ย ์ฃผ์ย ๊ธฐ๋ฅ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project fan) 00 (๊ฐ์)
06๋ฒ ๊ธ์์ POST ์ฐ๊ฒฐ ๊ธฐ๋กํ๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ์ผ๋ DB์ ๋ฐ์ดํฐ๊ฐ ๋์ ๋์ดย ์ ์ฅ๋๋ค.
์ด์ ํด๋น ์น ํ์ด์ง๊ฐย ๋ก๋๋ ย ๋ DB์ ์ ์ฅ๋ ๊ธฐ๋ก๋ ๋ฒํท ๋ฆฌ์คํธ ๋ชฉ๋ก์ GET ๋ฐฉ์์ผ๋กย ๋ถ๋ฌ์์ content ํ๋จ ๋ถ๋ถ์ ๋ณด์ฌ์ฃผ๊ณ ์ย ํ๋ค.
DB์ ๋ฑ๋ก๋ ๋ฒํท ๋ฆฌ์คํธ ๋ด์ฉ์ ๋ฐ์์ View ํ์ด์ง์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์์ฑํด์ผ ํ๋ค.
#### ๋ฒํท๋ฆฌ์คํธ ๋ชฉ๋ก ํ์ธ
โข
DB์ย ์ ์ฅ๋ย ๊ธฐ๋ก๋ย ๋ฒํท๋ฆฌ์คํธย ๋ฐ์ดํฐย ๋ฐ๊ธฐ(find(==read))
โข
๋ฐ์ ๋ฐ์ดํฐ๋ฅผ content ํ๋จ ๋ถ๋ถ์ ํ์ค์ฉ ์ถ๋ ฅ
1. ๋ฐ์ดํฐ ๋ช ์ธ
โข
DB :ย MongoDB
โข
Collection :ย bucket
โข
Document :
โฆ
๋ฒํท๋ฆฌ์คํธ ๋ฉ๋ชจ ๋ด์ฉ :ย 'bucket':'bucket_receive'ย / from Frontend #bucket-> formData 'bucket_give':'value'
2. ์๋ฒ ๋ง๋ค๊ธฐย ๋ฐ MongoDB ์ฐ๊ฒฐ
๊ธฐ๋กํ๊ธฐ POST ์์ฒญ ๋ถ๋ถ์ ์์ฑํ๋ฉด์ ์๋ฒ ๋ฐ MongoDB ์ฐ๊ฒฐ์ ์ด๋ฏธ ์์ฑ๋์ด ์๋ค.
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 07 (Backend ๋ฒํท๋ฆฌ์คํธ ๋ชฉ๋ก ๋ณด๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
GET ๋ฐ POST ์ฐ๊ฒฐ ํ
์คํธ ๋ฉ์๋์ ์๋์ฌ๋ถ๊ฐ ํ์ธ๋์๋ค.
ํด๋ผ์ด์ธํธ์์ ์
๋ ฅ๊ฐ์ ๋ฐ์ DB์ ์ ์ฅํ๋ ๊ฒ๋ถํฐ *POST ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐํ๊ณ ์ ํ๋ค.
ํด๋ผ์ด์ธํธ์์๋ "๋ฒํท๋ฆฌ์คํธ ๋ฉ๋ชจ" ๋ด์ฉ์ ๋ฐ๊ณ
์ด ๋ฐ์ดํฐ๋ค์ DB์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์์ฑํด์ผ ํ๋ค.
#### ๋ฒํท๋ฆฌ์คํธ ๊ธฐ๋ก ์งํ
โข
input๋ฐ์ค์ย ํ
์คํธย ์
๋ ฅ
โข
'๊ธฐ๋กํ๊ธฐ' ๋ฒํผ์ผ๋ก ์
๋ ฅ๊ฐ DB๋ก ์ ์ก ๋ฐ ์ ์ฅ (insert)
1. ๋ฐ์ดํฐ ๋ช ์ธ
โข
DB :ย MongoDB
โข
Collection :ย bucket
โข
Document :
โฆ
๋ฒํท๋ฆฌ์คํธ ๋ฉ๋ชจ ๋ด์ฉ :ย 'bucket':'bucket_receive'ย / from Frontend #bucket-> formData 'bucket_give':'value'
2. DB ์ปค๋ฅ์
์ฐ์ DB์ ๋ฃ์ด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ DB๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก
pymongo๋ฅผ ์ํฌํธ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 06 (Backend ๋ฒํท๋ฆฌ์คํธ ๊ธฐ๋กํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ / DB์ค๊ณ, DB์ฐ๊ฒฐ, POST ์์ฒญ ๋ฐ ์๋ต, insert)



v0.1 ํ๋ก์ ํธย ๊ฐ์ ์์ฑย ๋ฐ ํด๋ ๊ตฌ์กฐ ์์ฑ
v0.2 Frontend ๊ธฐ์ด๋ทฐํ์ด์ง์๋ฃ

v0.3 Backend ์๋ฒ ์์ฑ ๋ฐ ๊ธฐ์ด GET,POST ํต์ ํ
์คํธ ๋ณํฉ

[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 08 (ํ๋ก์ ํธ ์๋ฃ ๋ฐ ํ์, ๋ฒ์ ๊ด๋ฆฌ)
โข
๋ฐฐ์ด์ :
โฆ
project mars์ ๋น์ทํ ํ๋ก์ ํธ(๋ณต์ต)
โฆ
ํ์ง๋ง ๋น์ทํ๊ณ ์คํ๋ ค ๋ ์ ์ ๋ถ๋์ด๊ธฐ ๋๋ฌธ์ ์ง์คํด์ ์งํํจ
โฆ
๋ง์น HTML ํ์ค ๋ ์ด์์์ฒ๋ผ ํ๋ก์ ํธ ํ์ค ๋ ์ด์์์ผ๋ก ์ฌ์ฉํด๋ ๋ ๊ฒ ๊ฐ์
โฆ
์ฌ๊ธฐ์ + ๊ธฐ๋ฅ๋ค์ project pedia์ฒ๋ผ ๋ชจ๋ํ ์์ผ์ ํ
์คํธํ๊ณ ๋ถ์ฌ๋๊ฐ๋ฉด ๋์ง ์์๊น๋ผ๋ ์๊ฐ
โฆ
๊ธฐ๋ฅ ๊ตฌํ์ ์ํย app.pyย ๋ถ๋ถ์ ์์ฑํ ๋ ์ค์ ๋ก ์๋ฌธ์๋ตํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด ๋ด
โช
์ด ๋ถ๋ถ์ ์ข ๋ ์์ธํ ํ๋ฆ ์ ์ฒด๋ฅผ ์ธ์ฐ๊ณ
โช
๊ฐ ๋ถ๋ถ์ ์ด๋ค ์ฝ๋๊ฐ ์ฌ์ฉ๋๋์ง ๋ฐ๋ณต์๋ฌํ๋ฉด์ ์๊ธฐํด์ผ ํ ๊ฒ ๊ฐ์.
โช
๋ถ๋์ด ์ ๊ธฐ ๋๋ฌธ์ ํด๋น ํ๋ก์ ํธ๋ฅผ ์๊ธฐํ๋ ๊ฒ์ด ์ข์ ๋ณด์
โข
์ด๋ ค์ด ์ :
โฆ
GET๊ณผ POST๋ฅผ ๊ณ์ ์ฐ๋๋ฐ ์ ๋
route()์ ๋ํ ๊ฐ๋
์ ์ฐพ์๋ณด์ง ์์์์
โฆ
Route()
โช
HTTP(์น ์ดํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ)๋ URL ์ ๊ทผ์ ๋ํด ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ์์ ์ ๊ณตํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋กย GETย ๋ฐฉ์์ผ๋ก ์ ๊ณต๋์ง๋ง,ย route()ย ๋ฐ์ฝ๋ ์ดํฐ์ย methodsย ์ธ์๋ฅผ ์ ๊ณตํ๋ฉด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
โช
GETย :ย ๋ธ๋ผ์ฐ์ ๊ฐย ์ด๋ค ํ์ด์ง์ ์ ์ฅ๋ ์ ๋ณด๋ฅผ ๋จ์ง ์ป๊ธฐ ์ํด ์๋ฒ์ ์์ฒญํ๊ณ ์๋ฒ๋ ๊ทธ ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฉ์๋๋ค.
โช
POST :ย ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์๊ฒ ์๋ก์ด ์ ๋ณด๋ฅผย ์ ์ก*ํ๋๋ก ํน์ URL์ ์์ฒญํ๊ณ ๊ทธ ์ ๋ณด๊ฐ ์ค์ง ํ๋ฒ ์ ์ฅ๋๋ ๊ฒ์ ๋ณด์ฅํ๋๋ก ํ๋ค. ์ด๊ฒ์ด ๋ณดํต HTMLํผ์ ํตํด์ ์๋ฒ์ ๋ฐ์ดํฐ ์ ์กํ๋ ๋ฐฉ์์ด๋ค.
โช
๊ณต์๋ฌธ์์ ๋ณด๋ HEAD, PUT, DELETE, OPTIONS ๊ฐ์ ๊ฒ๋ ์๋ค.
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 10 ํ๋ก์ ํธ ํ๊ณ ๋ฐฐ์ด์ , ์ด๋ ค์ ๋์
3์ฃผ๊ฐ ๋ฐฐ์ ๋ python๊ณผ mongodb, ์น ํฌ๋กค๋ง ๊ธฐ๋ฅ ๋ฑ์ ํฉ์น๊ณ , ์์ฉํ๋ฉด์ ์ฃผ์ ๊ฐ์๋ ์์ ๊ฒ์ํ ๋ฐฉ์์ ์น ํ์ด์ง๋ฅผ ๋ง๋ค๊ฒ ๋๋ค.
์์ฑ๋ ํ๋ก์ ํธ๋ฅผ ๊ฒ์ผ๋ก ๋ณด๋ฉด ์์งํ โ๋ถ์กฑ"ํ๋ค๊ณ ๋๋ ์ ์๋๋ฐ, ์คํ๋ ค ๋๋ ๋ฐ๋๋ก ๋๋ฌด ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ํ ์๊ฐ์ด ๋์๋ค. Java๋ก ๋ณผ ๋ ์์ฃผ ๋ณต์กํด๋ณด์๋๋ฐ ํ๋ฒ ๋ด์๊ทธ๋ฐ๊ฑด์ง, Python์ผ๋ก ๊ตฌํํ๋๊ฒ ๊ธ๋ฐฉ ๋๋ ๊ฒ์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค. ํ์คํ ๊ฐ๋จํ ๋ฏธ๋ ํ์ด์ง ์ ๋๋ Python์ผ๋ก๋ ๊ธ๋ฐฉ ๋ง๋ค ์ ์์๋ค.
ํนํ ๋์ถฉ ์๊ณ ์๋ ์ฝ๋์ ํ๋ฆ์ ํ์ค ํ์ค์ฉ ์ด๋ํ๋ฉด์ ๊ฐ์ฅ ์ค์ํ ์์ฒญ, ์๋ต, ๋ฐ์ดํฐ ํ๋ฆ์ ํ์
ํ๋๋ฐ ์์ฃผ ํฐ ๋์์ด ๋์๋ค. ๋ํ ์ค์ ์ฝ๋๋ฅผ ์์ฑ ํ ๋์ ์์, ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋์ง ์๋ฌธํด์ผ ํ๋ ํ์ด๋ฐ, ์ด๋ค ์ํ ์ฝ๋๋ฅผ ์ฌ์ฉํด์ผํ๋์ง ๋ฑ๋ฑ ๋ณต์กํ๊ณ ํ๋ คํ ์ฝ๋๋ค๋ณด๋ค ์ง๊ด์ ์ผ๋ก ์ค์ํ ํ๋ฆ์ ๋ฐฐ์ธ ์ ์์๋ค.
์ฐ์ ์ ์ผ๋ก ์ค์ค๋ก ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํตํด ๋ฐ์ดํฐ ํ๋ฆ์ ๋ฐ๋ฅธ ์ฝ๋ ์์ฑ์ ์๋ํด๋ณด๊ธฐ ํ์ผ๋ฉฐ ์์
ํ๋ฆ์ ๋ฐ๋ฅธ ์์ฑ๋ฒ์ ์๋ํด๋ณด๊ธฐ๋ ํ๋ค.
์ด๋ฌ๋ฉด ์ค๋ฌด์์ ์ด๋ค ๊ธฐ๋ฅ, ์น ์ ์ฒด๋ฅผ ๊ตฌํํด์ผ ํ ๋ ๋ด๊ฐ ํ์ฌ ์ด๋ ์์ ์ ์๊ณ ์ด๋ค ๋ถ๋ถ์ ์์
ํด์ผ ๋ ์ง ๊ฐ์ด ์กํ ๊ฒ ๊ฐ์๋ค.
๋ํ ๊ทธ๋ฅ ๊ทธ๋ฐ๊ฐ๋ณด๋ค ํ๊ณ ์ง๋๊ฐ๋ ์ฝ๋๋ค์์ ์จ๊ฒจ์ง ์์ฃผ ๊ธฐ์ด์ ์ธ ์ฉ์ด๋ค์ ๋ํ ๊ฐ๋
์ ์ ๋ฆฌํ๋ ๋ฒ๋ฆ์ ๋ค์ฌ๋ดค๋ค. ์ปดํจํฐ๊ณตํ์ ์ด๋ก ์ ๋จ๊ธฐ๊ฐ์ ๋ฐฐ์ธ์ ์์ ์ ๋๋ก ๊ด๋ฒ์ํ์ง๋ง ์ต์ํ ๋ด๊ฐ ์ฐ๋ ์ฝ๋์ ๊ธฐ๋ฅ๋ค์ ๋ํด์ "๊ณต์ ๋ฌธ์"๋ฅผ ์ฐพ์์ ์ ๋ขฐ๋ ๋์ ํด์ค์ ์ฐธ๊ณ ํ๊ณ ์ ํ๋ค. ๋ชจ๋ฅด๋ ํจ์๊ฐ ํ๋ ๋์ค๋ฉด ๊ณต์๋ฌธ์๋ก ๋ค์ด๊ฐ๋ฉด ๋ ๋ชจ๋ฅด๋ ์ฉ์ด๊ฐ ๋์จ๋ค. ๊ทธ ์ฉ์ด๋ฅผ ๋ ํ๊ณ ๋ค์ด๊ฐ์ ์ฐพ์๋ณด๊ณ .. ์ด๋ฐ ์ํฉ์ด ๋ฐ๋ณต๋์ ์๊ฐ๋ณด๋ค ์์ต ์๊ฐ์ด ์์ฒญ ๊ธธ์ด์ก๋ค. ์๋ฌด๋ฆฌ ์ด๋๋ ์ดํด๋๊ฐ ์์ฃผ ๋จํธ์ ์ด์ง๋ง, ์๋ชป๋ ์ฉ์ด ์ฌ์ฉ์ ๊ฐ๋ฐ์๊ฐ์ ์คํด๋ฅผ ์ด ์ ์๊ธฐ ๋๋ฌธ์ ๊ผผ๊ผผํ ๋ชจ๋ฅด๋ ๊ฒ๋ค์ ์ฐพ์๋ณด๋ ค ๋
ธ๋ ฅํ๋ค. ๋ํ ๋๋ฌด ์ฌ๊ฐํ๊ฒ ๊น๊ฒ ํ์ง๋ ์์ผ๋ คํ๋ค. ๋ด๊ฐ ์ดํดํ ์ ์๋ ์ ์์ ๊ถ๊ธ์ฆ์ ํด์ํ๊ณ ์ ๋นํ ๋น ์ ธ๋์์ผ ํ๋ ๊ฒ์ ๋๊ผ๋ค. ์๋ชปํ๋ฉด ์๊ฐ์ ํ๋น ํ ์๋ ์๊ณ ๋๋ฌด ๊ด๋ จ์๋ ๊ฒ๊น์ง ๋ฐฐ์ฐ๊ฒ ๋ ์ ์๋ค.
์ด๋ฒ์ฃผ๋ ํน๋ณํ ์ค์ค๋ก ์ง์งํ๊ฒ ๋ง์น ํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๊ฒ ์ฒ๋ผ ํ์ฅ, ํ๋ก ํธ์๋ ํ์1, ๋ฐฑ์๋ ํ์2 ์ฒ๋ผ 3๋ช
์ ์ญํ ์ ํผ์ ๋๋์ด์ ์งํํด๋ณด์๋ค. ํ๋ก์ ํธ ๊ฐ์์ DB์ค๊ณ, ์ด๊ธฐ github์ ํตํ ์๊ฒฉ์ ์ฅ์ ์ค์ ๊ณผ ํํธ๋ณ ๋ธ๋์น ์์ฑ, ๋ถ์
, ํํธ๊ฐ ์๋ฃ๋๋ฉด ๊ฒํ , ํ
์คํธ๊ฐ ํ์ํ๋ฉด ๊ตฌํ ๋ถ๋ถ๊น์ง๋ง ๋ณํฉํ์ฌ ํ
์คํธ์ฉ ๋ฒ์ ์ ์์ฑํ๋ ๋ฑ ํ๋์ ์งํํ๋ค.
์ด ์์ต ํ๋์ ํตํด์ Flask Framework์ ๋ํด ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ค์ ํ์
ํด ๋๊ฐ๋๋ฐ ํฐ ๋์์ด ๋์๋ค. ๋ค์ ์ฃผ์ ์งํ๋๋ ํ๋ก์ ํธ๋ ์ด๋ค ์ฃผ์ ์ผ์ง, ์ด๋ค ์๋ก์ด ๊ธฐ๋ฅ์ด ์์์ง ๊ธฐ๋๋๋ค.
[Flask] ๋ฏธ๋ํ๋ก์ ํธ 4์ฃผ์ฐจ mars, pedia ์คํฐ๋ ํ๊ณ (WIL)
ํด๋น ๋ฐฑ์๋ ์์ฒญ ์๋ต ํ๋ฆ์ ์ด์ ํ๋ก์ ํธ์ธ project mars์ ์ ์ฌํ๋ค.
1. ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฐ๊ฒฐ ํ์ธํ๊ธฐ(ํ ์คํธ์ฉ)
GET ๋ฐฉ์๊ณผ ๋น์ทํ์ง๋ง
์์ฒญ ํ ๋ body๋ฅผ ์ถ๊ฐํ์ฌ ์์ฒญํ๋ ๋ถ๋ถ์ด ๋ค๋ฅด๋ค.
body๋ฅผ request.form์ผ๋ก ๋ฐ๊ฒ๋๋ ๋ถ๋ถ์ด ์ถ๊ฐ๋๋ค.
โข
์ด๋ค ์ด๋ฒคํธ์ ํจ์๋ฅผ ์ฐ๊ฒฐ ํ ์ง ํ์ธ
โข
"๊ธฐ๋กํ๊ธฐ" button์ onclick ์ด๋ฒคํธ๋กย JavaScript์ save_bucket() ํจ์ ํธ์ถ
โข
JavaScript์ย save_bucket()๋ผ๋ ํจ์ ์คํ
โข
formData๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ
โข
{'sample_give':'์ํ๋ฐ์ดํฐ'}๋ผ๋ Dictionary ํ์ ๋ฐ์ดํฐ๋ฅผย .append()๋ฅผ ํตํดย formData์ย ๋ด๊ธฐ
โข
posting()๋ด๋ถย fetch()๋ฅผ ํตํด '/bucket' URL์ ๋ํ POST ๋ฐฉ์ ์์ฒญ
(+ย ์ formData ๊ฐ์ฒด๋ฅผ body๋ก ์ถ๊ฐํ์ฌ ์์ฒญํจ)
โข
app.py์์ '/bucket' URL์ POST ๋ฐฉ์ ์์ฒญ์ ๋ํ ๋ฉ์๋๋ก ์ ๊ทผ
โข
์ด๋ bucket_post()๋ผ ์ ์ธ๋ ํจ์๋ฅผ ์คํํ๋๋ฐ
โข
request.form์ ํตํดย ['key']์ ํด๋น๋๋ value๋ฅผ ๊ฐ์ ธ์ค๊ณ ย "sample_receive"๋ผ๋ ๋ณ์์ ๋ด๋๋ค.
โข
print๋กย "sample_receive"์ ๋ด๊ธด ๊ฐ (= value)๋ฅผ ์ถ๋ ฅํ๋ฉด python console์ย '์ํ๋ฐ์ดํฐ'๋ฅผ ์ถ๋ ฅ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 05 (Backend ๊ธฐ์ด ํ
์คํธ POST ์์ฒญ ๋ฐ ์๋ต)
1. ํ๋ก์ ํธ sparta_project/(root)bucket/ ํด๋ ์์ฑ, app.py ๋ฉ์ธ ํ์ผ ์์ฑ
2.ย Viewํ์ด์ง์ฉย (root)/templates/ ํด๋ ์์ฑ,ย ๋ฉ์ธ ๋ทฐํ์ด์ง index.html ์์ฑ
3. CSS ๋ชจ๋ํย (root)/static/css/ ํด๋ ์์ฑ, CSS์ฉ style.css ์์ฑ
4. JS ๋ชจ๋ํ (root)/static/js/ ํด๋ ์์ฑ, JS์ฉ script.js ์์ฑ

5. venv ๊ฐ์ ํ๊ฒฝ ์ค์
6. ์ธํฐํ๋ฆฌํฐ python 3.8.2 ๋ฒ์ ์ ํ ํ (venv)๊ฐ์ํ๊ฒฝ ์ ์ฉ ํฐ๋ฏธ๋ ์ด๊ธฐ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 01 (์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ถ)
(venv) ๊ฐ์ํ๊ฒฝ์ด ์ค์ ๋ ํ๋ก์ ํธ ํด๋์ ํฐ๋ฏธ๋์์ ํด๋น ํ๋ก์ ํธ์ ํ์ํ ํ๋ ์์ํฌ์ *๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์น ํ๋ค.
1๊ฐ์ฉ ๊ฐ๊ฐ ์ค์น ํ ์๋ ์์ง๋ง ๋๋ฒ์งธ ํ๋ก์ ํธ๊ธฐ ๋๋ฌธ์ ํ์ํ ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ฒ์ ์ค์นํ๋ค.
์ด๋ฏธ ์ค์น๋ ๊ฒ๋ค๊น์ง ํ๋ฒ ๋ ํ์ธํด์ค๋ค.
๊ฐ ์ค์น ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. Flask frameworkย ์ค์น
2. Python์ผ๋ก MongoDB ์ฌ์ฉํ๋ PyMongo package ์ค์น(DB ์ฐ๊ฒฐ์ ์ฌ์ฉ)
3. Python์ฉ DNSํจํค์ง Dnspython library ์ค์น(DB ์ฐ๊ฒฐ์ ์ฌ์ฉ)
4. HTTP ์์ฒญ์ ๋ณด๋ผ ์ ์๋ ํจํค์ง requests(์น ํฌ๋กค๋ง์์ ์ฌ์ฉ)
5. html, xml ๋ฑ ๋ฐ์ดํฐ๋ฅผ ํ๋ง, ํ์ฑ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ beautifulsoup(์น ํฌ๋กค๋ง์์ ์ฌ์ฉ)
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 02 (ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น)
๊ฐ๋ฐํ๊ณ ์ ํ๋ ํ๋ก์ ํธ์ View ํ์ด์ง(HTML,CSS)์ JavaScript ์ฐ๊ฒฐ ํ
์คํธ์ฉ ์์ฑ
CSS, JavaScript ๋ชจ๋ํ(Static) ๋ฐ ์ฐธ์กฐ ๋งํฌ ์ค์
1. HTML
๊ฒฝ๋ก :ย (project_root)bucket/templates/index.html
Body๋ย Headerย /ย Contentย ๋ก ๊ตฌ๋ถ
โข
Header :ย ํ์ดํ(title), ๋ฐฑ๊ทธ๋ผ์ด๋ ์ด๋ฏธ์ง
โข
Content :
โฆ
input(#bucket) ํ
์คํธ ์
๋ ฅ ๋ฐ์ค / ๊ธฐ๋กํ๊ธฐ ๋ฒํผ onclick "save_bucket()" ํจ์ ํธ์ถ
โฆ
div(#bucket-list)>li*n ํํ๋ก ์ ์ถํ save_bucket() ํจ์์ ๊ฒฐ๊ณผ๊ฐ 1ํ์ฉ ์ถ๊ฐ๋ ์์ (์ด์ ํ๋ก์ ํธ๊น์ง Footer๋ก ํํํ์ง๋ง ์ฌ์ค์ Footer์ ์ญํ ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ content๋ก ํฌํจ์ํด)
โข
Footer :ย None
2. CSS
โข
(project_root)mars/static/css/style.css๋ก ๋ถ๋ฆฌ ๋ชจ๋ํ
โข
Google Fonts "Gowun Dodum" ๊ธ์จ์ฒด ์ ์ฒด ์ ์ฉ
โข
Image ๋ฐฐ๊ฒฝ ์ด๋ก๊ฒ ์ ์ฉ, ๋์ด 200px๊ณ ์
โข
Content๋ถ๋ถ์ธ .mybox์ ํ๋์ ํ
๋๋ฆฌ ๊ทธ๋ฆผ์ ํจ๊ณผ ์ ์ฉ
โข
๋ฒํท๋ฆฌ์คํธ ๋ชฉ๋ก์ผ๋ก ๋ํ๋ li>h2ํ๊ทธ์ ์ค๋ก ๊ตฌ๋ถ๋ ์ ์๋๋ก line-through ์ ์ฉ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 03 (Frontend ๊ธฐ์ด ํ
์คํธ View ํ์ด์ง ์์ฑ ๋ฐ ๋ชจ๋ํ)
Tistory๋ก ๋ถํฐ ์ฎ๊ฒจ์ก์ต๋๋ค. ํด๋น ํ๋ก์ ํธ ์งํ TIL๋ ์๋ ๋งํฌ๋ฅผ ํตํด ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
#ย Flask_project_bucket
[Flask]ย Flaskย frameworkย ๋ฏธ๋ํ๋ก์ ํธ(projectย bucket)
##ย
ย ํ๋ก์ ํธย ์๊ฐ
๋ฒํท๋ฆฌ์คํธ๋ฅผย ๊ธฐ๋กํ๋ย ์ปจ์
์ย ๊ฐ๋จํย ๋ฉ๋ชจย ๊ฒ์ํย ํํ์ย ๊ฒ์๊ธ์ย ๋ฑ๋กํ๋ย ์นย ํ์ด์งย ์๋น์ค
##ย
ย ๊ฐ๋ฐย ๊ธฐ๊ฐ
โข
23.07.14์ผย -ย 23.07.16์ผ
###ย
ย ๋งด๋ฒ๊ตฌ์ฑ
-ย ๊น์ธ์ฉย -ย ์ฑ๊ธย ํ๋ก์ ํธ
###ย
ย ๊ฐ๋ฐย ํ๊ฒฝ
โข
**MainLanguage**ย :ย `PYTHON`
โข
**IDE**ย :ย VisualStudioย Codeย 1.79.2ย (Universal)
โข
**Framework**ย :ย Flaskย Framework
โข
**Database**ย :ย MongoDB(5.0.11)
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 00 (๊ฐ์)
๊ฐ๋ฐํ๊ณ ์ ํ๋ ํ๋ก์ ํธ์ ์๋ฒ๋ฅผ ์คํํ๊ณ ์น๋ธ๋ผ์ฐ์ ๋ก URL์ ์ ๊ทผ ํ์ ๋,
View ํ์ด์ง ๋ก๋"(document).ready()" ๋ฐ ์ด๋ฒคํธ"onclick()"์์ JavaScript ์์ฒญ์ ๋ํ ํ
์คํธ์ฉ ๋ฉ์์ง ์๋ฆผ์ฐฝ ์์ฑ์ ํ์ธํด์ผ ํ๋ค. Frontend์ ๋ณํฉํ์ฌ 1์ฐจ ํ
์คํธ๋ฅผ ์งํ

ํด๋น ๋ฐฑ์๋ ์์ฒญ ์๋ต ํ๋ฆ์ ์ด์ ํ๋ก์ ํธ์ธ project mars์ ์ ์ฌํ๋ค.
fetch()์ ์ฐ์๋ .then()์ ,ย ย jsonify(),ย res.json(), Promise์ ๋ํ ์ดํด๋ ์ project mars์์ ์ ๋ฆฌ๋์๋ค.
0. ์๋ฒ ์คํ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ์ ์๋ฒ ์คํ ํฌํธ ์ค์
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project bucket) 04 (Backend ๊ธฐ์ด ํ
์คํธ GET ์์ฒญ ๋ฐ ์๋ต)
โข
๋ฐฐ์ด์ :
โฆ
ํ๋ก์ ํธ ์ฒ๋ผ ์งํํ๊ธฐ ์ํด ํ๋ก์ ํธ ๊ฐ์ ์์ฑ
โฆ
๊ตฌํํ ๊ธฐ๋ฅ์ ๊ธฐํ
โฆ
ํ๋ก์ ํธ ์งํ ๋จ๊ณ ๊ตฌ์ฑ
โช
์ด๊ธฐํ๊ฒฝ๊ตฌ์ถ
โช
ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
โช
๊ธฐ์ด ํ๋ก์ ํธ ๊ตฌ์กฐ ์์ฑ ๋ฐ ํ์
๋ถ๋ฐฐ
โช
GET ๊ธฐ๋ฅ๊ตฌํ
โช
POST ๊ธฐ๋ฅ๊ตฌํ
โช
์ต์ข
ํ
์คํธ
โฆ
CSS, JavaScript ๋ชจ๋ํ(Static) ๋ฐ ์ฐธ์กฐ ๋งํฌ ์ค์
โข
์ด๋ ค์ด ์ :
โฆ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋? ๊ฐ๋
์ดํด
โช
ํจ์๋ค์ด ๋ญ์ณ์ง ํ๋์ .py ํ์ผ ์์ ์ด๋ฃจ์ด์ง ๊ฒ์ย ๋ชจ๋์ด๋ผ๊ณ ํฉ๋๋ค.
โช
์ฌ๋ฌ ๊ฐ์ ๋ชจ๋์ ๊ทธ๋ฃนํ ํ๋ฉดย ํจํค์ง๊ฐ ๋ฉ๋๋ค.
โช
ํดํท ๋๋ ํจํค์ง๋ ์ข
์ข
ย ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ๋ ๋ถ๋ฆฌ์๋๋ค.
โฆ
ํ๋ก์ ํธ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ณผ์ ๊ณผ ๊ฐ์ํ๊ฒฝ์ ๋ค์ ์ค์ ํ๋ ํ๊ฒฝ๊ตฌ์ถ ๋จ๊ณ์์ ์๋ฌ๊ฐ ๋ฐ์ ๋ฐ ํด๊ฒฐ
โช
Importย "flask"ย couldย notย beย resolvedย fromย sourceย Pylanceย (reportMissingModuleSource)
โช
์์ ํด๋๊ฐ ์๋ ๊ฒฝ์ฐ.. VSCode์์ "ํด๋ ์ ํ"์ ์์ ํด๋๋ฅผ ์ ํํ ์ํ์์ (venv)๊ฐ์ํ๊ฒฝ์ ์ค์ ํ๋ฉด ์์ ํด๋์์ venvํด๋์ ์ค์ ํ์ผ๋ค์ด ์๊ฒจ๋๋ค. ์๋ง ์ ํ๋ ํด๋๋ฅผ root์ฒ๋ผ ์ธ์ํด์ root/venv/๋ฅผ ์์ฑํ๋ ๊ฒ ๊ฐ๋ค.
โฆ
ํด๋ผ์ด์ธํธ ์์ฒญ-๋ฐฑ์๋ ์๋ต๊ณผ ์ก์ ๋ฑ ํต์ ์ ํ๋ฆ, ๋ฐ์ดํฐ์ ํ๋ฆ์ด ์ด๋ ต๋ค.
โช
์ View ํ์ด์ง ํด๋ผ์ด์ธํธ์์ Frontend๋ก๋ถํฐ Backend ๊ฐ์ ์์ฒญ ๋ฐ ์๋ต, ๋ฐ์ดํฐ ๋ณํ๊ณผ ์ด๋ ํ๋ฆ์ ์ค์ค๋ก "ํ์ค์ฉ" script.jsํ์ผ๊ณผย app.pyย ํ์ผ์ ์๋ค๊ฐ๋คํ๋ฉฐ ์ฝ์ด๋ด๊ณ ๋ชจ๋ฅด๋ ๋ถ๋ถ, ์ดํด๊ฐ ์๋๋ ๋ถ๋ถ๋ค์ ์ฐพ์๋ณด์๋ค.
โฆ
fetch()์ ์ฐ์๋ .then()์
โช
์๋ฒ ํต์ (fetch())์ ๋ํ ์๋ต(response)๊ฐ์ฒด๋ฅผ ๋ฐํ
โช
fetch().then( respose => {์ฝ๋ฐฑ ํจ์1} ).then( respose => {์ฝ๋ฐฑ ํจ์2} )
โช
fetch์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ response์ธ์์ ๋ณด๋ธ๋ค.
โช
์ฝ๋ฐฑํจ์๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ๋ค์ return ํ๋ค.
โช
then()๋ฅผ ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ธ์ ๊ฐ์ ์ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์๋ฏธํ๋ค.
โฆ
jsonify()
โช
์ฌ์ฉ์๊ฐ json data๋ฅผ ๋ด๋ณด๋ด๋๋ก ์ ๊ณตํ๋ flask์ ํจ์. jsonify()๋ json response๋ฅผ ๋ณด๋ด๊ธฐ ์ํด ์ด๋ฏธ content-type header๊ฐ 'application/json'๋ก ๋์ด ์๋ flask.Response() ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค.
โฆ
res.json()
โช
Response:ย json()ย method== Response stream์ ๊ฐ์ง๊ณ ์์(take) ๋๋ ๋ ๊น์ง ์ฝ๋๋ค(read it to completion). body text๋ฅผ JSONํํ๋ก ํ์ฑ(parsing)ํ resolve๊ฐ์ธ Promise ๋ฅผ ๋ฆฌํดํ๋ค.)
โช
(*The json() method of the Body mixin takes a Response stream and reads it to completion. It returns a promise that resolves with the result of parsing the body text as JSON.
โฆ
Promise
โช
Promise๋ ํ๋ก๋ฏธ์ค๊ฐ ์์ฑ๋ ์์ ์๋ ์๋ ค์ง์ง ์์์ ์๋ ์๋ ๊ฐ์ ์ํ ๋๋ฆฌ์๋ก, ๋น๋๊ธฐ ์ฐ์ฐ์ด ์ข
๋ฃ๋ ์ดํ์ ๊ฒฐ๊ณผ ๊ฐ๊ณผ ์คํจ ์ฌ์ ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ๋ฉ์๋์์ ๋ง์น ๋๊ธฐ ๋ฉ์๋์ฒ๋ผ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค. ๋ค๋ง ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์๋๊ณ , ๋ฏธ๋์ ์ด๋ค ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ฒ ๋ค๋ '์ฝ์'(ํ๋ก๋ฏธ์ค)์ ๋ฐํํฉ๋๋ค.
โฆ
fetch()์ body
โช
fetch('/mars', {ย method:ย "POST",ย body:ย formDataย })
โช
body๋ ์์ฒญ์ ์ถ๊ฐํ๊ณ ์ ํ๋ ๋ณธ๋ฌธ์
๋๋ค. Blob, ArrayBuffer, TypedArray, DataView, FormData, URLSearchParams, ๋ฌธ์์ด ๊ฐ์ฒด ๋๋ ๋ฆฌํฐ๋ด, ReadableStream ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ์ผ ๋ง์ง๋ง์ ์์ง ์คํ์ ๊ธฐ๋ฅ์ด๋ฏ๋ก ํธํ์ฑ ์ ๋ณด๋ฅผ ๋จผ์ ํ์ธํด์ ์ฌ์ฉํ ์ ์์์ง ๊ฒ์ฆํ์ธ์. GET๊ณผ HEAD ๋ฉ์๋๋ ๋ณธ๋ฌธ์ ๊ฐ์ง ์ ์์ต๋๋ค.
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project mars) 09 ํ๋ก์ ํธ ํ๊ณ ๋ฐฐ์ด์ , ์ด๋ ค์ ๋์



v0.1 ํ๋ก์ ํธย ๊ฐ์ ์์ฑย ๋ฐ ํด๋ ๊ตฌ์กฐ ์์ฑ
v0.2 ์นํฌ๋กค๋ง ๊ธฐ๋ฅ ๊ตฌํ์ฉ ํ
์คํธ ๋ชจ๋ ์์ฑ ๋ฐ ํ
์คํธ

v0.3.1 ๊ธฐ์ด ํ๋ก ํธ์๋ ํด๋ผ์ด์ธํธ ํ๋กํ ํ์
View ํ์ด์ง์์ฑ

[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 09 (ํ๋ก์ ํธ ์๋ฃ ๋ฐ ํ์, ๋ฒ์ ๊ด๋ฆฌ)
โข
๋ฐฐ์ด์ :
โฆ
project mars์ ๋น์ทํ ํ๋ก์ ํธ(๋ณต์ต)
โฆ
์น ํฌ๋กค๋ง ๊ธฐ๋ฅ ์ถ๊ฐ
โฆ
ํด๋ผ์ด์ธํธ์์๋ URL, ๋ณ์ , ๋ฆฌ๋ทฐ ๋ด์ฉ์ ๋ฐ๊ณ ์ URL์ ํตํด์ ์ํ์ ์ ๋ชฉ, ์ค๋ช
, ์ด๋ฏธ์ง URL์ ๋ฐ๊ฒ ๋๋ค. ์ด ๋ฐ์ดํฐ๋ค์ DB์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์์ฑํด์ผ ํ๋ค.
โฆ
๊ธฐ๋ฅ ๊ตฌํ์ ์ํย app.pyย ๋ถ๋ถ์ ์์ฑ ํ ๋ ์ค์ ๋ก ์๋ฌธ์๋ตํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด๋ด
โฆ
๋ฉํํ๊ทธ์ ๋ฐ์ดํฐ(๊ฐ) ๊ฐ์ ธ์ค๊ธฐ
โช
soup์ select_one()์ผ๋กย 'meta'๋ผ๋ ํ๊ทธ์ [property๊ฐog:title, og:image, og:description] ๋ถ๋ถ์ ์ฐพ์์ ์ํ๋ ๊ฐ์ด ๋ด๊ธด ['content']๋ถ๋ถ์ ๊ฐ์ ๊ฐย ogtitle,ย ogimage,ย ogdesc๋ณ์์ ๋ด๋๋ค
โข
์ด๋ ค์ด ์ :
โฆ
๋ฉํํ๊ทธ
โช
๋ฉํ ํ๊ทธ(meta tag)๋ ์นํ์ด์ง๊ฐ ๋ด๊ณ ์๋ ์ปจํ
์ธ ๊ฐ ์๋ ์นํ์ด์ง ์์ฒด์ ์ ๋ณด๋ฅผ ๋ช
์ํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ HTML ํ๊ทธ๋ฅผ ์๋ฏธ
โช
SNS๋ฑ์์ (๋ณธ tstory๋ ๋ง์ฐฌ๊ฐ์ง) URL๋งํฌ๋ฅผ ๊ณต์ ํ๋ฉด ํ๋จ์ ์ด๋ฏธ์ง/ํ์ดํ/๋ด์ฉ ๋ฑ์ด ๋ํ๋๋ ์๋์ ๊ฐ์ ๊ฒ๋ค์ด metaย ํ๊ทธ๋ฅผ ํตํด ๋ํ๋ ๊ฒ์ผ๋ก ์ดํดํ๋ฉด ๋๋ค.
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 10 ํ๋ก์ ํธ ํ๊ณ ๋ฐฐ์ด์ , ์ด๋ ค์ ๋์
07๋ฒ ๊ธ์์ POST ์ฐ๊ฒฐ ๊ธฐ๋กํ๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ์ผ๋ DB์ ๋ฐ์ดํฐ๊ฐ ๋์ ๋์ด ์ ์ฅ๋๋ค.
์ด์ ํด๋น ์น ํ์ด์ง๊ฐ ๋ก๋๋ ๋ DB์ ์ ์ฅ๋ ๊ธฐ๋ก๋ ๋ฆฌ๋ทฐ ๋ชฉ๋ก์ GET ๋ฐฉ์์ผ๋กย ๋ถ๋ฌ์์ content ๋ถ๋ถ์ ๋ณด์ฌ์ฃผ๊ณ ์ย ํ๋ค.
DB์ ๋ฑ๋ก๋ ๋ฆฌ๋ทฐ ์ํ์ ์ฌ์ง(url์ ํตํด ์ด๋ฏธ์ง๋ก), ์ํ ์ ๋ชฉ, ์ํ ์ค๋ช
, ๋ณ์ , ๋ฆฌ๋ทฐ ๋ด์ฉ์ ๋ฐ์์ View ํ์ด์ง์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์์ฑํด์ผ ํ๋ค.
#### ๋ฆฌ๋ทฐ๋ชฉ๋กํ์ธ
โข
DB์ ์ ์ฅ๋ ๊ธฐ๋ก๋ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ๋ฐ๊ธฐ(find(==read))
โข
๋ฐ์ ๋ฐ์ดํฐ๋ฅผ content ํ๋จ ๋ถ๋ถ์ 4์ด ์นด๋ ํํ๋ก ์ถ๋ ฅ
1. ๋ฐ์ดํฐ ๋ช ์ธ
โข
DB :ย MongoDB
โข
Collection :ย movie
โข
Document :
โฆ
์ํ URL :ย 'url':'url_receive'ย / from Frontend #url-> formData 'url_give':'value'
โฆ
๋ณ์ :ย 'star':'star_receive'ย / from Frontendย #star->ย formData 'star_give':'value'
โฆ
๋ฆฌ๋ทฐ ๋ด์ฉ :ย 'comment':'comment_receive'ย / from Frontend formDataย #comment->ย 'comment_give':'value'
โฆ
์ํ ์ ๋ชฉ :ย 'title':ogtitleย / from URL <meta [property="og:title"]['content']> 'value'
โฆ
์ํ ์ค๋ช
:ย 'desc':ogdescย / from URL <meta[property="og:description"]['content']> 'value'
โฆ
์ํ ์ด๋ฏธ์ง URL :ย 'image':ogimageย / from URL <meta[property="og:image"]['content']> 'value'
2. ์๋ฒ ๋ง๋ค๊ธฐย ๋ฐ MongoDB ์ฐ๊ฒฐ
๊ธฐ๋กํ๊ธฐ POST ์์ฒญ ๋ถ๋ถ์ ์์ฑํ๋ฉด์ ์๋ฒ ๋ฐ MongoDB ์ฐ๊ฒฐ์ ์ด๋ฏธ ์์ฑ๋์ด ์๋ค.
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 08 (Backend ๋ฆฌ๋ทฐ ๋ชฉ๋ก ๋ณด๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
GET ๋ฐ POST ์ฐ๊ฒฐ ํ
์คํธ ๋ฉ์๋์ ์๋์ฌ๋ถ๊ฐ ํ์ธ๋์์ผ๋
ํด๋ผ์ด์ธํธ์์ ์
๋ ฅ๊ฐ์ ๋ฐ์ DB์ ์ ์ฅํ๋ ๊ฒ๋ถํฐ POST ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐํ๊ณ ์ ํ๋ค.
ํด๋ผ์ด์ธํธ์์๋ URL, ๋ณ์ , ๋ฆฌ๋ทฐ ๋ด์ฉ์ ๋ฐ๊ณ
์ URL์ ํตํด์ ์ํ์ ์ ๋ชฉ, ์ค๋ช
, ์ด๋ฏธ์ง URL์ ๋ฐ๊ฒ ๋๋ค.
์ด ๋ฐ์ดํฐ๋ค์ DB์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์์ฑํด์ผ ํ๋ค.
#### ์ํ ๋ฆฌ๋ทฐ ๊ธฐ๋ก ์งํ
โข
๋์ ์ํ URL, ๋ณ์ , ๋ฆฌ๋ทฐ ์ฝ๋ฉํธ ์
๋ ฅ
โข
'๊ธฐ๋กํ๊ธฐ' ๋ฒํผ์ผ๋ก ์
๋ ฅ๊ฐ+ํฌ๋กค๋ง ๋ฐ์ดํฐ DB๋ก ์ ์ก ๋ฐ ์ ์ฅ (insert)
1. ๋ฐ์ดํฐ ๋ช ์ธ
โข
DB :ย MongoDB
โข
Collection :ย movie
โข
Document :
โฆ
์ํ URL :ย 'url':'url_receive'ย / from Frontend #url-> formData 'url_give':'value'
โฆ
๋ณ์ :ย 'star':'star_receive'ย / from Frontendย #star->ย formData 'star_give':'value'
โฆ
๋ฆฌ๋ทฐ ๋ด์ฉ :ย 'comment':'comment_receive'ย / from Frontend formDataย #comment->ย 'comment_give':'value'
โฆ
์ํ ์ ๋ชฉ :ย 'title':ogtitleย / from URL <meta [property="og:title"]['content']> 'value'
โฆ
์ํ ์ค๋ช
:ย 'desc':ogdescย / from URL <meta[property="og:description"]['content']> 'value'
โฆ
์ํ ์ด๋ฏธ์ง URL :ย 'image':ogimageย / from URL <meta[property="og:image"]['content']> 'value'
2. ์๋ฒ ๋ง๋ค๊ธฐย ๋ฐ MongoDB ์ฐ๊ฒฐ
์๋ฒ ์คํ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ์ ์๋ฒ ์คํ ํฌํธ ์ค์ ์ GET,POST ๊ธฐ์ด ํ
์คํธ์์ ์ด๋ฏธ ์์ฑ๋์๋ค.
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 07 (Backend ๋ฆฌ๋ทฐ ๊ธฐ๋กํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
ํด๋น ๋ฐฑ์๋ ์์ฒญ ์๋ต ํ๋ฆ์ ์ด์ ํ๋ก์ ํธ์ธ project mars์ ์ ์ฌํ๋ค.
1. ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฐ๊ฒฐ ํ์ธํ๊ธฐ(ํ ์คํธ์ฉ)
GET ๋ฐฉ์๊ณผ ๋น์ทํ์ง๋ง
์์ฒญ ํ ๋ body๋ฅผ ์ถ๊ฐํ์ฌ ์์ฒญํ๋ ๋ถ๋ถ์ด ๋ค๋ฅด๋ค.
body๋ฅผ request.form์ผ๋ก ๋ฐ๊ฒ๋๋ ๋ถ๋ถ์ด ์ถ๊ฐ๋๋ค.
โข
์ด๋ค ์ด๋ฒคํธ์ ํจ์๋ฅผ ์ฐ๊ฒฐ ํ ์ง ํ์ธ
โข
"๊ธฐ๋กํ๊ธฐ" button์ onclick ์ด๋ฒคํธ๋กย JavaScript์ posting() ํจ์ ํธ์ถ
โข
JavaScript์ posting()๋ผ๋ ํจ์ ์คํ
โข
formData๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ
โข
{'sample_give':'์ํ๋ฐ์ดํฐ'}๋ผ๋ Dictionary ํ์ ๋ฐ์ดํฐ๋ฅผย .append()๋ฅผ ํตํดย formData์ย ๋ด๊ธฐ
โข
posting()๋ด๋ถย fetch()๋ฅผ ํตํด '/movie' URL์ ๋ํ POST ๋ฐฉ์ ์์ฒญ
(+ย ์ formData ๊ฐ์ฒด๋ฅผ body๋ก ์ถ๊ฐํ์ฌ ์์ฒญํจ)
โข
app.py์์ '/movie' URL์ POST ๋ฐฉ์ ์์ฒญ์ ๋ํ ๋ฉ์๋๋ก ์ ๊ทผ
โข
์ด๋ movie_post()๋ผ ์ ์ธ๋ ํจ์๋ฅผ ์คํํ๋๋ฐ
โข
request.form์ ํตํดย ['key']์ ํด๋น๋๋ value๋ฅผ ๊ฐ์ ธ์ค๊ณ ย "sample_receive"๋ผ๋ ๋ณ์์ ๋ด๋๋ค.
โข
print๋กย "sample_receive"์ ๋ด๊ธด ๊ฐ (= value)๋ฅผ ์ถ๋ ฅํ๋ฉด python console์ย '์ํ๋ฐ์ดํฐ'๋ฅผ ์ถ๋ ฅ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 06 (Backend ๊ธฐ์ด ํ
์คํธ POST ์์ฒญ ๋ฐ ์๋ต)
(venv) ๊ฐ์ํ๊ฒฝ์ด ์ค์ ๋ ํ๋ก์ ํธ ํด๋์ ํฐ๋ฏธ๋์์ ํด๋น ํ๋ก์ ํธ์ ํ์ํ ํ๋ ์์ํฌ์ *๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์น ํ๋ค.
1๊ฐ์ฉ ๊ฐ๊ฐ ์ค์น ํ ์๋ ์์ง๋ง ๋๋ฒ์งธ ํ๋ก์ ํธ๊ธฐ ๋๋ฌธ์ ํ์ํ ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ฒ์ ์ค์นํ๋ค.
์ด๋ฏธ ์ค์น๋ ๊ฒ๋ค๊น์ง ํ๋ฒ ๋ ํ์ธํด์ค๋ค.

๊ฐ ์ค์น ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. Flask frameworkย ์ค์น
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 02 (ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น)
Tistory๋ก ๋ถํฐ ์ฎ๊ฒจ์ก์ต๋๋ค. ํด๋น ํ๋ก์ ํธ ์งํ TIL๋ ์๋ ๋งํฌ๋ฅผ ํตํด ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
# Flask_project_pedia
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia)
##ย
ย ํ๋ก์ ํธย ์๊ฐ
์นย ํฌ๋กค๋ง์ย ํ์ฉํย ๊ฐ๋จย ๋ฆฌ๋ทฐย ๊ฒ์ํย ํํ์ย "์ํ"ย ๋ฆฌ๋ทฐ๋ฅผย ๋ฑ๋กํ๋ย ์นย ํ์ด์งย ์๋น์ค
##ย
ย ๊ฐ๋ฐย ๊ธฐ๊ฐ
โข
23.07.12์ผ - 23.07.13์ผ
###ย
ย ๋งด๋ฒ๊ตฌ์ฑ
-ย ๊น์ธ์ฉย -ย ์ฑ๊ธย ํ๋ก์ ํธ
###ย
ย ๊ฐ๋ฐย ํ๊ฒฝ
โข
**MainLanguage**ย :ย `PYTHON`
โข
**IDE**ย :ย VisualStudioย Codeย 1.79.2ย (Universal)
โข
**Framework**ย :ย Flaskย Framework
โข
**Database**ย :ย MongoDB(5.0.11)
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 00 (๊ฐ์)
๊ฐ๋ฐํ๊ณ ์ํ๋ ํ๋ก์ ํธ๋ ์ด์ project mars์ ํฌ๊ฒ ๋ค๋ฅธ ๋ถ๋ถ์ด
์น ํฌ๋กค๋ง์ ์ด์ฉํ๋ค๋ ์ ์ด๋ค. ํฌ๋กค๋ง ํ ๋ *๋ฉํํ๊ทธ๋ฅผ ํ์ฉ ํ ๊ฒ์ด๋ผ์
ํด๋น ๋ถ๋ถ์ ๊ธฐ๋ฅ์ ํ
์คํธ์ฉ์ผ๋ก ๋จผ์ ๊ตฌํํ๊ณ ,
๋ณธ ํ๋ก์ ํธ์ ์ฝ์
ํ ์์ ์ด๋ค.
#### ์น ํฌ๋กค๋ง-ย URL๋ก๋ถํฐย ์ํย ์ด๋ฏธ์ง,ย ์ํย ์ ๋ชฉ,ย ์ํย ์ค๋ช
ย ํญ๋ชฉย ๋ฉํํ๊ทธย ํฌ๋กค๋ง(soup.select_one)
1. ํ ์คํธ์ฉ URL
"์ค์ฆ๋ฉ์ ๋ฌธ๋จ์" ์ด๋ผ๋ ์ํ์ URL์ ๋์์ผ๋ก ํ
์คํธ๋ฅผ ์งํํ๋ คํ๋ค.
2. URL๋ก ๋ค์ด๊ฐ์ ๋ฉํ ํ๊ทธ ํ์ธํ๊ธฐ
URL๋ก ๋ค์ด๊ฐ์ ํด๋น ์น ํ์ด์ง์ ์์ค๋ฅผ ํ์ธํด๋ณด๋ฉด
<head>ํ๊ทธ ๋ด์ <meta ...>๋ฅผ ํ์ธ ํ ์ ์๋ค.

3. ์น ํฌ๋กค๋ง์ ์ํ requests, Beautifulsoup ์ํฌํธ ๋ฐ URL์ HTML ํ์ฑ
โข
์น ํฌ๋กค๋ง ํ
์คํธ๋ฅผ ์ํ meta_prac.py๋ฅผ ์์ฑ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 03 (์น ํฌ๋กค๋ง ๊ธฐ๋ฅ ๋ถ๋ถ ๊ตฌํ ๋ฐ ํ
์คํธ)
๊ฐ๋ฐํ๊ณ ์ ํ๋ ํ๋ก์ ํธ์ ์๋ฒ๋ฅผ ์คํํ๊ณ ์น๋ธ๋ผ์ฐ์ ๋ก URL์ ์ ๊ทผ ํ์ ๋,
View ํ์ด์ง ๋ก๋"(document).ready()" ๋ฐ ์ด๋ฒคํธ"onclick()"์์ JavaScript ์์ฒญ์ ๋ํ ํ
์คํธ์ฉ ๋ฉ์์ง ์๋ฆผ์ฐฝ ์์ฑ์ ํ์ธํด์ผ ํ๋ค. Frontend์ ๋ณํฉํ์ฌ 1์ฐจ ํ
์คํธ๋ฅผ ์งํ

ํด๋น ๋ฐฑ์๋ ์์ฒญ ์๋ต ํ๋ฆ์ ์ด์ ํ๋ก์ ํธ์ธ project mars์ ์ ์ฌํ๋ค.
fetch()์ ์ฐ์๋ .then()์ ,ย ย jsonify(),ย res.json(), Promise์ ๋ํ ์ดํด๋ ์ project mars์์ ์ ๋ฆฌ๋์๋ค.
0. ์๋ฒ ์คํ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ์ ์๋ฒ ์คํ ํฌํธ ์ค์
โข
Flask Framework ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โข
request ๋ชจ๋
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 05 (Backend ๊ธฐ์ด ํ
์คํธ GET ์์ฒญ ๋ฐ ์๋ต)
1. ํ๋ก์ ํธ sparta_project/(root)pedia/ ํด๋ ์์ฑ, app.py ๋ฉ์ธ ํ์ผ ์์ฑ
2.ย Viewํ์ด์ง์ฉย (root)/templates/ ํด๋ ์์ฑ,ย ๋ฉ์ธ ๋ทฐํ์ด์ง index.html ์์ฑ
3. CSS ๋ชจ๋ํย (root)/static/css/ ํด๋ ์์ฑ, CSS์ฉ style.css ์์ฑ
4. JS ๋ชจ๋ํ (root)/static/js/ ํด๋ ์์ฑ, JS์ฉ script.js ์์ฑ

5. venv ๊ฐ์ ํ๊ฒฝ ์ค์
6. ์ธํฐํ๋ฆฌํฐ python 3.8.2 ๋ฒ์ ์ ํ ํ (venv)๊ฐ์ํ๊ฒฝ ์ ์ฉ ํฐ๋ฏธ๋ ์ด๊ธฐ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 01 (์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ถ)
๊ฐ๋ฐํ๊ณ ์ ํ๋ ํ๋ก์ ํธ์ View ํ์ด์ง(HTML,CSS)์ JavaScript ์ฐ๊ฒฐ ํ
์คํธ์ฉ ์์ฑ
CSS, JavaScript ๋ชจ๋ํ(Static) ๋ฐ ์ฐธ์กฐ ๋งํฌ ์ค์
1. HTML
๊ฒฝ๋ก :ย (project_root)pedia/templates/index.html
Body๋ย Headerย /ย Contentย ๋ก ๊ตฌ๋ถ
โข
Header :ย ํ์ดํ(title), ์ํ ๊ธฐ๋กํ๊ธฐ(button onclick ์ด๋ฒคํธ)
โข
Content :ย button์ ๋๋ฅด๋ฉด content๋ถ๋ถ์ ๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋กํ๋ ์์(form) ์ด ๋ํ๋จย onclickย open_box() ํจ์ ํธ์ถ
โฆ
๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋กํ๋ ์์์ ๋ค์๊ณผ ๊ฐ๋ค.
โฆ
์ํ URL(#url) input ํ๊ทธ๋ฅผ ํตํด value ํ๋
โฆ
๋ณ์ (#star) select>1~5option ํ๊ทธ๋ฅผ ํตํด value ํ๋
โฆ
์ํ ๋ฆฌ๋ทฐ ์ฝ๋ฉํธ(#comment)ย textarea ํ๊ทธ๋ฅผ ํตํด value ํ๋
โฆ
๊ธฐ๋กํ๊ธฐ ๋ฒํผ์ onclick posting() ํจ์๋ฅผ ํธ์ถ
โฆ
๋ซ๊ธฐ ๋ฒํผ์ onclick close_box() ํจ์๋ฅผ ํธ์ถ
โข
Content ํ๋จ
โฆ
div(#cards-box)์ 4์ด์ผ๋ก ๊ตฌ์ฑ
โฆ
๊ฐ ํ๋ง๋ค div(#cards-box)>div(#col) ์ผ๋ก 1๊ฐ์ ์นด๋ ํํ๊ฐ 4์ด๋ก ๋ถ์
โฆ
div(#col)ย ์นด๋์ ๋ด์ฉ์ ์๋์ฒ๋ผ 2๊ฐ์ div๋ก ๊ตฌ์ฑ
โช
์๋จ div(.card-img-top) : ์ํ ์ด๋ฏธ์ง
โช
ํ๋จ div(.card-body) : ์ ๋ชฉ, ์ค๋ช
, ๋ณ์ , ๋ฆฌ๋ทฐ
div(#cards-box)>div(.col) ์ ์ถํ posting() ํจ์์ ๊ฒฐ๊ณผ๊ฐ 1์ด์ฉ ์ถ๊ฐ(4์ด ์ด๊ณผ ์ ๋ค์ ํ์ผ๋ก ์ด๋) ๋ ์์
2. CSS
โข
(project_root)pedia/static/css/style.css๋ก ๋ถ๋ฆฌ ๋ชจ๋ํ
โข
Google Fonts "Gowun Dodum" ๊ธ์จ์ฒด ์ ์ฒด ์ ์ฉ
โข
Image ๋ฐฐ๊ฒฝ ์ด๋ก๊ฒ ์ ์ฉ
โข
button ํฌ๊ธฐ ์ง์ , ํฌ๋ช
ํ transparent ์ ์ฉ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project pedia) 04 (Frontend ๊ธฐ์ด ํ
์คํธ View ํ์ด์ง ์์ฑ ๋ฐ ๋ชจ๋ํ)
1. ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฐ๊ฒฐ ํ์ธํ๊ธฐ(ํ ์คํธ์ฉ)
GET ๋ฐฉ์๊ณผ ๋น์ทํ์ง๋ง
์์ฒญ ํ ๋ body๋ฅผ ์ถ๊ฐํ์ฌ ์์ฒญํ๋ ๋ถ๋ถ์ด ๋ค๋ฅด๋ค.
body๋ฅผ request.form์ผ๋ก ๋ฐ๊ฒ๋๋ ๋ถ๋ถ์ด ์ถ๊ฐ๋๋ค.
โข
์ด๋ค ์ด๋ฒคํธ์ ํจ์๋ฅผ ์ฐ๊ฒฐ ํ ์ง ํ์ธ
โข
"์ฃผ๋ฌธํ๊ธฐ" button์ onclick ์ด๋ฒคํธ๋กย JavaScript์ย save_order() ํจ์ ํธ์ถ
โข
JavaScript์ save_order()๋ผ๋ ํจ์ ์คํ
โข
formData๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ
โข
{'sample_give':'์ํ๋ฐ์ดํฐ'}๋ผ๋ Dictionary ํ์ ๋ฐ์ดํฐ๋ฅผย .append()๋ฅผ ํตํดย formData์ย ๋ด๊ธฐ
โข
save_order()๋ด๋ถย fetch()๋ฅผ ํตํด '/mars' URL์ ๋ํ POST ๋ฐฉ์ ์์ฒญ
(+ย ์ formData ๊ฐ์ฒด๋ฅผ body๋ก ์ถ๊ฐํ์ฌ ์์ฒญํจ)
โข
app.py์์ '/mars' URL์ POST ๋ฐฉ์ ์์ฒญ์ ๋ํ ๋ฉ์๋๋ก ์ ๊ทผ
โข
์ด๋ mars_post()๋ผ ์ ์ธ๋ ํจ์๋ฅผ ์คํํ๋๋ฐ
โข
request.form์ ํตํดย ['key']์ ํด๋น๋๋ value๋ฅผ ๊ฐ์ ธ์ค๊ณ ย "sample_receive"๋ผ๋ ๋ณ์์ ๋ด๋๋ค.
โข
print๋กย "sample_receive"์ ๋ด๊ธด ๊ฐ (= value)๋ฅผ ์ถ๋ ฅํ๋ฉด python console์ย '์ํ๋ฐ์ดํฐ'๋ฅผ ์ถ๋ ฅ
โข
์ดํ, ์ฐ๊ฒฐ ํ
์คํธ์ฉ์ผ๋กย {'msg' : 'POST ์ฐ๊ฒฐ ์๋ฃ!'}ย ๋ผ ํ๋์ฝ๋ฉ๋ key, value๊ฐ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project mars) 05 (Backend ๊ธฐ์ด ํ
์คํธ POST ์์ฒญ ๋ฐ ์๋ต)
GET ๋ฐ POST ์ฐ๊ฒฐ ํ
์คํธ ๋ฉ์๋์ ์๋์ฌ๋ถ๊ฐ ํ์ธ๋์์ผ๋
ํด๋ผ์ด์ธํธ์์ ์
๋ ฅ๊ฐ์ ๋ฐ์ DB์ ์ ์ฅํ๋ ๊ฒ๋ถํฐ POST ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐํ๊ณ ์ ํ๋ค.
์ฃผ๋ฌธ์์ ์ด๋ฆ, ์ฃผ์, ๋
์๋๋ฅผ ๋ฐ์์ DB์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์์ฑํด์ผ ํ๋ค.
####ย ์ฃผ๋ฌธ์งํ-ย ์ฃผ๋ฌธ์ย ์ด๋ฆ,ย ์ฃผ๋ฌธ์ย ์ฃผ์,ย ์ฃผ๋ฌธํ๊ณ ์ํ๋ย ๋
ย ์๋ย ์
๋ ฅ-ย '์ฃผ๋ฌธํ๊ธฐ'ย ๋ฒํผ์ผ๋กย ์
๋ ฅ๊ฐย DB๋กย ์ ์กย ๋ฐย ์ ์ฅย (insert)
1. ๋ฐ์ดํฐ ๋ช ์ธ
โข
DB :ย MongoDB
โข
Collection :ย mars
โข
Document :
โฆ
์ฃผ๋ฌธ์ ์ด๋ฆ :ย 'name':'name_receive'ย / from Frontend #name-> formData 'name_give':'value'
โฆ
์ฃผ๋ฌธ์ ์ฃผ์ :ย 'address':'address_receive'ย / from Frontendย #address->ย formData 'address_give':'value'
โฆ
์ฃผ๋ฌธ ๋
์๋ :ย 'size':'size_receive'ย / from Frontend formDataย #size->ย 'size_give':'value'
2. DB ์ปค๋ฅ์
์ฐ์ DB์ ๋ฃ์ด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ DB๋ฅผ ์ฌ์ฉ ํ ์ ์๋๋ก
pymongo๋ฅผ ์ํฌํธ
(MacOS ๊ถํ ๊ด๋ จ ์ค๋ฅ๊ฐ ๋ฐ ์ ์์ผ๋ฏ๋ก cetifi๋ฅผ ์ถ๊ฐ๋ก ์ค์น, ์ํฌํธ ํด์ฃผ์๋ค.
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project mars) 06 (Backend ์ฃผ๋ฌธํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ / DB์ค๊ณ, DB์ฐ๊ฒฐ, POST ์์ฒญ ๋ฐ ์๋ต, insert)
06๋ฒ ๊ธ์์ POST ์ฐ๊ฒฐ ์ฃผ๋ฌธ ๊ธฐ๋ฅ์ ๊ตฌํํ์ผ๋ DB์ ๋ฐ์ดํฐ๊ฐ ๋์ ๋์ด ์ ์ฅ ๋๋ค.
์ด์ ํด๋น ์น ํ์ด์ง๊ฐ ๋ก๋ ๋ ๋ DB์ ์ ์ฅ๋ ์ฃผ๋ฌธ ๋ชฉ๋ก์ GET ๋ฐฉ์์ผ๋กย ๋ถ๋ฌ์์ content ํ๋จ ๋ถ๋ถ์ ๋ณด์ฌ์ฃผ๊ณ ์ย ํ๋ค.
DB์ ๋ฑ๋ก๋ ์ฃผ๋ฌธ์์ ์ด๋ฆ, ์ฃผ์, ๋
์๋๋ฅผ ๋ฐ์์ View ํ์ด์ง์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์์ฑํด์ผ ํ๋ค.
#### ์ฃผ๋ฌธ๋ชฉ๋กํ์ธ
โข
DB์ย ์ ์ฅ๋ย ์ฃผ๋ฌธ๋ย ๋ฐ์ดํฐย ๋ฐ๊ธฐ(find(==read))
โข
๋ฐ์ ๋ฐ์ดํฐ๋ฅผ content ํ๋จย ๋ถ๋ถ์ ํ ํํ๋ก ์ถ๋ ฅ
1. ๋ฐ์ดํฐ ๋ช ์ธ
โข
DB :ย MongoDB
โข
Collection :ย mars
โข
Documents
โฆ
์ฃผ๋ฌธ์ ์ด๋ฆ :ย 'name':'name_receive'ย / from Frontend #name-> formData 'name_give':'value'
โฆ
์ฃผ๋ฌธ์ ์ฃผ์ :ย 'address':'address_receive'ย / from Frontendย #address->ย formData 'address_give':'value'
โฆ
์ฃผ๋ฌธ ๋
์๋ :ย 'size':'size_receive'ย / from Frontend formDataย #size->ย 'size_give':'value'
2. ์๋ฒ ๋ง๋ค๊ธฐ ๋ฐ MongoDB ์ฐ๊ฒฐ
์ฃผ๋ฌธํ๊ธฐ POST ์์ฒญ ๋ถ๋ถ์ ์์ฑํ๋ฉด์ ์๋ฒ ๋ฐ MongoDB ์ฐ๊ฒฐ์ ์ด๋ฏธ ์์ฑ๋์ด ์๋ค.
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project mars) 07 (Backend ์ฃผ๋ฌธ ๋ชฉ๋ก ๋ณด๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ)



v0.1 ํ๋ก์ ํธ ์์ฑ Frontend ๊ธฐ์ด HTML ์์ฑ

v0.2 Flask Framework GET,POST ๋ผ๋ ์์ฑ ๋ฐ ์๋ฒ ์์ฑ / Frontend ๋ธ๋ ์น ์์ฑ ์์
View ํ์ด์ง ์๋ฃ ํ ๋ณํฉ

v0.3 HTML, CSS, JS ๋ชจ๋ํ๋ก ํ๋ก์ ํธ ํด๋ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ๋ณํฉ ๋ฐ Backend ์ ๊ท ๋ธ๋ ์น ์์ฑ ์์
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project mars) 08 (ํ๋ก์ ํธ ์๋ฃ ๋ฐ ํ์, ๋ฒ์ ๊ด๋ฆฌ)
๊ฐ๋ฐํ๊ณ ์ ํ๋ ํ๋ก์ ํธ์ View ํ์ด์ง(HTML,CSS)์ JavaScript ์ฐ๊ฒฐ ํ
์คํธ์ฉ ์์ฑ
CSS, JavaScript ๋ชจ๋ํ(Static) ๋ฐ ์ฐธ์กฐ ๋งํฌ ์ค์
1. HTML
๊ฒฝ๋ก :ย (project_root)mars/templates/index.html
Body๋ย Headerย /ย Contentย ย ๋ก ๊ตฌ๋ถ
โข
Header :ย ๊ฐ๋จํ ํ์ดํ๊ณผ ์ฃผ๋ฌธ ๊ด๋ จ ์ค๋ช
๊ธฐ๋ก
โข
Content :
โฆ
์ด๋ฆ(#name), ์ฃผ์(#address)๋ input ํ๊ทธ๋ฅผ ํตํด value ํ๋
โฆ
ํ์(#size)๋ select๋ฐ์ค์ 5๊ฐ option์ ์ ํํ์ฌ value ํ๋
โฆ
table>thead ์ ์ด๋ฆ, ์ฃผ์, ํ์ ์ปฌ๋ผ๋ช
3ํ ์ง์
โฆ
table>tbody(#order-box) ์ ์ถํ save_order() ํจ์์ ๊ฒฐ๊ณผ๊ฐ 1์ด์ฉ ์ถ๊ฐ ๋ ์์
โข
Footer : None
2. CSS
โข
(project_root)mars/static/css/style.css๋ก ๋ถ๋ฆฌ ๋ชจ๋ํ
โข
Google Fonts "Gowun Batang" ๊ธ์จ์ฒด ์ ์ฒด ์ ์ฉ
โข
Image ๋ฐฐ๊ฒฝ ์ด๋ก๊ฒ ์ ์ฉ
โข
Header, Content, Footer ๋ด๊ณ ์๋ body ํ๊ทธ ์ ์ฒด ๊ฐ์ด๋ฐ ์ ๋ ฌ ์ ์ฉ
โข
๊ธฐํ ์์๋ณ ๋์์ธ์ index.html์ ์ฐธ์กฐ๋ Bootstrap ํ
๋ง ์ฌ์ฉ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project mars) 03 (Frontend ๊ธฐ์ด ํ
์คํธ View ํ์ด์ง ์์ฑ ๋ฐ ๋ชจ๋ํ)
๊ฐ๋ฐํ๊ณ ์ ํ๋ ํ๋ก์ ํธ์ ์๋ฒ๋ฅผ ์คํํ๊ณ ์น๋ธ๋ผ์ฐ์ ๋ก URL์ ์ ๊ทผ ํ์ ๋,
View ํ์ด์ง ๋ก๋"(document).ready()" ๋ฐ ์ด๋ฒคํธ"onclick()"์์ JavaScript ์์ฒญ์ ๋ํ ํ
์คํธ์ฉ ๋ฉ์์ง ์๋ฆผ์ฐฝ ์์ฑ์ ํ์ธํด์ผ ํ๋ค. Frontend์ ๋ณํฉํ์ฌ 1์ฐจ ํ
์คํธ๋ฅผ ์งํ

0. ์๋ฒ ์คํ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ์ ์๋ฒ ์คํ ํฌํธ ์ค์
โข
Flask Framework ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โข
request ๋ชจ๋
โข
jsonify ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โข
port=5001(Mac์ด๋ผ ํฌํธ์ถฉ๋ ๋ฐฉ์ง)
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project mars) 04 (Backend ๊ธฐ์ด ํ
์คํธ GET ์์ฒญ ๋ฐ ์๋ต)
(venv) ๊ฐ์ํ๊ฒฝ์ด ์ค์ ๋ ํ๋ก์ ํธ ํด๋์ ํฐ๋ฏธ๋์์ ํด๋น ํ๋ก์ ํธ์ ํ์ํ ํ๋ ์์ํฌ์ *๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์น ํ๋ค.
1. Flask framework ์ค์น
Flask 2.3.2 ์ค์น ์๋ฃ

2. Python์ผ๋ก MongoDB ์ฌ์ฉํ๋ PyMongo package ์ค์น
pymongo 4.4.0 ์ค์น ์๋ฃ
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project mars) 02 (ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น)
1. ํ๋ก์ ํธ ํด๋ ์์ฑ
2. app.py ๋ฉ์ธ ํ์ผ ์์ฑ
3. venv ๊ฐ์ ํ๊ฒฝ ์ค์
4. ์ธํฐํ๋ฆฌํฐ python 3.8.2 ๋ฒ์ ์ ํ ํ (venv)๊ฐ์ํ๊ฒฝ ์ ์ฉ ํฐ๋ฏธ๋ ์ด๊ธฐ
5. viewํ์ด์ง์ฉ templates ํด๋ ์์ฑ
6. ๋ฉ์ธ ๋ทฐํ์ด์ง index.html ์์ฑ
7. .gitignore๋ก ๊ฐ์ํ๊ฒฝ ์ถ์ ์ ์ธ

[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project mars) 01 (์ด๊ธฐ ํ๊ฒฝ ๊ตฌ์ถ)
Tistory๋ก ๋ถํฐ ์ฎ๊ฒจ์ก์ต๋๋ค. ํด๋น ํ๋ก์ ํธ ์งํ TIL๋ ์๋ ๋งํฌ๋ฅผ ํตํด ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
#ย Flask_project_mars
[Flask]ย Flaskย frameworkย ๋ฏธ๋ํ๋ก์ ํธ(projectย mars)
##ย
ย ํ๋ก์ ํธย ์๊ฐ
"ํ์ฑ๋
"์ย ์ฃผ๋ฌธํ๋ย ์ฃผ์ ๋กย ๋ง๋๋ย ์ผ์ข
์ย "Memo"ย ๊ธฐ๋ฅย ์นย ํ์ด์ง
##ย
ย ๊ฐ๋ฐย ๊ธฐ๊ฐ
โข
23.07.09์ผย -ย 23.07.10์ผ
###ย
ย ๋งด๋ฒ๊ตฌ์ฑ
-ย ๊น์ธ์ฉย -ย ์ฑ๊ธย ํ๋ก์ ํธ
###ย
ย ๊ฐ๋ฐย ํ๊ฒฝ
โข
**MainLanguage**ย :ย `PYTHON`
โข
**IDE**ย :ย VisualStudioย Codeย 1.79.2ย (Universal)
โข
**Framework**ย :ย Flaskย Framework
โข
**Database**ย :ย MongoDB(5.0.11)
[Flask] Flask framework ๋ฏธ๋ํ๋ก์ ํธ(project mars) 00 (๊ฐ์)