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 ํ๋ก์ ํธ ๊ธฐํ ๊ณผ์ ๋ฐ ๊ฐ์
