Gallery
Search
1. ๋๋์
3์ผ์ด๋ผ๋ ๊ธฐ๊ฐ์ ํผ์๋ ์๋ ๋ชจ๋ ์ค๋ ฅ์ด ๋ถ์กฑํ ํ์ผ๋ก ์งํํ์ง๋ง ๋ฑ ๊ณํํ๋๋ก ์์ฑํด์ ๊ธฐํ ๋จ๊ณ์์ ๊ทธ๋๋ง ์ผํ ๋ฒ์๋ฅผ ์ ์ ํ๊ฒ ๊ฐ์๋ค. ๋ด ๊ฐ๋ฐ ํ๊ฒฝ์์ ๊ฐ์๊ธฐ ์๋ฌ๊ฐ ๋ฐ์ํด์ ๋ฐํ ๋น์ผ ์๋ฒฝ 5์๊น์ง ์์
ํ๊ณ 3์๊ฐ๋ง ์๊ณ ๋ฐ๋ก ๋ ์ถ๊ฐ ์์
์ ํ๋ค. ๋ดย ๋ก๊ทธ์ธ ๋ฐ ๋ก๊ทธ์์ ๊ธฐ๋ฅ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ํ์๋ค์ ๊ธฐ๋ฅ์๋ ์ํฅ์ ๋ฏธ์น๋ ์ํฉ์ด์๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ์ค๋ฅ๋ฅผ ํด๊ฒฐํ์ด์ผ ํ๊ณ ์ ์ ์ ์๊ฐ ์์๋ค. ์ฐ์ฌ๊ณก์ ๋์ ๋ง๋ฌด๋ฆฌํด์ ๊ธฐ๋ถ์ ์ข๋ค.
๋ํ์ฌ Java๊ฐ ์๋ Python์ Flask Framework๋ฅผ ๋ง๋ณธ๊ฒ๋ง์ผ๋ก ์ ๋ฐ์ ์ธ ํ๋ก์ ํธ์ ํ๋ฆ์ ๋น ๋ฅด๊ฒ ์ตํ ์ ์์๋ ๊ฒ์ด ํฐ ๋์์ด ๋์๋ค. ์ด์ ์ Java๋ก ๋ฐ๋ก ํ๋ก์ ํธ๋ฅผ ๋ค์ด๊ฐ๋ ์กฐ๊ธ ์ดํด๋๊ฐ ๋ถ์กฑํ ์๋ฆฌ๊น๋ฆฌํ ์ํฉ์์ ํ๋ก์ ํธ๊น์ง ๋ค์ด๊ฐ๋ ๋ฒ๊ฑฐ์ด ๋๋์ด ์์๋ค. ์ด๋ฒ Python ๊ณผ์ ์ ํตํด์ ๊ฐ๋ตํ๊ฒ ํ๋ก์ ํธ์์ ํ๋ฆ๋ค์ ์ฝ๊ธฐ ํธํ๊ณ , ์์ผ๋ก๋ ์กฐ๊ธ ์ฌ์ด ํ
์คํธ๋ค์ Python์ผ๋ก ์งํํด๋ ๋๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋งํผ ์ดํดํ๊ธฐ ์ฌ์ ๊ณ ๋น ๋ฅด๊ฒ ์งํํ ์ ์๋ ์ธ์ด์๋ค.ย ์์ผ๋ก Java๋ก ์ง์คํ๊ธด ํ๊ฒ ์ง๋ง ๊ฐ๋จํ ๋ฏธ๋ ํ๋ก์ ํธ๋ ํ
์คํธ๋ฅผ ์ํด์ Python์ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค.ย ๋ํ ๋ฉํ ๋ง์ ํตํด์ TypeScript, Nest.JS, Kotlin, RedisDB ๋ฑ ํธ๋ ๋๋ฉด์ ๋ด๊ฐ ์ฃผ๋ ฅ์ผ๋ก ๋ฐฐ์ฐ๊ณ ์ถ์ Java์ RDBMS์ ์กฐ๊ธ ๊ฐ๊น์ด ์น์ฒ๋ค์ ์๊ฒ ๋์๋ค.ย ํ๋๋ง ๊น๊ฒ ํ ๊ฐ๋ฐ์๋ ๊ธ๋ฐฉ ๋ค๋ฅธ ์ธ์ด์ ์ ์ํ๋ค๊ณ ํ๋๋ฐ ๊ทธ ๋ค๋ฅธ ์ธ์ด๋ค์ด ๋ฌด์์ธ์ง ๊ด์ฌ์ ๊ฐ์ง๊ฒ ๋์๋ค.ย ์ด๋ด์๋ก ๋์ฑ Java ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ ๋ค์ง๊ณ ์ถ๋ค๋ ์๊ฐ์ ํ๊ฒ ๋์๋ค. ๋๋ ์ ๋ฐ ํธ๋ ๋์๋ ํ์น ํ ์ ์๋ ๊ธฐ๋ณธ ์ค๋ ฅ์ ์ ๊ฐ์ถ๊ณ ์ถ๋ค.
๋ํ ์ด๋ฒ ํ๋ก์ ํธ๋ MongoDB๋ฅผ ์ฌ์ฉํ๊ณ ๋ก์ปฌ์ด ์๋ Atlas Cloudํ๊ฒฝ์์ ์ฌ์ฉํ๋ค. Cloud ํ๊ฒฝ์ ํตํด ์์ ํ๋ก์ ํธ๋ ๋ก์ปฌ์์ ์งํํ๋๊ฒ ์ผ๋ง๋ ์ดํด๋๊ฐ ๋ถ์กฑํ์๋์ง ๋ผ์ ๋ฆฌ๊ฒ ๋๊ผ๋ค. ๋ํ Oracle์ด ์๋ MongoDB๋ก No-SQL์ ํธ๋ฆฌํจ์ ํ์คํ๊ฒ ๋๊ผ๊ณ , ์์ง ๋๊ท๋ชจ ํธ๋ํฝ, ๋๋์ ํ์ผ ๋ฑ์ ๋ค๋ค๋ณด์ง๋ ์์์ ๊ทธ๋ฐ์ง ๊ด๊ณํ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ ์ ์ด๋ผ๋ ๊ฒ์ด ์ด๋ค ๋ถ๋ถ์์ ๊ทธ๋ฐ์ง ์์ง ์ฒด๊ฐ๋์ง๋ ์๊ณ ์์ง๋ง ์ผ๋จ SQL๋ฌธ์์ type์ ์์ฐ๋ ๋ด๊ฐ ์ข ์ด์ํ๊ฒ ๋๊ปด์ก์๋ค. ๊ทธ๋งํผ ํธํ๊ธฐ๋ ํ๋ค. ๋ํด์ MySQL์ ํตํด์ RDBMS์ ์์ถ์ธ Oracle, MySQL์ ์ด๋์ ๋ ์ฐพ์๋ณด๋ฉด์ ๋ค๋ฃฐ ์ ์์ ์ ๋๋ก ์ต์ํด์ง๊ณ ์๋ค. ์ข ๋ ์๋ฌ๋๊ธฐ ์ํด์๋ ๊พธ์คํ ๋ฐฑ์ค์ด๋ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ๋ฅผ ํ์ด๋๊ฐ์ผ๊ฒ ๋ค. ๋จ์ํ ์ฝ๋ฉ ํ
์คํธ๋ฅผ ์ํจ์ด ์๋๋ผ ์ค์ ๋ก ๋ด๊ฐ ํ์ํ ๋ฌธ์ฅ๋ค์ ์ฐ์ตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ ๊พธ์คํ ํด๋ด์ผ๊ฒ ๋ค. ์ฌ๊ธฐ์ ๋ ๋์๊ฐ Redis๊ฐ์ DB๋ ๋์ค์ ์ค์ค๋ก ๊ณต๋ถํด๋ณผ ์๊ฐ์ด ์๋ค. ๋ง์ ๊ธฐ์
๋ค์ด ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๊ณ ํนํ TOSS๊ฐ์ ์ฑ์ฅ์ธ๋ฅผ ๊ฐ์ง ๊ธฐ์
์ด ์ ๊ทนํ์ฉํ๋คํด์ ๊ด์ฌ์ ๊ฐ๊ณ ์๋ค. ์์ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋ ๋ค์ง๊ณ ์์ฉํ ์์๋ ์ฌ๋์ด ๋์ด์ผ ํ๋ค.
๋ฐฐํฌ๋ฅผ ํตํด์ AWS EB๋ก ๋ฐฐํฌํ๊ธฐ, Docker๋ก ๋ฐฐํฌํ๊ธฐ, Github๋ก ๋ฐฐํฌํ๊ธฐ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ ์๋ํด์ ๋ญ๊ฐ ์์ง ์ ํํ ๋ํ
์ผ ๊ฐ๋
๊น์ง๋ ์ถฉ๋ถํ ์ดํด๋์ง ์์์ง๋ง ํนํ ๋ด๊ฐ ์ง์ NAS๋ก ๋ฐฐํฌํ๋ฉด์ ์ด๊ฒ ์ ๊ฒ ์ฐพ์๋ณด๋ค๋ณด๋ ์ด๋์ ๋ ํฐ ํ๋ฆ์ ๋๋ ์ก์ ๊ฒ ๊ฐ๋ค. ์ด์ HTTP, ํต์ , DNS, DDNS, PORT ๋ฑ ์์ง ๊ธฐ์ด์ ์ผ๋ก ๋ถ์กฑํ ์ด๋ก ๋ค์ด ๋ง๋ค. ์๋ฌดํผ ์ด๊ฒ ์กฐ์ฐจ๋ ๋ฐฐํฌ๋ผ๋๊ฒ์ ํด๋ณด๋ฉด์ ์ด๋ฐ ์ด๋ก ์ด ํ์ํ๋ค๊ณ ๋๊ผ๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ์ตํ์ผ ๋ ๊ธฐ๋ณธ ์์์ด๋ผ๊ณ ์๊ฐ๋์๋ค.
๋ฐํ ๋ํ ๋๋ฌด ๋ง์ ์์ ์ค๋ช
ํ๋ คํ๋ค. ๋ฐํ๋ฅผ ๋๋ด๊ณ ์์ฐจ์ถ์๋ค. ๋ฐํ๋ ๋ฌด์ ํ๋์ง ์ ๋ณด์ด๋ ๊ฒ ๋ณด๋ค ์ด๋ค ๋ฌธ์ ๋ค์ ๋ง๋ฌ๊ณ , ํธ๋ฌ๋ธ์ํ
๊ณผ์ ์ ์ค๋ช
ํ๋ ๊ฒ์ ๋ง์ ๋ถ๋์ ๋ฃ์์ด์ผ ํ๋ค. ๊ธฐ๋ฅ์ ๊ฑฐ๊ธฐ์ ๊ฑฐ๊ธฐ์ผ๊ฑฐ๋ค. ๋๋ ์ถ์ ์์ ์๋๋ฅผ ๋ ํ์
ํ์ง ๋ชปํ๊ณ , ๊ทธ์ ์ฌ์
๊ณํ์๋ฅผ ๋ฐํํ๋ ๊ฒ ์ฒ๋ผ ๊ธฐ๋ฅ์ ํ๋ ค๊ณ ์ค๋ช
ํ๊ณ ์์๋ค. ์ง๊ธ์ ๋ง๋ฌ๋ ์์ ๊ฐ์ ์ด๋ ค์ด์ ๋ค์ ๋ํด์ ๋ถ์กฑํ๋๊ฒ, ์์ฌ์ ๋๊ฒ, ํด๊ฒฐํ๋๊ฒ, ํด๊ฒฐํ๋ ๊ณผ์ ๋ฑ์ ๋ฐํํ์ด์ผ ๋ง์๋ค. ๋ค์ ๋ฐํ๋ค์ ์ด๋ฐ ๋ถ๋ถ๋ค์ ์๊ฐํด์ ๋ถ๋์ ์กฐ์ ํ๊ณ ํด์ผ๊ฒ ๋ค. ์ฌ์ค 4์ ๋ฐํ์ธ๋ฐ 3์ 30๋ถ์ ๋๋ฌ๊ณ ๋ฐํ์ ๋ํ ์ค๋น๊ฐ ๋ฏธํกํ๋ ์ ๋, ๋ด๊ฐ ์ผ์ ๊ด๋ฆฌ์ ๋ฏธํกํ๋ ๊ฒ์ด๊ณ , ํธ๋ฌ๋ธ ์ํ
์ ๋๋ฌด ์ค๋ํ๋ ๋ฌธ์ ๊ฐ ์๋ค. ๋ํ CSS๋ฅผ ๊ฐ๋ตํ๊ฒ ํ
๋ง๋ฅผ ์ฌ์ฉํ์ด์ผ ํ๋๋ฐ ์ ์์ง๋ ๋ชปํ๋ ํ๋ก ํธ๋จ์ ์ค๋ ๊ฑด๋ค์๋ ๊ฒ์ด ๋ด ์ค์ผ์ฅด์ ๋ง๊ฐํธ๋ฆฐ๊ฒ ๊ฐ๋ค. ๋ค์๋ถํด ์ด๋ฐ ๋ฌธ์ ๋ค์ด ๋ฐ์ ํ ์ ์์ผ๋ ๊ณํ ๋ถ๋ถ์์๋ถํฐ ์๊ฐํด์ผ๊ฒ ๋ค.
2. ์์ฐ ์์
์ด์ ์ ์์ ํธ์ง์ ํด๋ดค๊ธฐ ๋๋ฌธ์ ์์ฝ๊ฒ Premire๋ฅผ ์ด์ฉํด์ ์ ๋นํ ๋ง๋ค์๋ค. ๊ทธ๋๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ค ๋ณด์ฌ์ฃผ์๊ธฐ ์ด์ ๋๋ก ๋ง์กฑํด์ผ ํ๋ค.
3. Notion ํ๋ก์ ํธ ์๊ฐ ํ์ด์ง ๋ฐฐํฌ
Notion์ ๊ฐ์ธ ๊ฒฐ์ ํ๊ณ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์์ํ๋ค. ๋๋ฌด ํจ์จ์ ์ผ๋ก ๋์ ๊ธฐ๋ก์ ๊ด๋ฆฌ ํ ์ ์๋ค. ๋ถ๊ฐ ๊ธฐ๋ฅ๋ค์ด ๋๋ฌด ํธ๋ฆฌํ๋ค. ์ด ๋ธ๋ก๊ทธ๋ ์ด ๊ธ์ ๋ง์ง๋ง์ผ๋ก ์ง์ ์ ์ผ๋ก ๊ธ์ ์
๋ก๋ ํ์ง๋ ์์ ๊ฒ์ด๋ค. Notion ์ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ๊ฒ์ด๋ค
[Flask] Team Project(GameInsight) 05 ํ๋ก์ ํธ ์๋ฃ ๋ฐ ๋ฐํ ํ๊ธฐ
ํ๋ก์ ํธ๋ฅผ ์ด์ ์ข ๋ฃํ๊ณ , ์์ฌ์ด ๋ถ๋ถ๋ ๋ง์ด ๋จ์์๋ค.
์ ๋ ๋ฐค์ ์ค๋ฅ์์ ์ธ์๋๋ฌธ์ ์ ์ ๋ชป์์ ์ค๋ ์์นจ๋ถํฐ ํ๊ณ ๋ฅผ ์์ฑํ๊ณ ์ ํ๋ค. ํ ํ๋ก์ ํธ๋ ์ข
๋ฃ๋์์ง๋ง, ๋๋ฌด ์์ฌ์ด ๋ถ๋ถ์ด ๋ง๋ค. ๋ ํ๊ณ ์ถ๋ค. ์ด๋๋ก ๋ณด๋ด์ฃผ๊ธฐ๊ฐ ์ซ๋ค. ๋๋ฌด ๊ธฐ๊ฐ์ด ์งง์๋ค. ํ์ง๋ง ๋ค์ ํ๋ก์ ํธ์์ ์ด ํ๊ณ ๋ค์ ์ฐธ๊ณ ํ๊ณ ๋์ฑ ๋ฐ์ ๋ ์์ฑ๋ ๋์ ํ๋ก์ ํธ๋ฅผ ์๋ฃํ๊ณ ์ถ๋ค. ๋ฌด์กฐ๊ฑด ๊ทธ๋์ผ ํ๋ค.
์ฐ์ ๋ด๊ฐ ๋งก์ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฝ ํ ์ ์๋ค.
โข
์ ์ฒด์ ์ธ ํ๋ก์ ํธ์ ์์ด๋์ด ๊ตฌ์ฒดํ, ์๋น์ค ๊ธฐํ
โฆ
ํ์๊ณผ ํ์๋ฅผ ํตํด ๋์จ ์์ด๋์ด๋ก ๋ถํฐ ์๋น์ค ๋ ํผ๋ฐ์ค ํ์ ๋ฐ ๊ธฐ๋ฅ ์ ์
โฆ
์ผ์ ย ๋ฐย ๊ธฐ์ดย ์ปจ๋ฒค์
,ย ๊ทธ๋ผ์ด๋ย ๋ฃฐย ์ง์ ย ๋ฐย ๊ณต์ง
โฆ
๋ก๋๋งต ์์ฑ์ ์๋ตํ์ง๋ง ๊ฐ๋ตํ ์ํจ ์ผ์ ์ ๋ํ ๊ณต์ง(์งง์ ๊ธฐ๊ฐ์ด๊ธฐ์ย ์๊ฐ์ฌ์ ์์)
โข
ํ๋ก ํธ์๋ ๋ถ๋ถ์ ๋ด๋น
โฆ
HTML ํ์ค ๋ ์ด์์ ๊ตฌ์ฑ(Header-Nav-Content(Section-Aside)-Footer ํํ)
โฆ
๋ถํธ์คํธ๋ฉ ํ์ฉํ์ฌ ์๊ฐ ๋๋น ๋น ๋ฅด๊ฒ ๋์์ธ ๊ตฌ์ฑ์ ์์ฑํ๊ณ ๊ธฐ๋ฅ ๊ตฌํ์ ์ง์ค ํ ์ ์๋๋ก ์ ๋
โข
Github ์๊ฒฉ ์ ์ฅ์๋ฅผ ์ด์ฉํ ํ์ ๊ด๋ฆฌ๋ฅผ ํ์์๊ฒ ์๊ฐ ๋ฐ ํ์ ๊ด๋ฆฌ ๋ง์คํฐ ์ญํ
โฆ
Git๊ณผ Github ์ ๋ํ ์ค์ ๊ณผ ํ์๋ค์๊ฒ ์ง์ํ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
โช
ํ์๋ค์๊ฒ ๊ธฐ์ด์ ์ธ Git ์ง์์ด๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ธ์งํ๊ณ ์๋์ง ํ์
โช
์ดํด๋๋ฅผ ํ์ธํ๊ธฐ ์ํ์ฌ ํ
์คํธ์ฉ ์๊ฒฉ ์ ์ฅ์๋ฅผ ์์ฑ, ๋ก์ปฌ๊ณผ ์ฐ๊ฒฐ ์์ผ๋์์ผ๋ฉฐ
โช
ํ์๋ค์๊ฒ ํ
์คํธ ์๊ฒฉ ์ ์ฅ์์ "Push"ํด์ "Merge"์์ฒญํ๊ธฐ๋ฅผ ์ง์
โช
Pull-Request ์์ฑ๊ณผ Master๋ฅผ ๊ด๋ฆฌํ๋ ๋์ Pull-Request ์์ฒญ์ ํ์๊ณผ์ ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ ๋ณํฉ ํ ํ
์คํธ ํ์ธ
โช
์ค์ ํ๋ก์ ํธ ์งํ ํ ๋ก์ปฌ Master ์ ์ฅ์ ์์ฑ ๋ฐ ์๊ฒฉ ์ ์ฅ์ ์์ฑ ๋ฐ ์ฐ๊ฒฐ ํ
โช
๊ธฐ์ด ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ ๋ฒ์ ์์ฑ(์ด๊ธฐ ํ๊ฒฝ ์ค์ , README, ๊ธฐ์ด dependency ์ํฌํธ ๋ฌธ ์์ฑ, ๊ธฐ์ด flask ์ด๋์๋ถ๋ถ ์์ฑ
โช
ํ์ Collaborator ์ด๋
โช
์ ๊ธฐ์ด ๋ฐฐํฌ ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ ๋ฒ์ ์ ํ์๋ค์๊ฒ ํด๋ก ๋ฐ Branch ์์ฑ ์ง์
โช
๋ ๋ํ Master ๋ณดํธ๋ฅผ ์ํ์ฌ ์์
Branch ์์ฑ
โช
์ดํ ๊ฐ์ธ ๊ธฐ๋ฅ ๊ตฌํ ์์น ์ค๋ช
, ๊ณตํต ๋ถ๋ถ์ ๋ํ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ๋ํ ์์ธ๊ณผ ์ด์ , ๊ทธ๋ฆฌ๊ณ ์์
์์ ์ ์ํด์ผ ํ ๋ถ๋ถ๋ค์ ๊ณต์ง
โช
๊ฐ์ธ ์์
์์
โช
๊ฐ์ธ ์์
์๋ฃ ํ Commit Message ์์ฑ ์๋ น(์ปจ๋ฒค์
) ํต์ผ์ ํ์์ฑ๊ณผ git log -oneline์ผ๋ก ๋ณด์ฌ์ง๋ ํ๋ฉด ์ค๋ช
โช
๊ธฐ๋ฅ ๊ตฌํ ์๋ฃ ํ ํ๋ก์ ํธ ๋ณํฉ๊ณผ ์ถฉ๋ ๊ณผ์ ์ ๋ํ ์ฝ๋ ๋ฆฌ๋ทฐ, ๊ธฐํ ๋ก์ง์ ๋ํ ์ปค๋ฎค๋์ผ์ด์
์งํ, ๋ณํฉ ์ถฉ๋ ๋ถ๋ถ ํด๊ฒฐ
โช
1์ฐจ ์ต์ข
๋ฒ์ ๋ณํฉ ํ AWS EB๋ฐฐํฌ
์์ด๋์ด ํ์ ์๊ฐ ์ดํ ๊ณง๋ฐ๋ก ๋ด๊ฐ ๋จผ์ ๊บผ๋ธ ์ด์ผ๊ธฐ๋ ์ด๊ฒ์ด๋ค.
โ๊นํ๋ธ ์ฌ์ฉํด๋ณด์ ๋ถ? Push๋ฅผ ํด๋ณด์ ๋ถ?โ
ํนํ Git, Github ํ์ฉ ๊ณผ์ ์ ํ์
์์ ํ์์ ์ด์๊ธฐ ๋๋ฌธ์ย ์ฐธ์ฌ๋ฅผ ํ๊ณ ์ํ๊ณ ๋ฅผ ๋ ๋์ ํ์๋ค์ ํผ๋๋ฐฑ์ด ํ์ํ๋ค. ๋ฐฑ์
์ฉ์ผ๋ก๋ง ๋ก์ปฌ์์๋ง ์ฌ์ฉํด๋ณธ ์ฌ๋๋ ์๊ธฐ ๋๋ฌธ์ Push๊น์ง ํด๋ณธ ๊ฒฝํ์ด ์์ด์ผ ์ ํํ๊ฒ ํ๋จ ํ ์ ์์๋ค.
์ฌ์ฉํด๋ณด์ง ๋ชปํ ํ์๋ค์ด ์์๊ธฐ ๋๋ฌธ์ ํ์๋ค์๊ฒ ์ฝ๊ฒ ์ดํด์ํค๋ ค๊ณ ๋ํ ๋น ๋ฅด๊ฒ ์ดํด์ํค๋ ค๊ณ ๋
ธ๋ ฅํ๋ค. ๋ถ๋ช
ํ ์
๋ฌธ ์ฌ์ฉ๋ฒ์ ์๋ ค ์ฃผ๋๋ผ๋ ์ ์ด๋ ๊ฒ ํ์ง๋ผ๋ ๋ฌผ์์ด ์๊ธธ ๋ถ๋ถ์ ๋ํด์ ์ค๋ช
ํด์ฃผ์๋ค.
1. ํ๋ก ํธ์๋ ์ ์ฅ์์์ ์์ฌ์ด ๋ถ๋ถ
๊ธฐ์ด์ ์ธ CSS์ ๋ถํธ์คํธ๋ฉ์ ์ฌ์ฉํ๋ค.
[Flask] Team Project(GameInsight) 03 ์ ๋ฐ์ ์ธ ํ๋ก์ ํธ ๊ด๋ฆฌ์ ๋ํ ํ๊ณ , ์์ฌ์ด์
๊ธฐ๋ฅ ๊ตฌํ ๊ธฐ๋ฅ๋ค ๋์ด๋ณด๋ค๋ ๊ธฐ๋ฅ ๊ตฌํ์์ ๋ฐ์ํ ์ค๋ฅ์ ์๋กญ๊ฒ ์๊ฒ๋ ๋ถ๋ถ์ ๋ํด์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
1. ๋ชจ๋ํ ๋ฏธํก์ ๋ํ ์์ฌ์
์ฐ์ app.py๊ฐ ์ ์ ์๋ค.
4๋ช
์ด ์์ฑํ ๊ธฐ๋ฅ์ด ๋ชจ๋ app.py์์์ route๋ฅผ ํตํด ๋งตํ๋์ด ์๋ค. ๋ณด๊ธฐ ์ ์ ์ด์๊ณ ์ฐพ๋๋ฐ๋, ๋ณด์ํ๋๋ฐ๋ ์ค๋๊ฑธ๋ฆฐ๋ค. ์ฃผ์์ผ๋ก ๋์ฒดํ๋ คํ์ง๋ง ์๊ฐ๋ณด๋ค ๋ง์ ์ฝ๋๋ค์ด ์ฌ์ฉ๋๋ฉด์ ์์ธ์ฑ์ด ์ข์ง ์์๋ค. ์ด๊ฒ๊ณผ ๊ด๋ จ๋์ ์ ๋ฒ์ ํ๋ฒ ์ฐพ์๋ ๊ธฐ๋ฅ์ธ ๋ธ๋ฃจํ๋ฆฐํธ ๊ฐ์ฒด ํ์ฉํ๋ ๊ฒ์ด ์์๋๋ฐ, ๊ธฐํ ๊ณผ์ ์์ ์ด ๋ถ๋ถ์ ์๊ณ ์์ํด์ ์์ฝ๊ฒ๋ ๋ชจ๋ํ ํ์ง ๋ชปํ๋ค. flask์์๋ blueprint๋ฅผ ํตํด ๊ฐ์ฒดํ ์ํค๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณด์ฌ์ง๋ค. ๋ค์ ํ๋ก์ ํธ์์๋ spring์ผ๋ก ๊ฐ์ฒดํ ์ํค๋ ๊ฒ ์์ฃผ๋ก ์งํํ๊ฒ ์ง๋ง, flask๋ ์ถฉ๋ถํ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ธ์งํ๊ณ flask ํ๋ก์ ํธ์์๋ ๋ชจ๋ํ๋ฅผ ์ ์ฉ์์ผ๋ด์ผ๊ฒ ๋ค ์๊ฐํ๋ค.
์ด ๋ถ๋ถ์ ๋ํด์ ์ ์ฉ๋ ์์ ๋ฅผ ์ฐพ์๋ดค๋ค. ์ฐ์ ์ ์ผ๋ก ํ๋ก์ ํธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
.
|ใ
ก main
|ใ
ก templates
|ใ
ก*.html ํ์ผ๋ค
|ใ
ก __init__.py
|ใ
ก board.py
|ใ
ก member.py
|ใ
ก run.py
run.py
์์๋ main ํด๋์์ app ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ ์คํ๋ง ํ๋ ์ญํ ์ ํ๋ค.
main ํด๋์ย __init__.pyย ์ฝ๋์์ app ๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ณ ๊ฐ์ข
๋ชจ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ธ๋ฃจํ๋ฆฐํธ ๋ฑ ๊ฐ์ ์ค์ ํ๋ค.
board.py๋ ๊ฒ์ํ์ ๋ด์ฉ์ ๋ณด๊ณ , ๊ธ์ ์ฐ๊ณ , ๊ธ ๋ชฉ๋ก์ ํ์ธํ๊ณ , ์์ ํ๊ณ , ์ญ์ ํ๋ ๋ฑ ๊ฒ์ํ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ง ์์ฑํ๋ค. main์์ import *๋ก ๋ชจ๋ ๊ฒ์ ๋ถ๋ฌ์๊ธฐ ๋๋ฌธ์ app ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋์ด __init__.py์์ ์ด๊ธฐ๊ธฐํํ ๊ฐ๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋ค. /board/[๋ผ์ฐํ
๊ฒฝ๋ก]๋ก ์ด๋ํ๋ฉด ๊ฐ ๊ธฐ๋ฅ์ด ์ํ๋๋ค. /board/view๋ก ๊ฐ๋ฉด ๊ธ์ ๋ด์ฉ์ ํ์ธํ๋ค.
[Flask] Team Project(GameInsight) 04 ๊ธฐ๋ฅ ๊ตฌํ์ ๋ฐ์ํ ๋ฌธ์ ์ ํธ๋ฌ๋ธ์ํ
ํ๊ณ , ์์ฌ์ด์
Login ๊ด๋ จ ๊ธฐ๋ฅ ์ค ์๋ฌ ํด๊ฒฐ
์์ง app.py์ API๋ฅผ ์์ฑํ๊ณ ์๋ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
AssertionError: View function mapping is overwriting an existing endpoint function: login
๊ฒ์์ ํตํด์ ํ์ธํ๋ ํ๋์ ํ์ผ์ ๋์ผํ ํจ์๊ฐ ๋๊ฐ ์ ์ธ ๋ ๊ฒฝ์ฐ ๋ฐ์ ํ ์ ์๋ค๊ณ ํ๋ค.
1. ์ฝ๋ ์ดํด๋ณด๊ธฐ
๋ผ์ฐํธ์ ์ค๋ณต๋ URL๋ก ๋ณด๋ด๋ ๊ฒ์ด ์๋์ง ํ์ธํด๋ณด์๋ค.
# ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ# Flask Framework# viewํ์ด์ง ๋ ๋๋ง์ ์ํ render_template ๋ฉ์๋# ์์ฒญ ๋ฐ์ดํฐ์ ์ ๊ทผ ํ ์ ์๋ flask.request ๋ชจ๋# dictionary๋ฅผ jsonํ์์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ผ ์ ์๋ jsonify ๋ฉ์๋from flask import Flask, render_template, request, jsonify
app = Flask(__name__)
# MongoDB์ฌ์ฉ์ ์ํ pymongo์ certifi ์ํฌํธ# MongoDB(Atlas Cloud)๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ pymongo ์ํฌํธfrom pymongo import MongoClient
import certifi
# DB ์ปค๋ฅ์
๊ตฌ์ฑ
ca = certifi.where()
client = MongoClient('mongodb+srv://ohnyong:test@cluster0.lu7mz8j.mongodb.net/?retryWrites=true&w=majority',tlsCAFile=ca)
db = client.gameinsight
# ์น ํฌ๋กค๋ง์ ์ํ ์ํฌํธimport requests
from bs4 import BeautifulSoup
# ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์
๋ถ๋ถ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ ์ถ๊ฐfrom flask import session, redirect, url_for;
# ๋น๋ฐ๋ฒํธ ์ํธํ๋ฅผ ์ํ Hashlib ์ฌ์ฉ# JWT ํจํค์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค. (์ค์นํด์ผํ ํจํค์ง ์ด๋ฆ: PyJWT)import jwt
# ํ ํฐ์ ๋ง๋ฃ์๊ฐ์ ์ค์ผํ๊ธฐ ๋๋ฌธ์, datetime ๋ชจ๋๋ ์ฌ์ฉํฉ๋๋ค.import datetime
# ํ์๊ฐ์
์์, ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํํ์ฌ DB์ ์ ์ฅํด๋๋ ๊ฒ ์ข์ต๋๋ค.# ๊ทธ๋ ์ง ์์ผ๋ฉด, ๊ฐ๋ฐ์(=๋)๊ฐ ํ์๋ค์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณผ ์ ์์ผ๋๊น์.^^;import hashlib
# JWT ํ ํฐ์ ๋ง๋ค ๋ ํ์ํ ๋น๋ฐ๋ฌธ์์ด์
๋๋ค. ์๋ฌด๊ฑฐ๋ ์
๋ ฅํด๋ ๊ด์ฐฎ์ต๋๋ค.# ์ด ๋ฌธ์์ด์ ์๋ฒ๋ง ์๊ณ ์๊ธฐ ๋๋ฌธ์, ๋ด ์๋ฒ์์๋ง ํ ํฐ์ ์ธ์ฝ๋ฉ(=๋ง๋ค๊ธฐ)/๋์ฝ๋ฉ(=ํ๊ธฐ) ํ ์ ์์ต๋๋ค.
SECRET_KEY = 'inyongkim'
# ------------ํฌ๋กค๋ง PATH ๋ถ๋ถ----------------------------------------------------------------------------------------------------------------------# ์น ํฌ๋กค๋ง URL ์ง์ ๊ณผ requests๋ฅผํตํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ->bs๋ฅผ ํตํ ํ์ฑ# URL = "https://kworb.net/spotify/country/us_daily.html"# headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}# data = requests.get(URL, headers=headers)# soup = BeautifulSoup(data.text, 'html.parser')# ------------ํฌ๋กค๋ง PATH ๋ถ๋ถ----------------------------------------------------------------------------------------------------------------------# "localhost:5001/" URL์์ฒญ์ ๋ฉ์ธ ๋ทฐ ํ์ด์ง ๋ฐํ ์๋ต@app.route('/')
def home():
token_receive = request.cookies.get('mytoken')
try:
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
user_info = db.user.find_one({"user_id": payload['user_id']})
return render_template('index.html', nickname=user_info["name"])
except jwt.ExpiredSignatureError:
return redirect(url_for("login", msg="๋ก๊ทธ์ธ ์๊ฐ์ด ๋ง๋ฃ๋์์ต๋๋ค."))
except jwt.exceptions.DecodeError:
return redirect(url_for("login", msg="๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค."))
# ------------๊ธฐ๋ฅ ๊ตฌํ ํจ์ ๋ถ๋ถ----------------------------------------------------------------------------------------------------------------------# ํ์๊ฐ์
์์์ ๋ณด์ฌ์ฃผ๋ ๋ถ๋ถ@app.route('/joinForm')
def user_Join():
return render_template('joinForm.html')
# ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ถ๋ถ@app.route('/loginForm')
def login():
msg = request.args.get("msg")
return render_template('loginForm.html', msg=msg)
# ํ์๊ฐ์
๊ธฐ๋ฅ API@app.route("/api/join", methods=["POST"])
def join():
user_name_receive = request.form['user_name_give']
user_id_receive = request.form['user_id_give']
user_password1_receive = request.form['user_password1_give']
user_postcode_receive = request.form['user_postcode_give']
user_address1_receive = request.form['user_address1_give']
user_address2_receive = request.form['user_address2_give']
user_email_receive = request.form['user_email_give']
user_type_receive = request.form['user_type_give']
# PW ์ํธํ
pw_hash = hashlib.sha256(user_password1_receive.encode('utf-8')).hexdigest()
# user_num ๊ณ ์ ๋ฒํธ ์ถ์ถ ๋ฐฉ๋ฒ
user_list = list(db.user.find({}, {'_id': False}))
user_num = len(user_list) + 1
doc = {
'user_num': user_num,# ์ถํ ํน์ ์ ์ ๋ฅผ ์ฐพ๊ธฐ ์ํด 'num' ์ด๋ผ๋ ๊ณ ์ ๊ฐ ๋ถ์ฌ'user_name' : user_name_receive,# ์ด๋ฆ'user_id' : user_id_receive,# ์์ด๋'user_password1' : pw_hash,# -------- ์ํธํ๋ ๋น๋ฐ๋ฒํธ(Hashlib)'user_postcode' : user_postcode_receive,# ์ฐํธ๋ฒํธ'user_address1' : user_address1_receive,# ์ฃผ์1(์๊ตฐ๊ตฌ)'user_address2' : user_address2_receive,# ์ฃผ์2(์์ธ์ฃผ์)'user_email' : user_email_receive,# ์ด๋ฉ์ผ'user_type' : user_type_receive,# ์ผ๋ฐ์ฌ์ฉ์ or ์ ๋ฌธ๊ฐ
}
db.user.insert_one(doc)
# [POST-7] insert๊ฐ ์๋ฃ๋์์ผ๋ ์๋ฃ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ค.return jsonify({'msg': 'POST ์ฐ๊ฒฐ ์๋ฃ!'+'ํ์๊ฐ์
์๋ฃ!'})
# ๋ก๊ทธ์ธ ๊ธฐ๋ฅ API# id, pw๋ฅผ ๋ฐ์์ ๋ง์ถฐ๋ณด๊ณ , ํ ํฐ์ ๋ง๋ค์ด ๋ฐ๊ธํฉ๋๋ค.@app.route('/api/login', methods=['POST'])
def login():
user_id_receive = request.form['user_id_give']
user_password1_receive = request.form['user_password1_give']
# PW ์ํธํ
pw_hash = hashlib.sha256(user_password1_receive.encode('utf-8')).hexdigest()
# id, ์ํธํ๋pw์ ๊ฐ์ง๊ณ ํด๋น ์ ์ ๋ฅผ ์ฐพ์ต๋๋ค.
result = db.user.find_one({'id': user_id_receive, 'pw': pw_hash})
# ์ฐพ์ผ๋ฉด JWT ํ ํฐ์ ๋ง๋ค์ด ๋ฐ๊ธํฉ๋๋ค.if result is not None:
# JWT ํ ํฐ์๋, payload์ ์ํฌ๋ฆฟํค๊ฐ ํ์ํฉ๋๋ค.# ์ํฌ๋ฆฟํค๊ฐ ์์ด์ผ ํ ํฐ์ ๋์ฝ๋ฉ(=ํ๊ธฐ) ํด์ payload ๊ฐ์ ๋ณผ ์ ์์ต๋๋ค.# ์๋์์ id์ exp๋ฅผ ๋ด์์ต๋๋ค. ์ฆ, JWT ํ ํฐ์ ํ๋ฉด ์ ์ ID ๊ฐ์ ์ ์ ์์ต๋๋ค.# exp์๋ ๋ง๋ฃ์๊ฐ์ ๋ฃ์ด์ค๋๋ค. ๋ง๋ฃ์๊ฐ์ด ์ง๋๋ฉด, ์ํฌ๋ฆฟํค๋ก ํ ํฐ์ ํ ๋ ๋ง๋ฃ๋์๋ค๊ณ ์๋ฌ๊ฐ ๋ฉ๋๋ค.
payload = {
'user_id': user_id_receive,
'expiry_time': datetime.datetime.utcnow() + datetime.timedelta(seconds=5)
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
# token์ ์ค๋๋ค.return jsonify({'result': 'success', 'token': token})
# ์ฐพ์ง ๋ชปํ๋ฉดelse:
return jsonify({'result': 'fail', 'msg': '์์ด๋/๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.'})
# [์ ์ ์ ๋ณด ํ์ธ API]# ๋ก๊ทธ์ธ๋ ์ ์ ๋ง call ํ ์ ์๋ API์
๋๋ค.# ์ ํจํ ํ ํฐ์ ์ค์ผ ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๊ฐ ์ ์์ต๋๋ค.# (๊ทธ๋ ์ง ์์ผ๋ฉด ๋จ์ ์ฅ๋ฐ๊ตฌ๋๋ผ๋ ๊ฐ, ์ ๋ณด๋ฅผ ๋๊ตฌ๋ ๋ณผ ์ ์๊ฒ ์ฃ ?)#@app.route('/api/userinfo', methods=['GET'])
def api_valid():
token_receive = request.cookies.get('mytoken')
# try / catch ๋ฌธ?# try ์๋๋ฅผ ์คํํ๋ค๊ฐ, ์๋ฌ๊ฐ ์์ผ๋ฉด except ๊ตฌ๋ถ์ผ๋ก ๊ฐ๋ ์๊ธฐ์
๋๋ค.try:
# token์ ์ํฌ๋ฆฟํค๋ก ๋์ฝ๋ฉํฉ๋๋ค.# ๋ณด์ค ์ ์๋๋ก payload๋ฅผ print ํด๋์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ก๊ทธ์ธ ์ ๋ฃ์ ๊ทธ payload์ ๊ฐ์ ๊ฒ์ด ๋์ต๋๋ค.
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
print(payload)
# payload ์์ id๊ฐ ๋ค์ด์์ต๋๋ค. ์ด id๋ก ์ ์ ์ ๋ณด๋ฅผ ์ฐพ์ต๋๋ค.# ์ฌ๊ธฐ์์ ๊ทธ ์๋ก ๋๋ค์์ ๋ณด๋ด์ฃผ๊ฒ ์ต๋๋ค.
userinfo = db.user.find_one({'user_id': payload['user_id']}, {'_id': 0})
return jsonify({'result': 'success', 'user_name': userinfo['user_name']})
except jwt.ExpiredSignatureError:
# ์๋ฅผ ์คํํ๋๋ฐ ๋ง๋ฃ์๊ฐ์ด ์ง๋ฌ์ผ๋ฉด ์๋ฌ๊ฐ ๋ฉ๋๋ค.return jsonify({'result': 'fail', 'msg': '๋ก๊ทธ์ธ ์๊ฐ์ด ๋ง๋ฃ๋์์ต๋๋ค.'})
except jwt.exceptions.DecodeError:
return jsonify({'result': 'fail', 'msg': '๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.'})
# ------------๊ธฐ๋ฅ ๊ตฌํ ํจ์ ๋ถ๋ถ------------------------------------------------------------------------------------------------------------------------# app์ด๋ผ๋ ๋ฉ์ธ ํจ์if __name__ == '__main__':
app.run('0.0.0.0', port=5001, debug=True)
Python
๋ณต์ฌ
๋ผ์ฐํธ๋ก URL ์๋ต์ ํ๋ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ๋ค
โข
@app.route('/')def home(): #๋ฉ์ธํ์ด์ง ๋ฐํ
โข
@app.route('/joinForm') def user_Join(): #ํ์ ๊ฐ์
ํ์ด์ง ๋ฐํ
โข
@app.route('/loginForm') def login(): #๋ก๊ทธ์ธ ์์ ํ์ด์งย ๋ฐํ
โข
@app.route("/api/join", methods=["POST"]) def join(): #ํ์๊ฐ์
POST ์๋ต(DB insert) ๊ธฐ๋ฅ ๋ฐ ๊ฒฐ๊ณผย ๋ฐํ
โข
@app.route('/api/login', methods=['POST']) def login(): #๋ก๊ทธ์ธ POST ์๋ต(DB read) ๋ฐ JWTํ ํฐ ์์ฑ ๋ฐ ๋ฐํ
โข
@app.route('/api/userinfo', methods=['GET']) def api_valid(): #๋ก๊ทธ์ธ ์ ๋ก๊ทธ์ธ ์ ์ ๋ฅผ ํ์ธ(ํน์ )ํ๋ ๊ธฐ๋ฅ(์ ์ฉ ๋ฉ๋ด ์ด์ฉ ๋ฑ์ ํ์ฉ)
๋ก๊ทธ์ธ๊ณผ ๊ด๋ จ๋ ์ค๋ฅ ๋ฉ์์ง์๊ธฐ ๋๋ฌธ์ ์ ์
์ค ํ๋๊ฐ ๋ฌธ์ ์ธ ๊ฒ์ด๋ค.
[Flask] Team Project(GameInsight) 02 ๊ธฐ๋ฅ ๊ตฌ์ฑ ์ค ์ค๋ฅ ๋ฐ์ ๋ฐ ํด๊ฒฐ ๊ณผ์
ํ๋ก์ ํธ ์๊ฐ์ ํ ์๊ฐ๋ ๋ค์ ๋
ธ์
ํ์ด์ง์์ ํ์ธ ํ ์ ์์ต๋๋ค.
Flask_project_Game_Insight
[Flask] Flask framework ํ๋ก์ ํธ(project Game_Insight)
ย ํ๋ก์ ํธ ์๊ฐ
๊ฒ์ ๊ด๋ จ ๋ญํน, ์ ๋ฌธ๊ฐ ๋ฆฌ๋ทฐ ๋ฐ ์ ์ ๋ฆฌ๋ทฐ๋ฅผ ํ์ธ ํ ์ ์๋ ์น ํ์ด์ง ์๋น์ค
๊ฐ๋ฐ ๊ธฐ๊ฐ
โข
23.08.09์ผ - 23.08.11์ผ
ย ๋งด๋ฒ๊ตฌ์ฑ
โข
(ํ์ฅ) ๊น์ธ์ฉ - ๋ก๊ทธ์ธ ๋ฐ ํ์ ๊ฐ์
, ์์ ๋ฐ ์ญ์
โข
(ํ์) ์กฐใ
ใ
- ์ ๋ฌธ๊ฐ ๋ฆฌ๋ทฐ ๋ถ๋ถ
โข
(ํ์) ์ ใ
ใ
- ์ ์ ๋ฆฌ๋ทฐ
โข
(ํ์) ๊นใ
ใ
- ๋ญํน ์ ๋ณด
ย ๊ฐ๋ฐ ํ๊ฒฝ
[Flask] Team Project(GameInsight) 00 ๊ฐ์
ํ์ฅ์ผ๋ก ์์ฒํด์ ํ์๋ค์๊ฒ ์ฌ๋ฌ ์๊ฒฌ์ ์ฃผ๋์ ์ผ๋ก ๋ฐ๊ณ ๋ณธ์ธ์ ํฌํจํ ์ธ์ ์์์ ๊ฐ๋ฅ์ฑ์ ์ฒดํฌํ๋ค. ๊ฐ๋จํ ํ์๋ฅผ ํตํด ํ์๋ค์ด ๋ณด์ฌ์ค ์ดํด๋์ ์์ ๊ฐ์ผ๋ก ์ฐ๋ฆฌ ํ์ 4๋ช
์ผ๋ก ์ถฉ๋ถํ ํ ์ ์๋ค๊ณ ํ๋จ๋๋ ๋ฒ์๋ฅผ ์ ํ๋ค.
๊ฐ๋ฐ ๊ธฐ๊ฐ์ 3์ผ์ด์ง๋ง ์ฌ์ค์ ์์ด๋์ด ์ฐฝ์ถ์ ์ํ ๋ธ๋ ์ธ์คํ ๋ฐ ๋ฐ๋์ , ๋ฌธ์ํ 2~3์๊ฐ์ ์ฌ์ฉํ๊ณ , ๋๋ ํ์ฅ์ผ๋ก์จ ์ด์ ๊ฒฝํ๋ค์ ํ ๋๋ก ์ข ๋ ์ํํ, ์์ ์ ์ธ ํ๋ก์ ํธ ์์์ ์ํด์ ๊ณตํต ํ๊ฒฝ ๊ตฌ์ถ, ๊ทธ๋ผ์ด๋ ๊ท์น, ๊ฐ์, ์ปค๋ฎค๋์ผ์ด์
ํด, ํ์
ํด์ ์ฒดํฌํ๊ณ ๋ฏธ์ํ ๋ถ๋ถ์ด ์์ผ๋ฉด ํต์ฌ์ ์ธ ๋ถ๋ถ์ ์ฌ์ฉ๋ฒ๊ณผ ๊ฐ๋จํ, ์๊ธฐ ์ฝ๋๋ก ์๋ดํ๋๋ผ ๋ฐ๋์ ์ด ๋ค ์ง๋๊ฐ๋ค. ์ถํ ๊ธฐ์ด์ ์ธ ๋ฐํ ์ค๋น์ ๋ฐฐํฌ ๊ณผ์ ๊น์ง ์๊ฐํด์ผ ๋์ย ์ฌ์ค์ 3์ผ์ด ์๋๋ผ ํ๋ฃจ๋ง์ ์์
์ ์๋ฃํด์ผ ๋๋ ์ํฉ์ด๋ค. ํ์ง๋ง, ๋น๊ต์ ์งง์ ๊ธฐ๊ฐ์ ๊ฐ์ ๋งก์ ๋ถ๋ถ์ ์ต์ ์ ๋คํด์ ๊ตฌํํด๋ณด์๋ ๋ชฉํ๋ฅผ ๊ฐ์ก๋ค. ๋ํ ์์ด๋์ด ์ฐฝ์ถ, ๊ธฐํ, ๋ฐฐํฌ, ์ ๋ฆฌ ๊น์ง๋ ๊ฐ๋ฐ์ ํ ๋ถ๋ถ์ด๋ค. ์ฌ์ค์ ๋งํธํ ์ฝ๊ฒ ์ฐ์ต ํ ์๋ ์์์ง๋ง ์ฐ๋ฆฐ ๋ง์น ๋ง๊ฐ์ผ์ด ์ฝ์์ ๋ค๊ฐ์์ ํ๋ก์ ํธ๋ฅผ ๋จ์จ์ ๋๋ด์ผ ๋๋ ์ํฉ์ ์ค์ค๋ก ์์ฒํ ๊ฒ์ด๋ค.
๋ค์ ๋ฌด๋ฆฌํด๋ณด์ด๋ ์ค์ผ์ฅด์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด์๋ย ๊ธฐํ ๋ถ๋ถ์์ ๊ฐ๋ฐ ๋ถ๋ถ์ ๊ณ ๋ คํ ๋ฟ๋ง ์๋๋ผ,ย ์ธ์ ์์์ ๋ฅ๋ ฅ,ย ๋ฌผ๋ฆฌ์ ์ธ ์๊ฐ,ย ๊ตฌํ ๊ฐ๋ฅ์ฑ์ ๋น ๋ฅด๊ฒ ํ๋จํด์ผ ํ๋ค. ๊ตฌํํ ๊ธฐ๋ฅ์ ๋ฒ์๋ฅผ ํ์
ํด์ผ ํ๊ณ ๊ฐ์ธ ๋ถ๋ถ์ ๋ฒ์๋ ์์์ ์ ํด์ผ ํ๋ค. ๋ชจ๋ ๊ฐ์ ๋ฒ์๋ฅผ ์ ํ ํ ์ ์๋๋ก ์ ํ๊ถ์ ์ฃผ์์ผ๋ฉฐ ์ด๋ฒ ๋ฏธ๋ ํ๋ก์ ํธ๋ก ๊ฐ๊ฐ์ธ์๊ฒ ์ข์ ๊ฒฝํ์ด ๋์์ผ๋ฉด ํ๋ ๋ฐ๋๋ ์์๋ค.
1. ์์ด๋์ด ํ์
๊ณตํต ๋ถ๋ชจ ์ฐพ๊ธฐ
๊ฒ์ ์ ๋ณด

์์ด๋์ด๋ฅผ ๊ฐ์ฐ์ฑ์๊ณ ๋น ๋ฅด๊ฒ ์ฐ๊ฒฐ ์ํฌ ์ ์๋ ๋ง์ธ๋๋งต(Gitmind)
2. ํ์ ์ค๋น๋ฅผ ์ํ ๋ด๋ถ ํ ์คํธ ์งํ
Git, Github์ ๋ฏธ๋๋ฉ ํ
์คํธ์ ๊ธฐ๋ณธ๊ธฐ ํ
์คํธ

[Flask] Team Project(GameInsight) 01 ํ๋ก์ ํธ ๊ธฐํ ๊ณผ์ ๋ฐ ๊ฐ์
ํ์ฌ๊น์ง ๋ฏธ๋ ํ๋ก์ ํธ์์ 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 ๋ญํน ์น ํฌ๋กค๋ง ๋ฐ ๋ณด๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ)
Load more
