์๋ ํ์ธ์ ๐
์ด๋ฒ ์ฌ๋ฆ๋ฐฉํ ์์๊ณผ ๋์์ ์ค์ํ๊ฒ ๋ ์์ ํ๋ก์ ํธ ํ๋๋ฅผ ์๊ฐ๋๋ฆฌ๊ณ ์ ํฉ๋๋ค.
FE / BE ๊ฐ๋ฐ์ด ์ฒ์์ด๋ผ ๋ง์ด ์ํด์ง๋ง '์ฌ๋ฏธ์๋๊ฑฐ ๋ง๋ค์๊ตฌ๋ง' ๊ฐ์ ๊ด์ ์ผ๋ก ๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
ํ๋ก์ ํธ ์์ ๊ณ๊ธฐ
2024๋ 1ํ๊ธฐ ๋ชจ ์ค์๋์๋ฆฌ์์ ์์์ง์ ๋งก๊ณ ์๋ ์ ๋ ํ๊ธฐ ๋ง์ ํฐ ์๊ธฐ๋ฅผ ๋ง์ต๋๋ค. ๋ฐ๋ก ๋์๋ฆฌ ๋ด ๋ถ์์์ ํด์ผ ํ ์ผ์ ์ ๋ ํ์ง ๋ชปํด ํ์๋ค์ ํ๋ ์ธ์ ์ ์ฒญ์๊ฐ ์ ์ถ๋์ง ์์๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ํ์ ํ๋ ์ธ์ ์ ์ฒญ์ ์ ์ถํ ๋ ํ์ํ ์๋ฅ๊ฐ ์์์ ์ด๊ณ ์ฌ๋์ด ํ๋ ์ผ์ด๋ค ๋ณด๋ ์ค๋ฅ๊ฐ ๋ง๋ค๊ณ ์๊ฐํด "์ด ๋ชจ๋ ๊ฒ์ ์๋ํํ๊ณ ํด๋ฆญ ๋ช ๋ฒ์ผ๋ก ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ๋ง๋ค์ด๋ณด์!"๋ผ๋ ์ทจ์ง๋ก ์์ํ๊ฒ ๋์์ต๋๋ค.
ํ๋ก์ ํธ ์ค๊ณ
์ฒ์ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ๊ฐ์ฅ ๋ง๋งํ๋ ๊ฒ์ ๋ฐ๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ ํ์ด์์ต๋๋ค. ์๋ํ๋ฉด ์ ๋ ํ ์ค ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ํ์ด์ฌ ๋ฐ์ ์์๊ณ , ์น๊ณผ ์๋ฒ๋ฅผ ์ค๊ณํ๊ธฐ ์ํด์๋ ๋ฌด์กฐ๊ฑด JS๋ฅผ ํ ์ค ์์์ผ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง ํ์ด์ฌ์ ํ๋ ์์ํฌ ์ค Flask๋ผ๋ ์น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น์ฌ์ด๋ฅผ ๊ตฌ์ถํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ณ , ํ๋ผ์คํฌ์ ํ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐฐ์ด MySQL์ ์ฌ์ฉํ์ฌ FE / BE ๊ฐ ํตํฉ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ๋ก ๊ณํํ์ต๋๋ค.
ํ๋ก์ ํธ ์ํคํ ์ฒ
Member Page๋ ํ์ฌ ์งํํ์ด๋ฏ๋ก ์ถ ํ์ ํฌ์คํ ํ๊ฒ ์ต๋๋ค.
ํ์ ๊ธฐ๋ฅ ๊ณํ ๋ฐ ๋ฐฐํฌ
ํ๋ก์ ํธ๋ฅผ ์์ํ๋ฉด์ ์๊ฐํ ๊ธฐ๋ฅ์ ํฌ๊ฒ ๋ ์นดํ ๊ณ ๋ฆฌ๋ก, ํ์ ๊ด๋ฆฌ๊ธฐ๋ฅ๊ณผ ํ๋ ๊ด๋ฆฌ๊ธฐ๋ฅ์ ๋๋ค. ์ด ๋ ๊ธฐ๋ฅ๋ค์ ์ธ๋ถ์ ์ผ๋ก ๋๋๊ฒ ๋๋ค๋ฉด
ํ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ
- ํ์ ๋ฑ๋ก: ์๋ก์ด ํ์ ์ ๋ณด๋ฅผ DB์ ์ถ๊ฐ
- ํ์ ์กฐํ: ๋ฑ๋ก๋ ๋ชจ๋ ํ์ ๋๋ ํน์ ํ์์ ์ ๋ณด ์กฐํ
- ํ์ ์ ๋ณด ์์ : ํ์์ ์ ๋ณด๋ฅผ ์์
- ํ์ ์ญ์ : ๋ ์ด์ ํ๋ํ์ง ์๊ฑฐ๋ ์ ํ๋น๋ฅผ ๋ด์ง ์์ ํ์ ์ญ์
- ๋ธ๋๋ฆฌ์คํธ ๊ด๋ฆฌ: ํ๋ ์ ์ฒญ ํ ๋ถ์ฐธํ๋ ํ์์ ์กฐํํ์ฌ ๋ค์ ํ๋ ์ฐธ์ฌ๋ฅผ ์ ํ
ํ๋ ๊ด๋ฆฌ ๊ธฐ๋ฅ
- ํ๋ ์ถ๊ฐ: ์๋ก์ด ํ๋์ ๋ฑ๋กํ๊ณ , ํ๋๋ช , ๋ ์ง, ์ฐธ์ฌ ์ธ์ ๋ฑ์ ์ ๋ณด ๋ฑ๋ก
- ํ๋ ์กฐํ: ๋ฑ๋ก๋ ๋ชจ๋ ํ๋ ๋๋ ํน์ ํ๋์ ์ ๋ณด ์กฐํ
- ํ๋ ์์ : ํ๋ ์ ๋ณด ์์
- ํ๋ ์ฐธ์ฌ ํํฉ ์กฐํ: ๊ฐ ํ๋์ ์ฐธ์ฌํ ํ์ ๋ชฉ๋ก ์กฐํ
- ํ๋ ์ฐธ์ฌ ์ฌ๋ถ ์์ : ํ์์ ํ๋ ์ฐธ์ฌ ์ฌ๋ถ ์์ (์ถ์๋ถ ๊ฐ๋ )
- ํ๋ ์ฐธ์ฌ์ ํ ๋ถ๋ฐฐ: ํ๋ ์ฐธ์ฌ์๋ฅผ ํ์ผ๋ก ๋๋๋๋ค. (์ฑ๋ณ ๊ณ ๋ ค ๊ฐ๋ฅ)
๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋นํ๊ฒ ๋ MySQL์ PyMySQL ๋ชจ๋๋ก ์ฐ๊ฒฐํ์ฌ ๊ฐ ๊ธฐ๋ฅ์ ์ํํ๊ฒ๋ ๊ณํํ์ต๋๋ค.
๋์์ธ
๋์์ธ์ Figma ๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ธํ์๊ณ , Plugins ์ค์ ์์ฑ๋ ๋์์ธ์ HTML๊ณผ CSS๋ก ๋ด๋ณด๋ด ์ฃผ๋ ๊ฒ์ด ์์ด ์ด๋ฅผ ์ฌ์ฉํ์ฌ HTML์ ์์ฑํ์์ต๋๋ค. ํ์ง๋ง ์ด๋ ์ ์ฒด์ ์ธ ๋์์ธ์ ํ๋ ์์ ์ถ์ถํด ์ค ๋ฟ, input ํ๊ทธ์ button ํ๊ทธ๋ค์ ์ถ์ถํด์ฃผ์ง ๋ชปํ๊ณ ๋ชจ๋ ๋์์ธ๋ ํญ๋ชฉ๋ค์ div ํ๊ทธ๋ก ์ถ์ถํด ์ค ๋ฟ์ ๋๋ค. ๊ทธ๋ ๊ธฐ์ ์ด๋ฅผ ์๋ง์ ํ๊ทธ๋ก ๋ณํํ๋ ๊ณผ์ ์์ CSS์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ๋ ํ๊ณ ์๊ฐ๋ณด๋ค ๊ฐ๋จํ์ง๋ง์ ์์ ์์ ์ด์์ต๋๋ค.
์์ฑ๋ ๊ด๋ฆฌ์ ํ์ด์ง ๋ชจ์ต
์ด๊ธฐ์ ๊ณํํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐ์๋ ํฌ๊ฒ ๋ฌธ์ ์์ด ์ํํ๊ฒ ์ํํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง ์ ๊ฐ ๊ฐ๊ณผํ๋ ๊ฒ์ด ์์์ผ๋ ๋ฐ๋ก ์น์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ์์ต๋๋ค. ๋ฌด๋ฃ ํธ์คํ ์๋น์ค๋ฅผ ํด์ฃผ๋ ๊ณณ์ ๋ง์ง๋ง Flask๋ฅผ ํธ์คํ ํด์ฃผ๋ ๊ณณ์ ๋ง์ง ์์๊ณ , Flask ๋ฐฐํฌ๋ก ์ ๋ช ํ Heroku๋ ์ ๊ฒฉ ์ ๋ฃํ ์ ์ธ, Ngrok์ ์ฝ๊ฒ ํฐ๋๋ง์ด ๊ฐ๋ฅํ์ง๋ง ๋๋ฉ์ธ ์ฐ๊ฒฐ ์ ์ ๋ฃ, ์ด๋ฏธ ์ฌ์ฉํด ๋ฒ๋ฆฐ AWS 1๋ ๋ฌด๋ฃ ์๋น์ค.. ๊ฒฐ๊ตญ Vercel๋ก ํธ์คํ ํ๊ธฐ๋ก ์ ํํ์ต๋๋ค. ํ์ง๋ง ์ด ๋ํ ์ด๋ ค์ ๋๋ฐ์, Vercel์์๋ Flask๋ฅผ ๊ณต์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค. ํ์ง๋ง ๊ตฌ๊ธ๋ง์ผ๋ก ์ฐพ์๋ธ ๊ฒฐ๊ณผ root dir์ Vercel.json ํ์ผ์ ๋ง๋ค์ด ์ฃผ๋ฉด Vercel ๋ฐฐํฌ ์ ์ด๋ฅผ ์ธ์ํ์ฌ app.py๋ฅผ ์คํ์์ผ ์ค๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
## Vercel.json
{
"version": 2,
"builds": [
{
"src": "app.py",
"use": "@vercel/python"
}
],
"routes": [
{
"src": "/(.*)",
"dest": "/app.py"
}
]
}
## Hearder ์ ์ด์ ๋ชป ๋ฃ๋๋ผ๊ณ ์.. ##
์ด์ ๊ด๋ จํด์ ๊ณต์ ๋ฌธ์๋ ์ดํด๋ณด์์ง๋ง ์ํํ ์ ์ ์ง์์ผ๋ก๋ ์ดํดํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค. ๊ทธ๋์ ์์ ๊ฐ์ด ์ค์ ํด ๋๊ณ ๋ฐฐํฌ๊ฐ ๋๊ธธ๋ ๊ทธ ์ดํ๋ก๋ ๊ฑด๋ค์ง ์๊ณ ์์ต๋๋ค.
Vercel์์ ์น์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ ํ ๋ฌธ์ ๊ฐ ์์๋ ๋์๋ฆฌ ๋ถ์์ ๋ถ์์๊ฒ ๋ถํํ์ฌ ํ ์คํธ๋ฅผ ์งํํ์๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์์ ์ฑ๋ณ์ 0๊ณผ 1๋ก ํด์ ๊ทธ๋๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ '๋จ', '์ฌ'๋ก ๋ฐ์ธ๋ฉํ์ฌ ์ถ๋ ฅํด ๋ฌ๋ผ๋ ๊ฒ์ ๋ถํ๋ฐ์๊ณ , ๊ฐ๋จํ ํผ๋๋ฐฑ์ ์ํ ํ์์ต๋๋ค.
์ดํ ์น์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๊ฒฝํ์ด ๋ง์ ์น๊ตฌ์๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํคํ ์ฒ์ ๋ํ ํผ๋๋ฐฑ์ ๋ฐ๊ธฐ ์ํด ๋น๊ณต๊ฐ ๋ ํฌ์งํ ๋ฆฌ์ ์ด๋ํด ์คฌ์ต๋๋ค. ๋์์ค๋ ๋ง์ "์ฐ์ ์ด๋ป๊ฒ ์ด๋ฐ ์๊ฐ์...!". ๋ฌผ๋ก ์ข์ ๋ป์ด ์๋์์ต๋๋ค.
๋ฌธ์ ์
- FE / BE ํตํฉ์ผ๋ก ์ธํ ์์ ์ฑ ๋ฌธ์
- ๊ธฐ๋ฅ ์ํ๋ง๋ค ์์ฑ๋๋ DB ์ปค์๋ก ์ธํ ์ฑ๋ฅ์ ํ
์ด ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ณ ์ ์ ๋ Flask๋ก REST API๋ฅผ ๊ตฌํํ๊ณ ์ ํ๊ณ , flask_restful ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ api๋ฅผ ๋ฐฐํฌํ๊ณ ์ ํ์ต๋๋ค. ์๊ฐ๋ณด๋ค flask_restful์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ ต์ง ์์๊ณ , ์๋ ์๋ ์ฝ๋๋ค์ ๊ฐ์ ธ์์ api๋ก ๋ถ๋ฆฌ๋ง ํ๋ฉด ๋๋ ์์ ์ด๋ค ๋ณด๋ ๊ตฌ์ถ ์๊ฐ์ ๋ง์ด ๊ฑธ๋ฆฌ์ง ์์์ต๋๋ค. ๋ํ DB์ ์ปค์๋ฌธ์ ๋ ์ปค์๋ฅผ ์ฌํ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๊พธ์ด ์ฑ๋ฅ์ ํ๋ฅผ ํผํด ๊ฐ์ต๋๋ค. ๊ทธ๋ ๊ฒ FE์ BE๊ฐ ๋๋๊ฒ ๋์ ์์ฒญ๋ ์๋์ฐจ์ด๊ฐ ๋ฌ๊ณ , ์ ๋ง์์ ์ค๋ ๊ฒ ํ๊ธฐ์ ์ถฉ๋ถํ์ต๋๋ค.
๊ทธ๋ ๊ฒ ํ์๊ธฐ๋ฅ ๊ฐ๋ฐ์ ๋ง์น๊ณ FE์ BE๊น์ง ๋ถ๋ฆฌํ๊ณ ๋์ ์ด ๊ด๋ฆฌ์ํ์ด์ง๋ฅผ ์ฌ์ฉํ ์์๋ค์ ์ํด 'ํ๋ ์ฐธ์ฌ์ ํ ๋ถ๋ฐฐ'์ ๊ฐ์ ํธ์๊ธฐ๋ฅ ๊ฐ๋ฐ์ ํ๊ธฐ๋ก ๋ง์๋จน์์ต๋๋ค.
ํธ์๊ธฐ๋ฅ ๊ฐ๋ฐ
์ถ๊ฐํ ํธ์๊ธฐ๋ฅ
- ํ์๋ณ ํ๋ ๋ด์ญ ๋ณด๊ณ ์: ํน์ ํ์์ ๋ชจ๋ ํ๋ ๋ด์ญ์ Excel ํ์ผ๋ก ๋ค์ด๋ก๋
- QR ์ฝ๋ ์์ฑ: ๊ฐ ํ๋์ ๋ํ QR ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ฐธ์ฌ ํ์ธ
- ์์ฝ ์์คํ : ํ์๋ค์ด ํ๋์ ๋ฏธ๋ฆฌ ์ฐธ์ฌ๋ฅผ ์์ฝํ ์ ์๋ ๊ธฐ๋ฅ ์ ๊ณต
- ์นด์นด์คํก ์๋ฆผ ๊ธฐ๋ฅ(์ต์ข ๊ด๋ฆฌ์์ฉ): ์๋ก์ด ํ๋ ์ถ๊ฐ, ์ฐธ์ฌ ๋ง๊ฐ ๋ฑ ์ค์ํ ์ด๋ฒคํธ์ ๋ํ ์นด์นด์คํก ์๋ฆผ์ ์ ๊ณต
ํ์๋ณ ํ๋ ๋ด์ญ ๋ณด๊ณ ์๋ ํ์๋ค์ ํ๋ ์๊ฐ ์ธ์ ์๋ฅ๋ฅผ ์์ฑํ ๋ ๊ผญ ํ์ํ ๊ฒ์ ๋๋ค. ์๋๋ ํ๋์ ๋ช ๋จ์ ์ข ์ด๋ก ๋ฝ์์ ๋ณธ์ธ์ ์ด๋ฆ์ ์๋ช ์ ํ๋ ์์ผ๋ก ์ฐธ์ฌ์๋ฅผ ๊ตฌ๋ถํ๊ณ , ์ฐธ์ฌ์๋ค์ ์ฑ๋ช ๊ณผ ๊ฐ์ธ์ ๋ณด๋ฅผ ํ๋์ฉ ์์ ํ์ผ๋ก ์์ฑํ์์ง๋ง DB๋ฅผ ์ฌ์ฉํ๋ ์ง๊ธ์ ์ฐธ์ฌ์๋ค๋ง ์๋์ผ๋ก ์ถ๋ ค ์ ์ถ ํ์์ ๋ง๊ฒ Excel ํ์ผ์ ์์ฑํ๋๋ก ํ์๊ณ , ์ด๋ Openpyxl ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌํํ์์ต๋๋ค.
@app.route('/download-excel/<date>/<id>')
def download_excel(date, id):
response_data = session.get('response_data')
if response_data:
file_path = './form.xlsx'
# ๊ธฐ์กด ํ์ผ ์ด๊ธฐ
workbook = openpyxl.load_workbook(file_path)
# ํน์ ํ(์: 5๋ฒ์งธ ํ)๋ถํฐ ๋ฐ์ดํฐ ์ถ๊ฐ
start_row = 4
add_data_to_excel(workbook, start_row, response_data)
# ์์
ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ๋ฐ์ด๋๋ฆฌ ์คํธ๋ฆผ์ ์ ์ฅ
output = io.BytesIO()
workbook.save(output)
output.seek(0)
session.pop('response_data', None)
# ํ์ผ์ ์๋ต์ผ๋ก ๋ฐํ
return send_file(
output,
as_attachment=True,
download_name=f"{date}_ํ๋๋ช
๋จ.xlsx",
mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
return render_template('404.html')
์ฐธ์ฌ์๋ค์ ๊ด๋ฆฌ์๊ฐ ์ด์ด๋ ์์ฝ ๊ฐ๋ฅ ํ๋์ ์ง์ ์ ํํ์ฌ ์์ฝ์ ํ ์ ์์ต๋๋ค. ๋ํ ํ๋ ์์ ์ ๊ด๋ฆฌ์๊ฐ ํด๋น ๋ ์์ ํ๋ ๋ฒํธ๋ฅผ ํตํด ์์ฑํ QR์ฝ๋๋ฅผ ์ค์บํ์ฌ ํ๋ฒ์ ์ ๋ ฅํจ์ผ๋ก์จ ๋ณธ์ธ์ด ํ๋์ ์ฐธ์ฌํ๋ค๋ ๊ฒ์ ์ธ์ฆํ ์ ์์ต๋๋ค. ๋ฌผ๋ก QR์ฝ๋๋ฅผ ์ค์บํ๊ณ ํ๋ฒ์ ์ ๋ ฅํ ๋ ๋ถ์ ํ์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฐ๋ฅํ ๋ชจ๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์์ต๋๋ค. QR ์ฝ๋ ์์ฑ ์ URL ์ด ํ์ํฉ๋๋ค. ํ์ง๋ง ๊ด๋ฆฌ์ ํ์ด์ง์์ ์์ฑํ์ฌ ๋ฐฐํฌ ์ ๊ด๋ฆฌ์ ํ์ด์ง์ ๋๋ฉ์ธ ์ฃผ์ ๋ ธ์ถ์ ์ฐ๋ ค๊ฐ ์์์ผ๋ก QR์ฝ๋ ์์ฑ์ ์ํ Vercel App์ ํ๋ ๋ ๋ง๋ค์์ต๋๋ค. QR์ฝ๋ ์์ฑ์ qrcode ๋ชจ๋๋ก ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
๊ด๋ฆฌ์ ํ์ด์ง์์ ํ๋์ ์์ฑํ๊ฑฐ๋, ํ์์ด ํ์๊ฐ์ ์ ํ๊ฑฐ๋, ํ๋ ์์ฝ์ ์คํํ ๋ ๋ฑ ๊ด๋ฆฌ์ ํ์ด์ง์์ ์ผ์ด๋๋ ๋ชจ๋ ํ์๋ ๊ทธ ๋ฐ์ดํฐ์ ํจ๊ป ์ต์ข ๊ด๋ฆฌ์(๋์๋ฆฌ์ฅ)์ ์นด์นด์คํก์ผ๋ก ์ ์ก๋๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค. ์ฒ์์๋ ์นด์นด์คํก ์ฑ๋์ ์์ฑํ์ฌ ๋ชจ๋ ์์๋ค์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ฒ ํ๋๋ก ๊ตฌ์ฑํ๋ ค ํ์ง๋ง, ์นด์นด์คํก ์ฑ๋ ๋ฉ์์ง ์ ์ก ๋ฌด๋ฃ ํ์๊ฐ ์์ด์ง์ ๋ฐ๋ผ KakaoTalk Develops์์ ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ ํ REST API๋ฅผ ๋ฐ๊ธ๋ฐ์ '๋์๊ฒ ๋ณด๋ด๊ธฐ' ๊ธฐ๋ฅ์ผ๋ก๋ง ์นด์นด์คํก ๋ฉ์์ง๋ฅผ ์ ์ก๋ฐ๊ฒ ํด ๋์์ต๋๋ค.
+ ์ถ๊ฐ์ ์ผ๋ก ๊ด๋ฆฌ์ ํ์ด์ง์ URL์ด ๋ ธ์ถ๋์ด๋ ๋ฌด๋จ์ผ๋ก ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค. ๋จผ์ ๊ด๋ฆฌ์ ํ์ด์ง์ ์ ๊ทผํ๋ ค๋ฉด ์์์ด์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด DB์์ ํ์๋ค์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๊ฐ ์ ์ฅ๋์ด ์๋ ํ ์ด๋ธ์์ ์์๋ค๋ง ๋นผ์ ๋ทฐ๋ฅผ ๋ง๋ค์๊ณ , ์ด๋ฅผ ์ฐธ์กฐํ์ฌ ์ผ๋ฐ ํ์๋ค์ ๋ก๊ทธ์ธ ์๋ ์ ๋ณธ์ธ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์๋ง๊ฒ ์ ๋ ฅํด๋ ๋ก๊ทธ์ธ์ด ๊ฑฐ๋ถ๋๋๋ก ๋ง๋ค์์ต๋๋ค.
+ API์ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ํด Flask์ Blueprint๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌ์ ํ์ด์ง์ ํ์ ํ์ด์ง์์ ์ฐ๋ API๋ฅผ ๋ถ๋ฆฌ์์ผ ๋จ์ต๋๋ค. ์ด๋ ๊ฒ ๋ถ๋ฆฌ์์ผ ๋์ผ๋ API์ ํ์๊ด๋ฆฌ ๋ํ ์ฌ์์ง๋ ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
+ BE๋ฅผ ์ง์ธ์ AWS ์์ด๋๋ฅผ ๋น๋ ค EC2์ ๊ตฌ์ถํ์์ต๋๋ค.
์ฌ์ง ์ถ์ฒ
Flask : https://justkode.tistory.com/10
MySQL : https://velog.io/@leo3179/MySQL-%EB%A6%AC%EB%B7%B0
Vercel : https://www.hatimeria.com/services/vercel
Flask-RESTful API : https://ubeezy.netlify.app/flask-rest-api/
Openpyxl : https://hogelog.com/python/openpyxl-excel-chart-1.html
qrcode : https://www.geeksforgeeks.org/python-generate-qr-code-using-pyqrcode-module/
kakao developers : https://developers.kakao.com/tool/resource/developers
'๐๐ปโโ๏ธ HB > ๐ป Projects' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ตฌ๊ฐํจ๋ฆญ๋ํ๊ต ํ์ฌ๊ณต์ง ๋์ค์ฝ๋ ๋ด (0) | 2024.03.15 |
---|