์ด๋ฒ ํฌ์คํ
์ ์ฝ๊ฐ์ ์ํฌ๋ฆฌ ์๊ฐ์ ํ์ฉํ์ฌ ์ด๊ฒ์ ๊ฒ ๋ง์ ธ๋ณด๋ค ๋ง๋ค๊ฒ ๋ Daily DevBlog(๊ธฐ์ ๋ธ๋ก๊ทธ ๊ตฌ๋
์๋น์ค)์ ๋ํด ์ด์ผ๊ธฐ ํ๋ ค๊ณ ํ๋ค. ํ๋์ ๊ธ์ ๊ด๋ จ ๋ด์ฉ์ ๋ชจ๋ ๋ด๊ธฐ์๋ ์์ด ๋ง์์ ์ฝ๋์ฌ๋๋ ์ง๋ฃจํ๊ณ , ๊ธ์ ์ฐ๋ ํ์ ๋ํ ์ด๋ถ์ฑ์ค ํ ๊ฒ๊ฐ์ ํฌ๊ฒ 3๊ฐ์ ์๋ฆฌ์ฆ๋ก ๋๋ ์ ์ต๋ํ ์์ธํ๊ณ ํ์ฅ๊ฐ(?)์๊ฒ ๊ธ์ ์จ๋ณด๋ ค๊ณ ๋
ธ๋ ฅํ๋ค.
1๋ถ : ์ ๋ง๋ค๊ฒ ๋์๋๊ฐ ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๊ตฌ์กฐ๋ก ๋ง๋ค์๋๊ฐ 2๋ถ : ๋ฌธ์ ๋ฐ์ ๋ฐ Trouble Shooting 3๋ถ : ์์ผ๋ก์ ๊ณํ๊ณผ ๋ฐฉํฅ์ฑ ๊ธ์ ๋ค์ด๊ฐ๊ธฐ ์์ ์ต์ข
๊ฒฐ๊ณผ๋ http://daily-devblog.com ์์ ํ์ธํ ์ ์๋ค.
๋ฌด์์ด ๋๋ฅผ ์์ง์ด๊ฒ ํ๋๊ฐ ์ผ๋ง์ ๊น์ง ์คํ์์ค๋ ์ ๋ง ์ค๋ ฅ์๋ ๊ฐ๋ฐ์๋ ์ ๋ช
ํ ์ฌ๋๋ค ๋ง๊ณ ๋ ๊ธ๊ธฐ์ ์์ญ(?)์ด๋ผ๊ณ ์๊ฐํ์์ง๋ง ์ต๊ทผ ์คํ์์ค ๊ฐ๋ฐ์ ์ด์ผ๊ธฐ ์ธ๋ฏธ๋๋ฅผ ๋ค๋
์จ๋ค ๋ง์์์ ์์๋ ๋ฒฝ์ด ์ฌ๋ผ์ง๋๋ฏ ํ๋ค. ์ธ๋ฏธ๋๋ฅผ ๋ค์ผ๋ฉด์ ‘๋๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ด ๋ณผ์๋ ์์๊น?’, ‘ํ์ฌ๋ผ๋ ๋ช
์ฐฐ์ ๋ผ๋ฉด ๋ ์ด๋ ์์ค์์ ๊ฐ๋ฐ์ ํ๊ณ ์๋ ๊ฒ์ผ๊น?’ ๋ฑ ์ฌ๋ฌ ์๊ฐ๋ค์ด ๋จธ๋ฆฌ๋ฅผ ๋ฉค๋๋ค ๊ฐ๋ฐ์๋ฅผ ์ํ ๊ธ์ฐ๊ธฐ๋ผ๋ ๊ธ์์ ๊ธฐ์ ๋ธ๋ก๊ทธ๋ค์ ๋ชจ์๋์ awesome-devblog๋ฅผ ์๊ฐํ๋ ๊ธ์ ๋ณด๊ฒ ๋์๊ณ ๋ด ๋จธ๋ฆฟ์์ ์ ๋ฆฌ์๋๋ ๊ทธ ์๊ฐ๋ค์ “์ด ๋ฐ์ดํฐ๋ฅผ ํ์ฉํด์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ด๋ณด์!“๋ก ๊ท๊ฒฐ๋์๋ค.
๋ค๋ฅธ ์ด์ผ๊ธฐ ์ด์ง๋ง, awesome-devblog ์ ๋ณด๊ณ ๋น์ฅ ๋ด ๋ธ๋ก๊ทธ๋ ๋ฑ๋กํด์ผ์ง ํ์๋๋ฐ ์ด๋ฏธ ๋ฑ๋ก์ด ๋์ด ์์๋ค;; ๋ฑ๋กํด์ฃผ์ ๋ถ๊ป ๊ฐ์ฌํ๋ค๋ ์๊ฐ์ด ๋ค๊ธฐ์ ์ ๋ด ๋ธ๋ก๊ทธ๊ฐ ๋๊ตฐ๊ฐ์๊ฒ ๋ณด์ฌ์ง๊ณ ์๊ตฌ๋ ํ๋ฉฐ ์์ผ ๋๋ผ์์ด ๋ ์ปธ๋ค.
์๊ตฌ์ฌํญ๊ณผ ๋๊ตฌ ๊ทธ๋ฆฌ๊ณ ์ค๊ณ ๋ง๋ค๋ ค๊ณ ์๊ฐํด๋ดค๋ ์๊ตฌ์ฌํญ์ ๋ค์๊ณผ ๊ฐ๋ค. ๋ง์น ํ์ฌ์์ ๊ฐ๋ฐ์ ์คํ์ ์ ๋ฆฌํ๋ฏ…
์นํ์ด์ง๋ฅผ ํ์ฉํด์ ๊ตฌ๋
ํ๊ณ ์ ํ๋ ์ฌ๋๋ค์ ์ด๋ฉ์ผ์ ์์งํ ์ ์์ด์ผ ํ๋ค. ๋งค์ผ ์ ๋ ์์ฑ๋ ๊ธ์ ์์งํ๊ณ ์กฐํฉํ์ฌ ๊ตฌ๋
ํ๊ณ ์ ํ๋ ์ฌ๋๋ค์๊ฒ ๋ฉ์ผ์ ๋ณด๋ผ์ ์์ด์ผ ํ๋ค. ์ ๋๊ฐ์ง๋ง ๋ณด๋ฉด ๋๋ฌด ๊ฐ๋จํ๋ค. ๋ํ ๊ธฐ์กด์ ์ฌ์ฉํ์ง ์์๋ ๊ธฐ์ ๋ค์ ์ฌ์ฉํด๋ณด๋ฉด์ ์ต๋ํ ์ฌํํ๊ฒ ๊ฐ๋ฐํ๋๊ฒ์ ์ฒซ ๊ฐ์ธ ํ๋ก์ ํธ์ ๋ชฉํ๋ก ํ๊ณ ์ถ์๋ค. ํ์ฌ ์๊ฐํ ์ํคํ
์ฒ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ต๋ํ ์ฌํํ๊ฒ ์ค๊ณํด๋ณด์." ์ต๋ํ ์ฌํํ๊ฒ ์ค๊ณํด๋ณด์. ๋ฐ์ดํฐ๋ ํด๋น github์ ์๊ธธ๋ ๊ทธ๋ฅ ๊ฐ์ ธ๋ค ์ฐ๋ ค๊ณ ํ์ผ๋ ๊ทธ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ์๋ ๋ถ๊ป ํ๋ฝ์ ๋ฐ๊ณ ์ฌ์ฉํ๋๊ฒ ์๋๋(?)์ธ๊ฒ ๊ฐ์ ์์๋ฌธ๋์ ์ฐ๋ฝ์ ํด์ ํ๋ฝ๋ฐ๋๋ฐ ์ฑ๊ณตํ์๋ค.
๋ฐ์ดํฐ ์ฌ์ฉ์ ํ๋ฝํด์ฃผ์ ์ฒ์ฌ๊ฐ์ผ์ ๋ถ…" ๋ฐ์ดํฐ ์ฌ์ฉ์ ํ๋ฝํด์ฃผ์ ์ฒ์ฌ๊ฐ์ผ์ ๋ถ… ์ด ์๋ฆฌ๋ฅผ ๋น์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ฝํด์ฃผ์ ๋ถ ๊ป ๊ฐ์ฌ์ธ์ฌ๋ฅผ ํํฉ๋๋ค.
ํํ์ด์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ์ด์ ๊ป ์ผ๊ฒน์ด์ ์์ฃผ์ฒ๋ผ(์?) Java์ Spring์ ์ฌ์ฉํด ์์์ง๋ง ์ด๋ฒ์ ์ข ๋ค๋ฅธ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์ถ์๋ค.
๋ฌผ๋ก ์ผ๊ฒน์ด์ ๋งฅ์ฃผ, ์นํจ์ ์์ฃผ๋ฅผ ๋จน์ด๋ ๋๊ธด ํ์ง๋ง…" ๋ฌผ๋ก ์ผ๊ฒน์ด์ ๋งฅ์ฃผ, ์นํจ์ ์์ฃผ๋ฅผ ๋จน์ด๋ ๋๊ธด ํ์ง๋ง… ์ต๊ทผ์ Flask๋ผ๋ python๊ธฐ๋ฐ ์น ํ๋ ์์ํฌ๋ฅผ ๋ง์ ธ๋ณธ ๊ฒฝํ์ด ์์ด์ ์ด๋ ๋คํ ๊ณ ๋ฏผ์์ด ๋น ๋ฅธ ๊ฒฐ์ ์ ํ ์ ์์๋ค. ๋ํ DB๋ mysql ์ด๋ ๊ธฐํ memory DB๋ฅผ ์ฌ์ฉํ ๊น ํ์ง๋ง ์ด๋ํ ์ฌํํ๊ฒ ํ์ผ์ ํ์ฉํ๋ sqlite3 ์ ์ฌ์ฉํ๊ณ ์ ํ์๋ค.
์น์๋ฒ_์ต์ข
_์์ _ํ์ด๋_์ง์ง_ํ์ Flask๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ ๋น์ฐํ ์น์๋ฒ๊ฐ ํ์ํ๋ค. ์ฒ์์ awesome-devblog์์๋ ์ฌ์ฉํ๊ณ ์๋ https://www.heroku.com/ ๋ฅผ ์ด์ฉํด์ ํด๋ณด๋ ค ํ์ผ๋ ๋งค์ผ ๊ตฌ๋
์๋ค์๊ฒ ๋ฉ์ผ์ ๋ณด๋ด๋ ๋ฑ ์ค์ผ์ฅด๋ฌ ๊ธฐ๋ฅ๊ฐ์๊ฑด ๊ตฌํํ๊ธฐ ํ๋ค์๊ณ ์ธ์คํดํธ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ฑ๋กํ๋ ํํ๋ผ ์ฌ์ฉ์์ ๋ฉ์ผ์ ์
๋ ฅ๋ฐ๊ณ ์ ์ฅํ๋ ๋ก์ง์ ๋ง๋ค๊ธฐ๋ ์ด๋ ค์ ๋ณด์๋ค. (ํ์๊ฐ heroku๋ฅผ ๋๋ฌด ์๋ฐ ๊ฒํฅ๊ธฐ์์ผ๋ก ๋ด์ ์ผ์๋ ์๋ค…) ์ข๋ ์ฐพ์๋ณด๋ https://www.pythonanywhere.com/ ๋ผ๋ ์ ํ์ ์ด์ง๋ง ๋ฌด๋ฃ ์๋น์ค๊ฐ ์์๋๋ฐ ์น์ฝ์๋ ์ง์ํ๊ณ ์๋นํ ๋งค๋ ฅ์์ด ๋ณด์ฌ์ ์ด๊ฑฐ๋ค! ํ๋ฉฐ ๊ฐ๋ฐ์ ์์์ ํ์ผ๋ (๋๋ฆ ๋๋ฉ์ธ๊น์ง ๊ทธ๋ด์ธํ๊ฒ ๋ง๋ค์์ง๋ง… http://dailydevblog.pythonanywhere.com/ ) ์ธ์์ ๊ณต์ง๋ ์๋ค๋ ๋ง์ ์ค๊ฐํ๋ฉฐ ์์ ๋งํ๋ ์๊ตฌ์ฌํญ์ ์๋ฒฝํ๊ฒ ๊ตฌํํ ์ ์๋ ์ํฉ์ด์๋ค.(request ์ ํ, ์ค์ผ์ฅด๋ฌ ๋ฑ๋ก ๊ฐ์ ์ ํ ๋ฑ ๋ณด๋ค ์ฌ๋ฌ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋์ ๋ด๊ณ ์จ์ผ…) ๋ง์ง๋ง ํฌ๋ง์ผ๋ก ์ธ์ ์๋์ง ์๋์ ๊น์ด ์๊ณ ์๋ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด๋ฅผ ๊บผ๋ด์ ๊ณต์ ๊ธฐ DDNS์ค์ ์ ํ๊ณ ๋ผ์ฆ๋ฒ ๋ฆฌ์์ ์ค์นํ๋ฉฐ ์น์๋ฒ๋ฅผ ์ํ ์
ํ
์ ์๋ํด๋ณด์์ผ๋ ์ธ์ ๋ ๊ทธ๋ ๋ฏ (์ํ๊ณต๋ถ ํ๊ธฐ์ ์ ์ฑ
์ ์ ๋ฆฌํ๊ณ ๊ดํ ๋ฐฉ์ฒญ์๊น์ง ํ๋ค๊ฐ ํผ๊ณคํด์ ์๋ฒ๋ฆฌ๋๋ฏํ ๋๋) ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ํด๊ฒ๊ฐ์ ์ด๋ํ ์งํํ๋ค๊ฐ ์ค๋จํ๊ฒ ๋๋ค. ๊ฒฐ๊ตญ AWS์์ 1๋
๋์์ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ Free Tier ๋ผ๋๊ฑธ ๋ฐ๊ฒฌํ๊ณ ์ด์ฐธ์ ๋๋ํ๋ฒ ์ฌ์ฉํด๋ณด์๋ผ๋ ๋ง์์ ๊ฐ์ง๊ณ ๊ณผ๊ธ๋์ง ์๊ฒ ์กฐ์ฌ์กฐ์ฌ ์
ํ
์ ํ ์ ์์๋ค.
Facebook๊ทธ๋ฃน๋ค์ ๋ํ
ํ๋ค(?) OSS๊ฐ๋ฐ์ ํฌ๋ผ์์ ์คํ์์ค ๊ฐ๋ฐ์์ด์ผ๊ธฐ๋ผ๋ ์ฃผ์ ๋ก ์ธ๋ฏธ๋๋ฅผ ์ฃผ์ตํ๋ค๋ ๊ณต์ง๋ฅผ ๋ณด๊ฒ๋์๋ค. ์ธ์ ๋ถํด๊ฐ ํธ๋๋์ ๋ค์ณ์ง์ง ์์ผ๋ ค๋ ๋ชธ๋ถ๋ฆผ์ค ์ธ๋ฏธ๋๊ฐ์ ์ธ๋ถ ๊ฐ๋ฐ ํ์ฌ์ ์ฐธ์ฌํด๋ณด์๋ ๋ง์์ผ๋ก ๊ณต์ง๋ฅผ ๋ณด์๋ง์ ํ๋ฆฐ๋ฏ์ด ์ ์ฒญ์ ํ๊ฒ ๋์๊ณ ์ธ๋ฏธ๋๋ฅผ ๋ฃ๊ณ ๊ฐํฅ์ด ๊ฐ์๊ธฐ ์ ์ ํ๊ธฐ๋ฅผ ์ ๊ณ ์ ํ๋ค.(์๊ฐ์ด ์ง๋๋ฉด ์์ด๋ฒ๋ฆด๊ฒ๋ง๊ฐ์, ๋ณด๊ณ ๋ค์ ์์ํ ๊ทธ ๋ฌด์ธ๊ฐ๋ฅผ ์ป์๊ธฐ์…)
๋น๊ฐ์ค๋ ์ฃผ๋ง์ด์์ง๋ง ๋ง์ด ๋ฐฐ์ฐ๊ณ ์ค์๋ ์ค๋ ์์ ๊ฐ๊ณ ์์ธ ๊ดํ๋ฌธ ๊ทผ์ฒ์ ์๋ ํ๊ตญ๋ง์ดํฌ๋ก์ํํธ๋ก ๊ฐ๊ฒ๋์๋ค. ๋ง๋ก๋ง ๋ฃ๋ MS์ฌ ๋ก๊ณ ๋ฅผ ๋ณด๊ณ ์ฌ๋๋ค์ด ํ๋๋์ฉ ๋ชจ์ด๋๊ฑธ ๋ณด๋ ๋ญ๊ฐ ๋ฐฐ์ธ์ ์๊ฒ ๊ตฌ๋ ํ๋ ๊ธฐ๋๊ฐ์ด ์๊ฒผ๋ค. ์ฌ์ค ์คํ์์ค๋ฅผ ์ฌ์ฉ๋ง ํด๋ณธ ์
์ฅ์ด๋ผ ์ค์ ์คํ์์ค์ ๊ธฐ์ฌํ์๋ ๋ถ๋ค์ ์ด๋ค ์๊ฐ๋ค์ ๊ฐ๊ณ ๊ณ์๋์ง๊ฐ ๊ฐ์ฅ ๊ถ๊ธํ๊ณ ๊ฐ๋ฐ์์ธ ๋๋ ์ธ์ ๊ฐ ์คํ์์ค์ ๊ธฐ์ฌํ ์์์ง ์์๊น ํ๋ ์๊ฐ์ ํ๋ฉฐ ๋ฐํ๋ฅผ ๋ค์๋ค.
# ํ์์ง๋ : ์ด์๊ณผ ํ์ค - ์คํ์์ค ์ ์๊ถ / ์ ์ ๊ท ๋ ์คํ์์ค๋ ์๋ฌด๋ฆฌ ๋ง๊ทธ๋๋ก Open์ด์ง๋ง ์คํ์์ค๋ง๋ค ๋ค์ํ ์ ์๊ถ์ ๊ฐ๊ณ ์๊ณ ์๋ก ์์ทจํ๋ ค๋ ์ธ์์ด ๋ง์ด ๋ฐ์ํ๋ค๊ณ ํ๋ค. ๊ทธ๋ฌ๋ค๋ณด๋ ์ด๋ ํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ณ ์คํ์์คํ ์ํฌ๋๋ ๋ผ์ด์ผ์ค์ ์ข
๋ฅ๋ฅผ ์ ๊ฒฐ์ ํด์ผ ์ถํ ๋ถ์ด์ต์ ๋นํ๋ ์ํฉ์ ๋ชจ๋ฉดํ ์ ์๋ค๊ณ ํ๋ค. ํนํ์ ๋ผ์ด์ผ์ค๋ ๊ฐ์ ๋ง์ด๋ฉด์๋ ๋ค๋ฅธ๋ฐ ์๋ ํ์ฒ๋ผ ๊ฐ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ถ๋ถ์ ํ์ธํ ์ ์์๋ค.
ํนํ ๋ผ์ด์ผ์ค ๊ถ๋ฆฌ๋ฐ์ ์ถ์, ์ฌ์ฌ, ๋ฑ๋ก ์ฐฝ์๊ณผ ๋์ ๋ฐ์ ๊ถ๋ฆฌ๋ด์ฉ ๋
์ ๋ฐฐํ์ ์ค์๊ถ ์ธ๊ฒฉ๊ถ/์ฌ์ฐ๊ถ ํจ๋ ฅ๋ฒ์ ์์ด๋์ด์ ๋์ผ์ฑ ํํ์ ์ค์ง์ ์ ์ฌ์ฑ ์ฒซ ์๊ฐ์ด๊ธฐ๋ ํ์๊ณ ์๋ฌด๋๋ ์ฃผ์ ๊ฐ ๋์ฅํ ๋ก ์ ํด๋ ์๋๋ ์ฃผ์ ์๋์ง๋ผ ์ ํด์ง ์๊ฐ์ ๋๊ธธ์ ๋๋ก ์ด์ผ๊ธฐ๋ฅผ ๋ง์ด ํด์ฃผ์
จ๋ค. ํนํ ์คํ์์ค ๊ด๋ จ๋ ์ด์ผ๊ธฐ๋ ์ฌ๋ก๋ฅผ ์ด์ผ๊ธฐ ํด์ผ ์ฌ๋ฐ๋ค๊ณ ํ์
จ๋๋ฐ ์๊ฐ๊ด๊ณ์ ๋ช๊ฐ์ง๋ง ๋ง์ํด์ฃผ์
จ๋ค.
๋งํฌ๊ฐ ๋ง๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ผ๋ ์ฒจ๋ถํด๋ณธ๋ค. ์๋ฆผ๋ท vs ํ์ด์จ๋ท ์ฌ๊ฑด EFM Networks ์ค๋ผํด VS ๊ตฌ๊ธ ์คํ์์ค ๊ฐ๋ฐ์ ๋ํด ๋จ์ํ๊ฒ ๋๊ตฌ๋ ์์ ํ ์ ์๋ ํ๊ฒฝ ์ด๋ผ๊ณ ๋ง ์๊ฐ์ ํ๊ณ ์๋ค๊ฐ ์ด๋ฐ ๋ณต์กํ ๋ผ์ด์ผ์ค ๋ฌธ์ ๊ฐ ๋์ค๋ ์ฝ๊ฐ ์ด๋ ค์ ์ง๋ง, ์คํ์์ค์ ์ํ๊ณ๋ฅผ ์๊ณ ๋ฐ์ ๋ค์ด๊ธฐ ์ํด์๋ ์ด๋์ ๋์ ํ์คํ ๋ฆฌ๋ ์์์ผ ๊ฒ ๋ค๊ณ ๋๋ผ๊ฒ ๋์๋ค.
Elastic ์์ Remote ๋ก ์ผํ๊ธฐ / ๊น์ข
๋ฏผ ๋ ๊ทธ์ ๋ถํฐ Elastic ์ ํ๋ค์ ์ค๋ฌด์์๋ ์ฌ์ฉํด ์์๊ธฐ์ ๊ฐ์ธ์ ์ผ๋ก ์ค๋ ๋ฐํ์ค์ ๊ฐ์ฅ ๊ถ๊ธํ์๊ณ , ๊ด์ฌ์ด ์๋ ์๊ฐ์ด์๋ค. ๋ฐํ์ ์์ ์ด๋ป๊ฒ Elastic์ ๋ค์ด๊ฐ๊ฒ ๋์
จ๊ณ ํ์ฌ ์๊ฐ๋ฅผ ๊ฐ๋จํ ํด์ฃผ์
จ๋๋ฐ ์๊ฐ๋ณด๋ค ์ด๋ง์ด๋งํ ํ์ฌ๋ค๊ณ ๋๋์ ์์๋ค.(800์ฌ๋ช
์ค ํ๊ตญ์ 9๋ช
/ ๋ค๋๋๋ ์ถ์ ์คํํธ์
์ธ๋ฐ ๋ณธ์ฌ๋ ์บ๋ฆฌํฌ๋์ ๋ง์ดํด๋ทฐ์ ์๊ณ ๋ฑ๋ฑ) ์๊ฒฉ๊ทผ๋ฌด๋ ํธํ๊ณ ๋น์ฉ์ด ์ ์ฝ๋๋ ์ฅ์ ์ด ์์ผ๋ ๋๋ฃ๋ค๊ฐ์ ์ ๋๊ฐํ์ฑ์ด ํ๋ค๊ฑฐ๋ ํ์์ ์ง์ค์ด ํ๋ ๋จ์ ๋ ์๋ค๋ ์ ์ ๋ง์ํด ์ฃผ์
จ๋ค. ์๊ฐ๊ด๊ณ์ ๋ช๊ฐ์ง ๋งํฌ๋ค์ ์๊ฐํด์ฃผ์
จ๋๋ฐ ๋์ค์ ๋ด๋ณผ ์๊ฐ์ด๋ค.
์นจ๋์์ ํ์ฌ๊น์ง 1๋ถ [๋ง์ 392ํธ] ๋ฆฌ๋ชจํธ ์ํฌ์ ์ค์ฌ์ ์๋ณด๋ค ์๊ฒฉ ํด๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
github : ์ฌ๋์ฐ๋, ๊ฐ๋ฐ๋ฟ ์๋๋ผ ์ด์/๊ธฐํ/์ด๋ฒคํธ ๊ณต์ ์ ํ์ฉ Google Apps Slack : ๋ด ํ์ฉ (๋ค์ํ ์ข
๋ฅ์ ๋ด, ์ํฉ๋ง๋ค ํน์ ์๋ฆผ์ ์ค๋ค.) salesforce : CRM ํด zoom : ํ์ํ์ 200๋ช
๋์์ฝ ๊ฐ๋ฅ, ํ์๊ฐ ๋๋๋ฉด ๋
น์/๋
นํ/์คํฌ๋ฆฝํ
๊น์ง ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค (wow) pinboard : ๊ทผํ/์ธ์ฌ ๊ด๋ฆฌ์ฉ ์ฑ jira๋ ์ฌ์ฉ ์ ์ํจ ๋์ค์ ํ ๋ด Slack ๋ด์ผ๋ก ์ฌ๋ฌ๊ฐ์ง ๋ค์ํ ์๋ํ๋ฅผ ๊ตฌ์ฑํ ์ ์์๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
์คํ์์ค ์ํ๊ณ ์ผ์์ผ๋ก์์ ๊ฐ๋ฐ์ / ๋ณ์ ํ ๋ ์ฌํ์๋ถ์ด “์์์ฌ์ด๋๋"์ด๋ผ๊ณ ํ์๊ธธ๋ ์ค๋ง ํ๋ค. ๋ญ๊ฐ ์ ์๋๋ฉด ๊ตฌ๊ธ๋ง์ ํ๊ฒ๋๋๋ฐ ๋ด๊ฐ ์์ฃผ ๋ณด๋ ๋ธ๋ก๊ทธ๋ฅผ ์ด์ํ์
จ๋ ๋ถ์ด ๋ด๋์์ ใทใท… ์ธ์ ๋ถํฐ ํด์ผ์ง~๊ฐ ์๋๊ณ ๊ฐ๋ฐํ๋ค๋ณด๋ ์ด๋์ ์คํ์์ค์ ์ฐธ์ฌํ๊ณ ์์๋ค๊ณ ํ๋ค. ๋ํ ์ฐธ์ฌํ๋๊ฒ ์๋๊ณ ์ด๋ฏธ ์คํ์์ค ์ํ๊ณ์์์ ์ด๊ณ ์๋ ์ฐ๋ฆฌ๋ค์ด๋ผ ๋ง์ํ์๊ณ , ์คํ์์ค Contribution ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฌ์ฉ/ํ๋ณด/๋ฒ์ญ/๋ฆฌํฌํ
/๋ฌธ์ํ/์ฝ๋์ ์ถ ๋ฑ ๋ค์ํ๊ฒ ์์ผ๋ ์ด๋ ต๊ฒ ์๊ฐํ์ง ๋ง์ ๋ผ๊ณ ํ์
จ๋ค. ์คํ์์ค์์ ๋ฐฐ์ธ์ ์๋์ ์ ์ปค๋ฎค๋์ผ์ด์
์ ๋ฐฉ๋ฒ, ํ์
์ ๋ฐฉ๋ฒ๊ณผ ์ค์์ฑ, ํ
์คํธ์ฝ๋์ ์ค์์ฑ, ์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ, ์ฝ๋์ ํ์ง๊ด๋ฆฌ ๋ผ๊ณ ํ๋ค. ์ ์ ๋ฐํ๋ฅผ ๋ค์ผ๋ฉด์ ์คํ์์ค์ ๋ํ ์๊ฐ์ด ๋ฐ๋๊ณ ์๋ ๋ด ์์ ์ ๋๋์ ์์๋ค.
์ง๋ํฌ์คํ
์ ์ด์ด ์ด๋ฒ์ Flask์ Nginx๋ฅผ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. Apache๋ก ์ฐ๋ํ๋๋ฐ ์ ๋ Nginx๋ก ์ฐ๋ํ๋๊ฑธ ์ ๋ฆฌํ์ง(?)ํ๋ฉฐ ์๋ฌธ์ด ๋ค์ ์๋๋ฐ ๋ค๋ฅธ ํฌ์คํ
์ ๋ด๋ Apache + Flask ์กฐํฉ๋ณด๋ค Nginx + Flask ์กฐํฉ์ด ๋ ๋ง๊ณ ์ง๋ ํฌ์คํ
์์๋ ์์์์๋ฏ์ด (Apache VS Nginx) ๋์ค ์ด๋๊ฒ์ด ์ข๋ค๊ณ ํ ์๋ ์๊ณ ๊ฐ ์ํฉ์์ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค๋ฉด ์ด ๋ํ ๋๋ง์ ๋ฌด๊ธฐ๊ฐ ๋ ๊ฒ๊ฐ์ Nginx๋ฅผ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.
1๋ถ์์ ์ Flask์ธ๊ฐ, Flask์ ์ฅ์ ์ ๋ํด ์ ๋ฆฌ๋ฅผ ํ์ผ๋ ์ด๋ฒ ํฌ์คํ
์์๋ ๋ณ๋๋ก ์์ฑํ์ง ์๋๋ค.
Nginx ์ค์น ( https://nginx.org/en/ ) ์ญ์ ์์ค์ค์น๋ฅผ ํ๋ค.
- ๋ค์ด์ ๋ฐ๊ณ $ https://nginx.org/download/nginx-1.14.0.tar.gz - ์์ถ์ ํผ ๋ค์ $ tar -zxvf nginx-1.14.0.tar.gz - ํด๋๋ก ์ด๋ํด์ $ cd nginx-1.14.0 - ์ค์นํ ๋๋ ํ ๋ฆฌ๋ฅผ ์ค์ ํ๊ณ $ ./configure --prefix=/~~~/apps/nginx - make ํ์ผ์ ๋ง๋ค๊ณ $ make - ์ค์น๋ฅผ ์งํํ๋ค. $ make install ์ด๋ ๊ฒ ํ๋ฉด ์ผ๋จ Nginx๋ ์ค์น๊ฐ ๋์๋ค.
uWSGI ์ค์น ( https://uwsgi-docs.readthedocs.io/ ) ์์ Apache์ ์ฐ๋ํ ๋๋ ๋ณ๋์ ๋ชจ๋์ Apache์๊ฒ ๋ฑ๋กํ๋ ํํ์๋ค๋ฉด Nginx๋ WSGIํ๋กํ ์ฝ์ ํ์ฉํ๋ WSGI ์ดํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ ์ดํ๋ฆฌ์ผ์ด์
์๋ฒ๋ฅผ ํ์ฉํด์ผ ํ๋ค.
- ๋ค์ด์ ๋ฐ๊ณ $ wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz - ์์ถ์ ํ๊ณ $ tar zxvf uwsgi-latest.tar.gz - ํด๋๋ก ์ด๋ํ์ฌ $ cd uwsgi-2.0.17 - make ๋ช
๋ น์ด๋ฅผ ํธ์ถํ๋ฉด 'uwsgi'์ด๋ผ๋ ์คํํ์ผ์ด ์์ฑ๋๋ค. $ make Nginx ์ค์ Apache์ ๋น์ทํ๊ฒ uWSGI ๊ด๋ จ ์ค์ ์ ํด์ค๋ค.
server { listen 80; server_name localhost; location / { # ( / ) ๊ฒฝ๋ก๋ก ๋ค์ด์ฌ ๊ฒฝ์ฐ include uwsgi_params; # GET/POST ๋ฑ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ํ ํ๊ฒฝ๋ณ์๋ฅผ include ํด์ค๋ค. uwsgi_pass 127.0.0.1:3031; # ์์ฒญ์ IP:PORT๋ก ์ ๋ฌํ๋ค. } } ๋ณ๋์ ๋ชจ๋์ ์ฌ์ฉํ์ง ์๊ธฐ๋๋ฌธ์ ์ ๋ฌํด์ฃผ๋ (proxy๋๋) ์ค์ ์ ํด์ค๋ค.
uWSGI ์คํ ๋ฐ Nginx ์ฌ์์ ์์ ์ค์นํ uwsgi๋ฅผ ์๋์ฒ๋ผ IP:port ๋ฅผ ๋ช
์์ ์ผ๋ก ์ ์ด์ฃผ๊ณ (์์์ ์ ๋ฌ๋ฐ์ IP:PORT์ ๋์ผํ๊ฒ) Apache ์ฐ๋์ ํ์ฉํ๋ wsgiํ์ผ์ ์ด๋ฒ์๋ ๋์ผํ๊ฒ ์ฌ์ฉํ๋๋ก ํด์ ์คํํ๋ค.
$ ./uwsgi -s 127.0.0.1:3031 --wsgi-file /~~~/python_app/hello_world.wsgi ์ด๋ ๊ฒ ํ๋ฉด background๋ก ์คํ๋๋๊ฒ ์๋ foreground๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ &์ ์ฌ์ฉํ๋ค๋์ง ํด์ background๋ก ์คํ๋๋๋ก ํด์ค๋ค. ๊ทธํ Nginx๋ฅผ ์ฌ์์ ํด์ฃผ๋ฉด ์ํ๋ ๊ทธํ ๋ก ์ํ๋ Hello World!๋ฅผ ๋ง๋ ์๊ฐ ์๊ฒ ๋๋ค.
Apache์ฐ๋๊ณผ ์กฐ๊ธ ๋ค๋ฅธ์ ์ ๋ชจ๋์ ์ฌ์ฉํ์ง์๊ณ ๋ณ๋์ ์ ๋ฌ ์ดํ๋ฆฌ์ผ์ด์
(?)์ด ํ์ํ๋ค๋์ ์ด๋ค. ๊ฐ๋จํ Apache์ฒ๋ผ ๋ชจ๋๋ง ๋ฃ์ผ๋ฉด ๋๋๊ฒ ์๋๋ผ์ ๋ถํธํ ์๋ ์์๊ฒ ๊ฐ์ง๋ง ํํธ์ผ๋ก๋ ๊ด๋ฆฌํ ์์๋ ํฌ์ธํธ๊ฐ ๋ ๋์ด๋ ์
์ด๋ผ ์ด๋ค ์ธก๋ฉด์์๋ ํ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ๋ ๋์ด๋๊ฒ์ผ๋ก ๋ณผ์๋ ์๋ค.
๋ง์น๋ฉฐ ๋ง์ ์ ๋ฆฌํ๊ณ ๋๋ฉด ์๋ฌด๊ฒ๋ ์๋๋ฐ ์๊ธฐ ์ํด์ ๋ชธ๋ถ๋ฆผ์ ์ณ๊ฐ๋ฉฐ ์ฑ
์ด๋ฉฐ ๊ตฌ๊ธ๋ง์ ํ๋ ๊ณผ์ ์ ํตํด ์ ์ ์ฑ์ฅ์ ํ๋๊ฒ ๊ฐ๋ค. (์ฑ์ฅํต์ด๋ผ๊ณ ๋ ํ ๊น) ์ด๋ ๊ฒ ๋จ์ํ Flask๋ฅผ ํ ์์๋ค ๊ฐ ์๋ ์น์๋ฒ๋ฅผ ์ฐ๋ํ ์์๋ค. ๊ทธ๊ฒ๋ Apache์ Nginx ๋๊ฐ๋. ์ด๊ฒ๋ ์ธ์ ๊ฐ ๋๋ง์ ๋ฌด๊ธฐ๊ฐ ๋์ง ์์๊น?
Staticํ HTML์ด ์๋ ๋ก์ง์ด ํ์ํ API์๋ฒ๋ฅผ ๊ตฌ์ฑํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. (์ด์ ๊น์ง ์ง์์ผ๋ก)์ฒ์ ๋จธ๋ฆฟ์์ ๋ ์ค๋ฅด๋๊ฑด Java๋ฅผ ์ฌ์ฉํ๊ณ ์คํ๋ง์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค๊ณ apache์ tomcat์ ์ฐ๋ํ ๋ค์ …์ด๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก API์๋ฒ๋ฅผ ๊ตฌ์ฑํ ์ ์๊ฒ ์ง๋ง ํ๋กํ ํ์ดํ ๋๋ ํ
์คํธ ๋ชฉ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํด์๋ ์ค์ ํ๋ ์๊ฐ์ด ์๊ทผ ๋ง์ด ์์๋๋ค. (๋ฌผ๋ก Java Config, Spring Boot ๋ฑ ๊ฐ์ํด์ก์ง๋ง…) ์ผ๋ง์ ๋ถํฐ Python์ ๋ํ ๋งค๋ ฅ์ ๋ผ์ ๋ฆฌ๊ฒ ๋๋ผ๊ณ ์๋ค๋ณด๋ Python์ผ๋ก API์๋ฒ๋ฅผ ๊ตฌ์ฑํ ์ ์์๊น ์์๋ดค๊ณ (๋ชจ๋ฐ์ผ ๊ฒ์ ๋๋๊ณ ์๋ฒ๊ฐ python์ด๋ผ๊ณ ํ๊ธฐ๋ ํ๊ณ …) Flask์ Django๊ฐ ์์ด์ ๋๋ค ์จ๋ณธ ๊ฒฐ๊ณผ ํ์๋ Flask๊ฐ ๋ง๊ฒ ๋ค๊ณ ์๊ฐํด์ ์ ๋ฆฌ๋ฅผ ํด๋ณผ๊น ํ๋ค.
‘์ฅ๊ณ ’๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ Django์๋ ๋ชจ๋ ๊ฒ๋ค์ด ๋ค ๋ค์ด๊ฐ ์์ด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌด ํธ๋ฆฌํ๋ค. (DB, ์ด๋๋ฏผ ๋ฑ ) ํ์ง๋ง Flask๋ ๋ด๊ฐ ์ฌ์ฉํ ๊ฒ๋ค๋ง importํด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ผ ์ด๋ค ์ธก๋ฉด์์๋ ์๋ฌด๊ฒ๋ ์๋ค ํ ์ ์๊ฒ ์ผ๋ ์ปค์คํฐ๋ง์ด์ง์ ์ฉ์ดํ๋ค๊ณ ๋ณผ์ ์์๊ธฐ์ Flask๋ฅผ ์ ํํ๊ฒ ๋์๋ค. (Django๊ฐ Flask๋ณด๋ค ์์ข๋ค๋ ๋ง์ ์๋๋ ์คํด๋ ํ์ง ๋ง์๊ธธ…)
๊ธ์ฐ๊ธฐ์ ์์ ๋ณธ ํฌ์คํ
์ 2๊ฐ์ ํฌ์คํ
์ ๊ฑธ์ณ ์๋ฆฌ์ฆ(?)ํ์์ผ๋ก ์์ฑํ ์์ ์ด๋ค. 1๋ถ์์๋ Flask๊ฐ ๋ฌด์์ด๊ณ ์ด๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ฉฐ Apache์ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ , 2๋ถ์์๋ Nginx์ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค. ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ๋ค.
CentOS 7.4 Python 3.6 (๊ธฐ๋ณธ์ 2.7์ด์์ผ๋ ์ถ๊ฐ๋ก ์ค์น) Flask ( http://flask.pocoo.org/ ) ๊ณต์ ํํ์ด์ง์์๋ ๋ณด๋ฉด ์์ ์๋ฏ์ด ๋~๋ฌด ๊ฐ๋จํ๋ค. ๋จ์ง ์๋ ์ฝ๋ ๋ช์ค๋ง ์์ฑํ๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ ํ๋ก๊ทธ๋จ ์ด๊ธฐ ์์ฑ์ ํญ์ ๋ง๋๋ “Hello World"๋ฅผ ๋ณผ์ ์๋ค.
#hello_world.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" ์์๊ฐ์ด ์์ฑํ๊ณ python hello.py๋ก ์คํํด๋๊ณ ๋ธ๋ผ์ฐ์ ์์ http://127.0.0.1:5000 ์ ์์ฒญํ๋ฉด ๋ฐ๊ฐ์ด Hello World๋ฅผ ๋ง๋ ์ ์๋ค. (๋๋ฌด ๊ฐ๋จ;;) ์์ธํ ๋ฌธ๋ฒ์ ๋ํ๋จผํธ๋ฅผ ์ฐธ์กฐํ๋ฉด ๋ ๋ฏํ๊ณ ์ด Flask๋ฅผ ์๋ง ํ์ฉํ๋ค๋ฉด ๋ณด๋ค ๋น ๋ฅด๊ณ ๊ฐ๋จํ๊ฒ API์๋ฒ๋ฅผ ๊ตฌ์ฑํ ์ ์์๊ฑฐ๋ผ ์๊ฐํ๋ค.
Hello World๋ฅผ ์ฐ์์ผ๋ฉด ๋๊ฑฐ ์๋๊ฐ ๋ผ๊ณ ์ง๋ฌธํ ์๋ ์๊ฒ ์ผ๋ ์ค์ ์๋น์ค์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์๋จ์ ์น์๋ฒ๋ฅผ ๋๋๊ฒ ์ฌ๋ฌ ์ธก๋ฉด์์ ํจ์จ์ ์ด๋ค. ์ฃผ๋ก ์ฌ์ฉํ๋ ์น์๋ฒ๋ Apache ์ Nginx๊ฐ ์๋๋ฐ ์ฌ๊ธฐ์๋ Apache์ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌ ํด๋ณด๊ณ ์ ํ๋ค.
Apache ์ค์น ( http://archive.apache.org/ ) ์ฐ์ ํ์๋ yum ์ด๋ apt-get์ฒ๋ผ ํจํค์ง ๊ด๋ฆฌ์๋ก ์ค์นํ๋๊ฒ์ ๊ทธ๋ ๊ฒ ์ข์ํ์ง ์๋๋ค. ์ด์ ๋ ์ปค์คํฐ๋ง์ด์ง์ ํ ๊ฒฝ์ฐ ์์คํ
์ด๋๊ณณ์ ์ค์น๋์ด์๋์ง๋ฅผ ํ๋์ ํ์
ํ๊ธฐ ์ด๋ ต๊ณ ์๋์ฐ๊ฒฝ์ฐ Program Files์ฒ๋ผ ๋ด๊ฐ ์ถ๊ฐ๋ก ์ค์นํ๊ณ ๊ด๋ฆฌํ๋ ํ๋ก๊ทธ๋จ๋ค์ ํ๊ณณ์์ ๊ด๋ฆฌํ๊ณ ์ถ๊ธฐ์ ์ ๋งํ๋ฉด ์์ค๋ฅผ ์ง์ ์ปดํ์ผํ์ฌ ์ค์นํ๊ณค ํ๋ค. ์ด๋ฒ ์ญ์ ์ํ์น๋ ์์ค๋ก ์ค์นํ๋ ค๊ณ ํ๋ค. ํ์ฌ ์ํ์น๋ 2.4๋ฒ์ ์ด Stable๋ฒ์ ์ผ๋ก ๋์ด์์ง๋ง ๋ณด๋ค ๋ ํผ๋ฐ์ค๊ฐ ๋ง์ 2.2๋ฒ์ ์ผ๋ก ์ค์นํ๊ธฐ ์ํด ์ด๋ ต๊ฒ ์์นด์ด๋น๋ ๊ฒฝ๋ก๋ฅผ ํตํด ๋ค์ด์ ๋ฐ๊ณ ์ค์น๋ฅผ ํ๋ค.
- ๋ค์ด์ ๋ฐ๊ณ $ wget http://archive.apache.org/dist/httpd/httpd-2.2.29.tar.gz - ์์ถ์ ํผ ๋ค์ $ tar xvzf httpd-2.2.29.tar.gz - ํด๋น ํด๋๋ก ๋ค์ด๊ฐ $ cd httpd-2.2.29 - ์ปดํ์ผ ํ ์ค์น ๊ฒฝ๋ก๋ฅผ ์ ํด์ฃผ๊ณ $ ./configure --prefix=/~~~/apps/apache - make ํ์ผ์ ๋ง๋ ๋ค์ $ make - ์ค์น๋ฅผ ํด์ค๋ค. $ make install ์ด๋ ๊ฒ ๋๋ฉด /~~~/apps/apache/ ํ์์ ํ์ํ ํ์ผ๋ค์ด ์ค์น๊ฐ ๋๋๋ฐ root๊ณ์ ์ด ์๋ ์ผ๋ฐ๊ณ์ ์ผ๋ก ์คํํ๊ธฐ ์ํด์๋ /binํ์์ ์๋ httpd์ ๋ํ ์คํ/์์ ๊ถํ์ ๋ณ๊ฒฝํด์ค์ผ ํ๋ค. (์๋๋ฉด ๊ทธ๋ฅ root๊ถํ์ผ๋ก ์์/์ข
๋ฃ. ์? Apache๋ 80port๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ฆฌ๋
์ค์์๋ 1024 ์๋ port๋ฅผ ์ปจํธ๋กค ํ๊ธฐ ์ํด์๋ root๊ถํ์ด ์์ด์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅ, ๊ทธ๊ฒ ์๋๋ผ๋ฉด ์ด์ฒ๋ผ ๋ณ๋์ ์ค์ ์ด ํ์ํ๋ค.)
$ sudo chown root:๊ณ์ ๋ช
httpd $ sudo chmod +s httpd mod_wsgi ์ค์น ( https://code.google.com/archive/p/modwsgi/ ) ์น ์๋ฒ ๊ฒ์ดํธ์จ์ด ์ธํฐํ์ด์ค(WSGI, Web Server Gateway Interface)๋ ์น์๋ฒ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ธํฐํ์ด์ค๋ฅผ ์ํ ํ์ด์ ํ๋ ์์ํฌ๋ค. ๋ผ๊ณ ์ ์๋์ด์๋ค. ์ฆ, ์น์๋ฒ(Apache)์ ์์์ ๋ง๋ Flask ์ดํ๋ฆฌ์ผ์ด์
์ ์ฐ๋ํด์ฃผ๊ธฐ ์ํ ํ๋ ์์ํฌ์ด๋ค. ์ด๋ํ ์์ค๋ก ์ค์นํด๋ณด์. (์์ ๊ฐ์ ์ด์ ๋ก~)
- ๋ค์ด์ ๋ฐ๊ณ $ wget https://github.com/GrahamDumpleton/mod_wsgi/archive/3.5.tar.gz - ์์ถ์ ํผ ๋ค์ $ tar -zxvf 3.5.tar.gz - ํด๋์ ๋ค์ด๊ฐ์ $ cd mod_wsgi-3.5 - ์ํ์น์ ๋น๋ํด์ธ apxs์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํด์ฃผ๊ณ - ํ์์ ๊ฐ์ด ๊ธฐ๋ณธ python ๋ฒ์ ์ ์ฌ์ฉํ์ง ์์๊บผ๋ผ๋ฉด ๊ผญ python๊ฒฝ๋ก๋ฅผ ์ค์ ํด์ค์ผ ํ๋ค!
์น์๋ฒ๋ HTTP ํ๋กํ ์ฝ์ ํตํด ์ฝํ์ ์๋ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์น ์ดํ๋ฆฌ์ผ์ด์
์ ์๋จ์ ๋ฐฐ์น๋๊ณค ํ๋ค. ๋์ ์ธ ๋ฆฌ์์ค๋ WAS์๊ฒ ์ฒ๋ฆฌํ๋๋ก ํ๊ณ ์ ์ ์ธ ๋ฆฌ์์ค๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ์๋ ์๋ค. ํฌ๊ฒ Apache์ Nginx๊ฐ ์ฌ์ฉ๋๊ณค ํ๋๋ฐ ์ด ๋์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น?์ฌ์ค ํ์๋ ์ฌ๋ด์์ ์ฃผ๋ก Apache๋ง ์ฌ์ฉํ๋ค๋ณด๋ Nginx๋ ๊ทธ์ Apache์๋ ๋ค๋ฅธ ๋ฐฉ์์ ์น์๋ฒ๋ค ๋๋ ๋ณด๋ค ๊ฒฝ๋ํ ๋์๋ค ์ ๋๋ก๋ง ์๊ณ ์์๋๋ฐ ์ด๋ฒ๊ธฐํ๋ฅผ ํตํด ์ ๋๋ก ์๊ณ ๋น๊ต๋ฅผ ํด๋ณด๋ฉด์ ๊ฒฐ๊ตญ ์ด๋ค๊ฒ ์ข์์ง ์์๋ณด๊ณ ์ ํ๋ค.
๊ตฌ๊ธ๋ง์ ์กฐ๊ธ๋ง ํด๋ณด๋ฉด Apache์ Nginx๋ฅผ ๋น๊ตํ๋ ํฌ์คํ
์ด ๋ง์ด ๋์จ๋ค. ์ด๋ฒ ํฌ์คํ
์ ๋ชฉ์ ์ด๋ฌํ ์ ๋ณด๋ค์ ๋จ์ํ ์์ฝ/์ข
ํฉ ํ๋ ค๋๊ฒ ์๋๊ณ , ์ต๋ํ ์ค๋ฌด ์๋น์ค๋ฅผ ์ด์ํ๋ ์๊ฐ์ผ๋ก ์ ๋ฆฌํ๊ณ ์ ํจ์ ๋ฐํ๋ค.
Apache ( https://httpd.apache.org/ ) ์ฐ๋ฆฌ๋๋ผ์์ ์น์ดํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๋ ์ฌ๋๋ค์ ํ๋ฒ์ฏค์ ๋ค์ด๋ดค์ Apache. ๊ตญ๋ด ์ผ๋ฐ์ ์ธ ๊ธฐ์
์์ ์น์๋ฒ์ ํ์ค์ผ๋ก ์๋ฆฌ์ก์๋ค๊ณ ํด๋ ๊ณผ์ธ์ด ์๋๊ฒ ๊ฐ๋ค. Client์์ ์์ฒญ์ ๋ฐ์ผ๋ฉด MPM (Multi Processing Module : ๋ค์ค์ฒ๋ฆฌ๋ชจ๋) ์ด๋ผ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๋๋ฐ ๋ํ์ ์ผ๋ก๋ Prefork์ Worker๋ฐฉ์์ด ์๋ค. ๊ฐ๋จํ๊ฒ ์ด๋ค์์ผ๋ก ์ฒ๋ฆฌํ๋์ง ์๊ณ ๋์ด๊ฐ์.
Prefork MPM Prefork MPM, http://old.zope.org/Members/ike/Apache2/osx/configure_html" Prefork MPM, http://old.zope.org/Members/ike/Apache2/osx/configure_html ์คํ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ ๋์ด ์ฒ๋ฆฌ๊ฐ ๋๋ค. ๊ฐ ํ๋ก์ธ์ค๋ ํ๋ฒ์ ํ ์ฐ๊ฒฐ๋ง ์ฒ๋ฆฌํ๊ณ ์์ฒญ๋์ด ๋ง์์ง์๋ก ํ๋ก์ธ์ค๋ ์ฆ๊ฐํ์ง๋ง ๋ณต์ ์ ๋ฉ๋ชจ๋ฆฌ์์ญ๊น์ง ๋ณต์ ๋์ด ๋์ํ๋ฏ๋ก ํ๋ก์ธ์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๊ฐ ์์ด ์์ ์ ์ด๋ผ ๋ณผ์ ์๋ค.
Worker MPM Worker MPM, http://old.zope.org/Members/ike/Apache2/osx/configure_html" Worker MPM, http://old.zope.org/Members/ike/Apache2/osx/configure_html Prefork ๋์๋ฐฉ์์ด 1๊ฐ์ ํ๋ก์ธ์ค๊ฐ 1๊ฐ์ ์ค๋ ๋๋ก ์ฒ๋ฆฌ๊ฐ ๋์๋ค๋ฉด Worker ๋์๋ฐฉ์์ 1๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๊ฐ๊ฐ ์ฌ๋ฌ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. ์ฐ๋ ๋๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ฉฐ PreFork๋ฐฉ์๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํ๋ ์ฅ์ ์ด ์๋ค.
์ฐธ๊ณ ๋ก WAS๋ก tomcat์ ์ฐ๋ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด mod_jk, mod_proxy, mod_proxy_ajp ๋ฐฉ์์ Apache ์์ฒด์ ์ผ๋ก ์ง์ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ค์ํ๊ณ ํจ์จ์ ์ผ๋ก tomcat์ ์ฐ๋ํ ์ ์๋ค. ์ฐธ๊ณ ๋งํฌ
Nginx ( https://nginx.org/en/ ) Nginx์ ๋ํด ์ดํด๋ณด๊ธฐ ์ ์ ๊ตฌ๊ธ ํธ๋๋๋ฅผ ํ์ฉํ์ฌ Nginx์ ๋ํ ๊ด์ฌ์ด ์ด๋์ ๋์ธ์ง๋ฅผ ๋ณด๊ณ ๋์ด๊ฐ์.
์ต๊ทผ 5๋
๊ฐ ๊ตฌ๊ธํธ๋๋, ํ๋์์ด Apache์ด๊ณ ๋นจ๊ฐ์์ด Nginx" ์ต๊ทผ 5๋
๊ฐ ๊ตฌ๊ธํธ๋๋, ํ๋์์ด Apache์ด๊ณ ๋นจ๊ฐ์์ด Nginx ์ ์ธ๊ณ๋ Nginx๋ณด๋ค๋ Apache์ ๋ํ ๊ด์ฌ์ด ๋ง์๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ ๊ตญ๋ด๋ ์์ฃผ ์กฐ๊ธ์ฉ Nginx์ ๋ํ ๊ด์ฌ์ด ์ค๋ฅด๋๊ฒ์ ๋ณผ์์์๋ค. (๊ทธ๋๋ ์์ง์ Apache๊ฐ ์๋ฑํ ์ฐ์ธํ ํธ์ด๋ค.) ๊ทธ๋ผ Nginx๋ ์ด๋ค์์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ผ๊น? ๊ฐ์ฅ ์ ๋ช
ํ(?) ํน์ง์ด๋ผ๋ฉด Event Driven ๋ฐฉ์์ ๊ผฝ์์ ์์๊ฒ ๊ฐ๋ค. Event Driven ๋ฐฉ์์ ๋ํด ์ ๊น ์ธ๊ธ์ ํ๊ณ ๋์ด๊ฐ๋ฉด ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ด๋ค ๋์์ ํด์ผํ๋์ง๋ง ์๋ ค์ฃผ๊ณ ๋ค๋ฅธ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. (Producer Consumer Pattern๊ณผ ์ ์ฌํ๋ค.) ๊ทธ๋ฌ๋ค๋ณด๋ ํ๋ก์ธ์ค๋ฅผ forkํ๊ฑฐ๋ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ๋ ์ํ์น์๋ ๋ฌ๋ฆฌ CPU์ ๊ด๊ณ์์ด ๋ชจ๋ IO๋ค์ ์ ๋ถ Event Listener๋ก ๋ฏธ๋ฃจ๊ธฐ ๋๋ฌธ์ ํ๋ฆ์ด ๋๊ธฐ์ง ์๊ณ ์๋ต์ด ๋น ๋ฅด๊ฒ ์งํ์ด ๋์ด 1๊ฐ์ ํ๋ก์ธ์ค๋ก ๋ ๋น ๋ฅธ ์์
์ด ๊ฐ๋ฅํ๊ฒ ๋ ์ ์๋ค. ์ด๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ธ ์ธก๋ฉด์์ Nginx๊ฐ System Resource๋ฅผ ์ ๊ฒ ์ฒ๋ฆฌํ๋ค๋ ์ฅ์ ์ด ์๋ค๊ณ ํ๋ค.
Nginx Process Model (https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale)" Nginx Process Model (https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale) ๊ทธ๋์ ๋ญ๊ฐ ์ข์๊ฐ? ์ด ํฌ์คํ
์ ์ ์ผ๋ฉด์ ๋ง์ง๋ง์ Apache๊ฐ ๋์ข๋ค ๋๋ Nginx๊ฐ ๋์ข๋ค๋ก ๋ง๋ฌด๋ฆฌ๋ฅผ ์ง๊ณ ์ถ์๋๋ฐ ์ด๋ ์์ฌ/๊ต์ ํ๋ก๊ทธ๋จ์ฒ๋ผ ์ด์ฉ์ ์๋ ์ด๋ฆฐ๊ฒฐ๋ง๋ก ๋ง๋ฌด๋ฆฌ๋ฅผ ์ง์์๋ฐ์ ์์๊ฒ ๊ฐ๋ค. (์ด์ฐ๋ณด๋ฉด ์ด๊ฒ ์ ๋ต์ผ์๋?)
๊ธฐ์ ์ ์ ํ์ ์์ด์ ์ ๋ต์ ์๋๊ฒ ๊ฐ๋ค.(๋ฌผ๋ก Spring ์ ์ฌ์ฉํ๋๋ ์๋ธ๋ฆฟ์ ์ง์ ๊ตฌํํ๋๋ ์๋ ์ข ๋ค๋ฅธ ์ฑ๊ฒฉ์ ์ด์ผ๊ธฐ;;) ์ด์ํ๊ณ ์๋ ์๋น์ค์ ์ํฉ์ ์ ์๊ณ ํ๋์ ํด๊ฐ๋ฉด์ ๊ฐ์ฅ ํจ์จ์ ์ธ๊ฒ์ ์ ํํ๋๊ฒ ์ ๋ต์ด๋ผ๊ณ ๋งํ ์ ๋ฐ์… ์ปค๋ฎค๋ํฐ ํ์๋ฅผ ๋ฌด์ ๋ชปํ๊ธฐ ๋๋ฌธ์ Apache๋ฅผ ์ ํํ ์๋ ์์ํ
๊ณ , ์ ์ ๊ด์ฌ๋๊ฐ ์ฌ๋ผ๊ฐ๋ค๋๊ฑด ๊ทธ๋งํผ์ ์ฅ์ ์ด ์๊ณ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ๋์ ์ ์ฒ๋ฆฌ์ ํจ์จ์ ์ธ Nginx๋ฅผ ์ฌ์ฉํ ์ ์์๊ฒ ๊ฐ๋ค.
์ ๋ฆฌํ๋ฉด. ๋ด๊ฐ ์ฌ์ฉํ๊ธฐ์ ์ด๋ ค์์ด ์๋ ๋๊ตฌ๋ฅผ ์ ํ์ฉํ๋๊ฒ, ๊ทธ๋ ๋ค๊ณ ์ค๋๋ ๊ธฐ์ ์ด ํธํ๋ค๊ณ ์ง์ฐฉํด์๋ ์๋๋ฉฐ, ์๋ก์ด ๊ธฐ์ ์ ๋๋ ค์ ํ์ง๋ง๊ณ ๊ฒฝํ์ ํด๋ณธ ๋ค์ ๊ฒฐ์ ์ ํ ๊ฒ ์ด๋ผ๊ณ ๋ด๋ฆด์ ์์๊ฒ ๊ฐ๋ค. (์ด๋ ต๋ค…ใ
ใ
)
์ฐธ๊ณ ํฌ์คํ
http://www.mukgee.com/?p=293 http://knot.tistory.com/88 http://tmondev.blog.me/220737182315 http://tmondev.blog.me/220731906490 http://urin79.com/blog/20654191 http://jaweb.tistory.com/entry/apache-%EC%99%80-Nginx-%EB%AD%90%EA%B0%80-%EC%A2%8B%EC%9D%80%EA%B1%B0%EC%95%BC
๊ธ๋ณํ๋ ๋ ์จ๋ฅผ ์์ธกํ๋ ค๋ฉด ์ด๋ ํ ์ ๋ณด๊ฐ ์์ด์ผ ํ ๊น? ๋๋ ๋งํธ๋ฅผ ์ด์ํ๋ ๋ด๋น์์ธ ๊ฒฝ์ฐ ๋งค์ฅ ์ด์์๊ฐ์ ์ ํด์ผ ํ๋ค๋ฉด ์ด๋ ํ ๊ธฐ์ค์ผ๋ก? ๋จ๊ฑฐ์ด ๊ฐ์์ธ ๋นํธ์ฝ์ธ ์์ฅ์์ ์์ต์ ์ป์ผ๋ ค๋ฉด ์ด๋ค ์ ๋ณด๋ค์ด ์์ด์ผ ๋ฌผ๋ฆฌ์ง(?) ์์์ ์์๊น?
์ ์ง๋ฌธ์ ๊ณตํต๋ ์ ๋ต์ ์์ ๊ธฐ๋ก๋ค์ธ๊ฒ ๊ฐ๋ค. ๋ ์จ์์ธก์ ๊ธฐ์์ฒญ์์ ๊ณผ๊ฑฐ ๊ธฐ๋ก๋ค์ ๋ณด๊ณ ๋น๊ฐ ์ฌ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๊ณ ( ๊ณผ๊ฑฐ ๋ ์จ ์๋น์ค๋ฅผ ๋ด๋นํด๋ดค์ง๋ง ๋จ์ํ ๊ณผ๊ฑฐ ๊ธฐ๋ก๋ค๋ก ์์ธกํ๋ค๋๊ฑด ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น๊ธด ํ๋ค. ) ๋งค์ฅ ์ด์์๊ฐ์ ์์ ์ ์๋๋ค์ด ์ธ์ ์๋์ง์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ . ๋นํธ์ฝ์ธ์ด๋ ์ฃผ์์ ์ฐจํธ๋ฅผ ๋ณด๊ณ ์ด๋์ ๋๋ ์์น์ฅ์ผ์ง ํ๋ฝ์ฅ์ผ์ง ์ถ์ธก์ด ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค. ( ๋ฌผ๋ก ํธ์ฌ/์
์ฌ์ ๋ฐ๋ผ ํ๋ค๋ฆฌ์ง๋ง..ใ
ใ
..?? ) ์ด์ฒ๋ผ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ๋ง๋ค์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋๊ฒ์ ์๊ณ์ด ๋ฐ์ดํฐ ๋ถ์์ด๋ผ ๋ถ๋ฅด๊ณ ์๋ค. ํ์๊ฐ ์ด์ํ๋ ์๋น์ค์์ ์๊ณ์ด ๋ฐ์ดํฐ ๋ถ์์ ํตํด ์ฅ์ ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ๋ ์ฌ๋ก๋ฅผ ๊ณต์ ํด๋ณด๊ณ ์ ํ๋ค.
์ํฉํ์
๋ถํฐ ์์๋ณ๋ฒ์๋ ์งํผ์ง๊ธฐ ๋ฐฑ์ ๋ถํ ๋ผ๋ ๋ง์ด ์๋ค. ๊ทธ๋งํผ ํ ์ํฉ์ ์ ์์์ผ ๋์์ ์ํ ์ ์๋ค๋๊ฒ. ํ์๊ฐ ์ด์ํ๋ ์๋น์ค๋ PG(Payment Gateway) ์๋น์ค๋ก ์ผํ๋ชฐ๊ฐ์ ์จ/์คํ๋ผ์ธ ์ฌ์
์์ ์ค์ ์นด๋์ฌ์์ ์ค๊ฐ ์ญํ์ ํด์ฃผ๊ณ ์๋ค. ์ด๋ฅผํ
๋ฉด ์ฌ์ฉ์๊ฐ ์์๋ฅผ 10,000์์ XX์นด๋๋ก ๊ตฌ๋งคํด์ค ๋ผ๊ณ ์์ฒญ์ด ์ค๋ฉด ๊ทธ ์ ๋ณด๋ฅผ ๋ค์ ํ์์ ๋ง์ถฐ ์นด๋์ฌ๋ก ์ ๋ฌํ์ฌ ์ฌ์ฉ์๊ฐ ๋ฌผ๊ฑด์ ๊ตฌ๋งคํ ์ ์๋๋ก ํด์ค๋ค.
PG์๋น์ค : ์ผํ๋ชฐ๊ณผ ์นด๋์ฌ์ ์ค๊ฐ์์ ๋ฆด๋ ์ด ํด์ฃผ๋ ์ญํ์ด๋ผ ๋ณด๋ฉด๋๋ค." PG์๋น์ค : ์ผํ๋ชฐ๊ณผ ์นด๋์ฌ์ ์ค๊ฐ์์ ๋ฆด๋ ์ด ํด์ฃผ๋ ์ญํ์ด๋ผ ๋ณด๋ฉด๋๋ค. ์๊ตฌ์ฌํญ ๋ฐ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ ๋ถ์ ์๋น์ค๋ฅผ ์ด์ํด๋ณด๋ ๊ฐ์งํ๊ธฐ ์ด๋ ค์ด ์ํฉ๋ค์ด ์์๋ค.
์ฐ๋ํ๋ ์ผํ๋ชฐ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋คํธ์ํฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ฆ, ํธ๋ํฝ์ด ํ์๋ณด๋ค ์ ๊ฒ ๋ค์ด์ฌ ๊ฒฝ์ฐ ์ ์์ ์ธ ์๋ฌ(e.g. ์์ก๋ถ์กฑ) ๊ฐ ๊ฐ์๊ธฐ ๋ง์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ถ์ํ๊ธฐ์ํด ๊ธฐ์กด์ ํธ๋ํฝ/๋ฐ์ดํฐ๋ฅผ ๋ถ์ํด๋ด์ผ ํ๋ค.
๊ฒฐ์ ๊ฑด์ Kibana Visualize, ๊ธฐ์์ด ํจํด" ๊ฒฐ์ ๊ฑด์ Kibana Visualize, ๊ธฐ์์ด ํจํด ์ ๊ทธ๋ํ๋ ๊ฒฐ์ ๋ฐ์ดํฐ ์นด์ดํธ ์ธ๋ฐ ์ด๋์ ๋ ํจํด์ ์ฐพ์์ ์๋ค.
์๋ฌ๊ฑด์ Kibana Visualize, ์
์ด ํจํด..(๋ฌด๋ฆฌ์..)" ์๋ฌ๊ฑด์ Kibana Visualize, ์
์ด ํจํด..(๋ฌด๋ฆฌ์..) ์ ๊ทธ๋ํ๋ ์๋ฌ์นด์ดํธ ์ธ๋ฐ ์ผ์ ํ ํจํด ์์์ ์ด๋ ์ง์ ์์๋ ํ๋๊ฒ์ ํ์ธํ ์ ์๋ค. (๋นจ๊ฐ์ ์์ญ) ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ์ฅ์ ์ํฉ๋ณด๋ค ์์์ ๊ฐ์ง๋ฅผ ํ ์ ์์๊น? ( ์ฅ์ : ์ด๋ ํ ๋ด/์ธ๋ถ ์์ธ์ผ๋ก ์ธํด ์ ์์ ์ธ ์๋น์ค๊ฐ ๋์ง ์๋ ์ํ )
์ฅ์ ๋ฐ์ ์ ์ ๋จผ์ ์ฐพ์๋ณด์! ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ๋ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ์๋์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด ์์์ ์๋ค. ์๋ก๋ค์ด ์์ ์ฆ์์๋ ๊ฒฐ์ ๋์ด ๊ฐ์ฅ ๋ง๊ธฐ๋๋ฌธ์ ์ฝ xx๊ฑด์ผ๋ก ์ค์ ํด๋๊ณ , ์๋ฒฝ์๋ ๊ฒฐ์ ๋์ด ๊ฐ์ฅ ์ ๊ธฐ ๋๋ฌธ์ ์ฝ yy๊ฑด์ผ๋ก ์ค์ ํด๋ ํ ์๋ฌ ๊ฑด์๋ ๊ฒฐ์ ๊ฑด์์ ๋ํด ์ค์๊ฐ์ผ๋ก ๊ฒ์ฌ๋ฅผ ํด๊ฐ๋ฉด์ ์ค์ ํ ๊ฐ๋ณด๋ค ๋ฒ์ด๋ ๊ฒฝ์ฐ ์๋ฆผ์ ์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค. ํ์ง๋ง ์๋ฌด๋ฆฌ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ์๋ฒฝํ๊ฒ ๋ถ์ํ๋ค ํ ์ง๋ผ๋ 24์๊ฐ ๋ชจ๋ ์์ ์์ ์์ธก์ ๋ฒ์ด๋ ์๋ฐ์ ์๋ค. (์๋ก๋ค์ด ์ผํ ์ด๋ฒคํธ๋ฅผ ๊ฐ์์ค๋ฝ๊ฒ ํ๊ฒ๋๋ฉด ๊ฒฐ์ ๋์ ์์ธกํ์ง ๋ชปํ ์ ๋๋ก ๋์ด๋ ํ
๊ณ …) ๋ํ ์ค์ ํ ์์ธก๊ฐ์ ๋ฒ์ด๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ๋ค์ ์์ธก๊ฐ์ ์กฐ์ ํด์ค์ผ ํ๋๋ฐ, ์ด๋ด๊บผ๋ฉด 24์๊ฐ ์ข
ํฉ ์ํฉ์ค์์ ์ฌ๋์ด ์ง์ ๋์ผ๋ก ๋ณด๋๊ฒ ๋ณด๋ค ๋ชปํ ๊ฒ ๊ฐ๋ค. (์ธ๋ ฅ ๋ฆฌ์์ค๊ฐ ์ถฉ๋ถํ๋ค๋ฉด ๋ญ… ๊ทธ๋ ๊ฒ ํด๋ ๋๋ค.)
์ง๋ ๋ฐ์ดํฐ์ ๋น๊ตํ๊ธฐ ์ผ์ฃผ์ผ ๊ธฐ์ค์ผ๋ก ์ง๋ ์ผ์ฃผ์ผ๊ณผ์ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํด๋ณด๋ ๋ฐฉ๋ฒ๋ํ ์๋ค. ๊ฐ๋จํ๊ฒ ์ค๋ช
ํ๋ฉด ์ด๋ฒ์ฃผ ์์์ผ 10์์ ๋ฐ์ดํฐ์ ์ง๋์ฃผ ์์์ผ 10์์ ๋ฐ์ดํฐ์ ์ฐจ์ด๋ฅผ ๋น๊ตํด๋ณด๋ ๋ฐฉ๋ฒ์ด๋ค. ํค๋ฐ๋์์ ํด๋ฆญ ๋ช๋ฒ๋ง์ผ๋ก ์๊ฐํ๋ฅผ ๋์์ฃผ๋ Visualize ๊ธฐ๋ฅ์ ํตํด ์ง๋ ์ผ์ฃผ์ผ๊ณผ ์ด๋ฒ์ฃผ๋ฅผ ๋น๊ตํด๋ณด๋ฉด ์๋ ๊ทธ๋ํ์ฒ๋ผ ํํ์ด ๊ฐ๋ฅํ๋ค.
์ผ์ฃผ์ผ ์ ๋ฐ์ดํฐ์ ๋จ์ ๋น๊ต" ์ผ์ฃผ์ผ ์ ๋ฐ์ดํฐ์ ๋จ์ ๋น๊ต ์ด ๊ฒฝ์ฐ๋ ์ง๋์ฃผ ์ํฉ๊ณผ ์ด๋ฒ์ฃผ ์ํฉ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์ํ๋ ๋น๊ต ํญ๋ชฉ ์ธ์ ๋ค๋ฅธ ์์ธ์ด ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ์ํ๋ ๋น๊ต๋ฅผ ํ ์๊ฐ ์๊ณ ์์์ ์๋์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ณ๋ฐ ๋ค๋ฅผ๋ฐ ์์๊ฒ์ผ๋ก ์๊ฐ๋๋ค.
์กฐ๊ธ๋ ์ฐ์ํ๊ฒ! (์ธ์ ๋ถํด๊ฐ ์ฐ์ํ๋จ ๋ง์ ์ข์ํ๋๊ฒ ๊ฐ๋ค..) ๊ฐ๋ฐ์๋ ๋ฌธ์ ์ ๋ํด์ ์ธ์ ๋ ๋ถ์์ ํ ๋๋ก ์ ๊ทผ์ ํ๋๊ฒ์ ๋ชฉํ๋ก ํด์ผํ๋ค. ์ธ์ ๋ถํด๊ฐ Hotํ ๋จธ์ ๋ฌ๋์ ๋์
ํด ๋ณด๊ณ ์ถ์์ผ๋ ์์ง ๊ทธ๋ฐ ์ค๋ ฅ์ด ๋์ง ๋ชปํ๊ณ … ํญํ ๊ตฌ๊ธ๋ง์ ํตํด ์๊ฒ๋ Facebook์์ ๋ง๋ Prophet์ด๋ผ๋ ๋ชจ๋์ ํ์ฉํด๋ณด๊ณ ์ ํ๋ค. https://opensource.fb.com/#artificial ์ด๊ณณ์ ๊ฐ๋ณด๋ฉด ์ฌ๋ฌ Artificial Intelligence ๊ด๋ จ๋ ์คํ์์ค๋ค์ค์ Prophet ๋ชจ๋์ ์ฐพ์์ ์๋ค.
์์ ์ ์ํ์น ๋ก๊ทธ๋ฅผ ์๋ผ์คํฑ ์คํ์ ํ์ฉํ์ฌ ๋ด ์๋ฒ์ ๋๊ฐ ๋ค์ด์ค๋์ง๋ฅผ ํ์ธํ ์ ์๋๋ก ๊ตฌ์ฑ์ ํด๋๊ณ ๋ช์ผ๊ฐ ์ง์ผ๋ณด๋ ๋ค์๊ณผ ๊ฐ์ ์์ธ์ค ๋ก๊ทธ๊ฐ ๋ฐ์ํ๊ณ ์์๋ค.1.2.3.4 - - [26/Apr/2018:01:27:33 +0900] "GET /aaa/ HTTP/1.1" 200 6001 30788 "http://www.naver.com" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:28:08 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:28:08 +0900] "-" 408 - 28 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:28:08 +0900] "-" 408 - 12 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:28:08 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:28:50 +0900] "GET /aaa/ HTTP/1.1" 200 5999 13521 "http://www.naver.com/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:29:14 +0900] "GET /aaa/ HTTP/1.1" 200 5996 19437 "http://www.naver.com" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:29:15 +0900] "GET /aaa/ HTTP/1.1" 200 5997 17553 "http://www.naver.com" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:29:15 +0900] "GET /aaa/ HTTP/1.1" 200 5998 17429 "http://www.naver.com/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:29:53 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:29:53 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:29:53 +0900] "-" 408 - 32 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:29:53 +0900] "-" 408 - 38 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:29:53 +0900] "-" 408 - 29 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:30:54 +0900] "GET /aaa/ HTTP/1.1" 200 6000 17881 "http://www.naver.com" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" 1.2.3.4 - - [26/Apr/2018:01:31:34 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:31:34 +0900] "-" 408 - 30 "-" "-" 1.2.3.4 - - [26/Apr/2018:01:31:34 +0900] "-" 408 - 25 "-" "-" ํ์๊ฐ์ ๋ง๊ฑด์ด์ ์๋ต์ฝ๋๋ 408, referrer๋ ์๊ณ , useragent๋ ์๋, ip๋ค๋ ๋งค์ฐ ๋ค์ํ ์ด์ํ ๋
์๋ค์ด ์์ฒญ๋๊ณ ์์๋ค.
์ด๋ ๊ฒ ์์ธ์ค ๋ก๊ทธ๋ฅผ ๋ถ์ํ ์ ์๋ ๊ตฌ์ฑ์ ํด๋๊ณ ๋๋ ๋ณด์์ง ์๊ทธ๋ฌ์ ๊ทธ๋ฅ ์ง๋๊ฐ์ ํฐ..
์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ํค๋ฐ๋์์ ๋ณด๋ฉด ์๋์ฒ๋ผ ๋ณผ์์๋๋ฐ ํ๋์ ๋ด๋ ๊ณผ์ฐ ์๋ฏธ์๋ ์์ฒญ๋ค์ผ๊น? ํ๋ ์๊ตฌ์ฌ์ด ๋ค์ ๋์ด๋ค. (1์๊ฐ ์ํ์น ์์ธ์ค ๋ก๊ทธ)
์ฃผํฉ์์ด 408์๋ต" ์ฃผํฉ์์ด 408์๋ต ๊ทธ๋ผ ์ด๋ฐ ํธ์ถ๋ค์ ๋๋์ฒด ๋ญ๊น? ์ฒ์ฒํ ์๊ฐ์ข ํด๋ณด์.
์ ์์ ์ด์ง ์๋ ํธ์ถ๋ก ์ฐ๋ฆฌ ์๋ฒ์ ์ทจ์ฝ์ ์ ํ์
ํ๋ ค ํ๋๊ฒ๋ค์ผ๊น? ์๋ต์ฝ๋ 408์ ์์ฒญ์๊ฐ์ด๊ณผ ์๋ต์ฝ๋์ธ๋ฐ… ์คํ๋ ค ํด๋ผ์ด์ธํธ ์
์ฅ์์ ๋ฌธ์ ๊ฐ ์๋๊ฑด ์๋๊น? ์ดํ๋ฆฌ์ผ์ด์
๋ก์ง์ด ์๋ชป๋์ด ๋ฌดํ๋ฃจํ์ ๋น ์ก๋; ์ํค๋ฐฑ๊ณผ์์๋ ์ํ์น ์๋ต์ฝ๋ ์ค 408์ ๋ํ ์๋ต์ ๋ค์๊ณผ ๊ฐ์ด ์๋ ค์ฃผ๊ณ ์๋ค.
The server timed out waiting for the request. According to HTTP specifications: “The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time
์ฆ, ์ํ์น ๋จ์์ ํ์์์์ ๋ด๋ฒ๋ฆฌ๋ ์ํฉ. ์ฌ๋ฌ ๋ค์ํ ํค์๋๋ค๋ก ๊ตฌ๊ธ๋ง์ ํด๋ด๋ ์ด๋ ๋คํ ๊ฒ์๊ฒฐ๊ณผ๋ฅผ ์ฐพ์ง ๋ชปํ๊ณ ๋คํธ์ํฌ ๊ด๋ จ์ํฉ์ธ์ง ์ถ์ด ํฌ๋กฌ ๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ์ด์ด ๋คํธ์ํฌ ์ง์ฐ ํ
์คํธ๋ฅผ ํด๋ณด์์ผ๋ ๋ณ ํจ๊ณผ๊ฐ ์์๋ค. ๊ทธ๋ ๊ฒ ๋ฒ์ธ์ฐพ๋ ํ์ฌ์ ์ฌ์ ์ผ๋ก ์ด๊ฒ์ ๊ฒ ์์๋ณด๋ค ์ฐ์ฐํ ์ง์์ ์๊ฒฉ์ผ๋ก ํ์ฌ VPN ๋ถ์ด์ ํ
์คํธ ํ๋๋์ค ๊ด๋ จ ์ฆ์์ ์ฌํ ํ ์ ์๊ฒ ๋์๋ค.
# ์ฌํ์ํฉ ์ฐ์ ์ํ์น๋ฒ์ ์ 2.2์ด๊ณ KeepAlive Off๊ฐ ๋์ด์๋ ์ํฉ. ์๋๊ทธ๋ฆผ์ฒ๋ผ ์งPC - ๊ณต์ ๊ธฐ - VPN - Apache - tomcat jenkins ์ํฉ์ด์๋๋ฐ ์ ํจ์ค์ ํ๋ฒ ์ ์ํ์๋ ํญ์ 408 ์๋ต์ด ์ฃผ๋ฃจ๋ฃฉ(?
Desktop ๋ฐ ์ค๋งํธํฐ์ ๋์คํ๋ก ๋ค์ํ OS์ ๋ธ๋ผ์ฐ์ ๋ค์ ์ฌ์ฉํ๊ฒ ๋์๋ค. ์ด๋, ๋ด๊ฐ ์ด์ํ๋ ์น์๋ฒ์ ๋ค์ด์ค๋ ์ฌ๋๋ค์ ๋ฌด์จ ๊ธฐ๊ธฐ๋ก ์ ์์ ํ๋ ๊ฒ์ผ๊น? ํน์ฌ ํน์ OS์ ํน์ ๋ธ๋ผ์ฐ์ ์์๋ง ์๋๋ ๋ฒ๊ทธ๋ฅผ ์ก๊ธฐ ์ํด ๋ช์ผ๋ฐค์ ๊ณ ์ํ๋ฉฐ ๊ฒจ์ฐ ์์ ํ๋๋ฐ… ๊ณผ์ฐ ๊ทธ OS์ ๋ธ๋ผ์ฐ์ ์์๋ ์ ์์ ํ๊ธฐ๋ ํ๋๊ฑธ๊น? (ใ
ใ
) ๋ง์ฝ, ์ ์ ์ฌ์ฉ์์ Device ์ ๋ณด๋ฅผ ์๊ณ ์๋ค๋ฉด ๊ณ ์ํ๋ฉฐ ๋ฒ๊ทธ๋ฅผ ์ก๊ธฐ ์ ์ ๋จผ์ ํด๋น Device ์ฌ์ฉ์จ์ ์ฒดํฌํด ๋ณผ์๋ ์๊ณ (์์ ์ด ์๋ ๊ฐ๋จํ ์ผ๋ฟ์ผ๋ก ํด๊ฒฐํ๋ค๊ฑฐ๋?) ๋น์ง๋์ค ๋ชจ๋ธ๊น์ง ์๊ฐํด์ผํ๋ ์๋น์ค๋ผ๋ฉด ํ๊ฒํ
์ ์ ํ๋ ๋ฑ ๋ค์ํ ํ์ฉ๋๊ฐ ๋์ ๊ฒ์ด ๋ฐ๋ก User-Agent๋ผ๊ณ ํ๋ค(์ดํ UA). ์ผ๋ฐ Apache ๋ฅผ ์น์๋ฒ๋ก ์ด์ํ๊ณ ์๋ค๊ณ ๊ฐ์ ์ ํ๊ณ ์ด๋ป๊ฒ ๋ถ์์ ํ ์ ์์๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ถ์์ ํ๋ฉฐ ์ข๋ ์ฐ์ํ(?) ๋ฐฉ๋ฒ์ ์๋์ง ์์ ๋ณด๊ณ ์ ํ๋ค.
User-Agent๊ฐ ๋ญ์ผ? ๋ฐฑ๋ฌธ์ด ๋ถ์ฌ์ผํ(?)๋ผ ํ๋๊ฐ, ์ฐ์ http://www.useragentstring.com ๋ฅผ ๋ค์ด๊ฐ๋ณด์. ๊ทธ๋ฌ๋ฉด ์์ ์ OS ๋ฐ ๋ธ๋ผ์ฐ์ ๋ฑ ์ ๋ณด๋ฅผ ํ์ฑํด์ ๋ณด์ฌ์ฃผ๋๋ฐ ์ํค๋ฐฑ๊ณผ์ ๋ฐ๋ฅด๋ฉด ‘์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ ์ผ์ ์ํํ๋ ์ํํธ์จ์ด ์์ด์ ํธ’๋ผ๊ณ ํ๋ค. ์ฆ, UA๋ง ์์๋ ์ด๋ค ๊ธฐ๊ธฐ/๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๋์ง ์ ์ ์๋ค๋๊ฒ. mozilla์ ๊ฐ๋ณด๋ฉด ์คํฉ ๋ฑ ๋ค์ํ UA๋ฅผ ๋ณผ์๊ฐ ์๋๋ฐ ํนํ ๋งจ ์๋๋ณด๋ฉด ๊ธฐ๊ธฐ/๋ธ๋ผ์ฐ์ ๋ณ๋ก ์ง์์ ๋ณด๊ฐ ๋์์๋ค. ์ฌ๊ธฐ์๋ ๋ณด๋ฉด ๋ชจ๋ ๋ชจ๋ฐ์ผ ์ผ์ฑ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ ์ธํ๊ณ ๋ ์ ๋ถ ์ง์์ด ๋๋๊ฑธ ํ์ธํ ์ ์๋ค.
์ถ์ฒ : developer.mozilla.org" ์ถ์ฒ : developer.mozilla.org ๊ธฐ์กด์ ๋ฐฉ๋ฒ ๊ทธ๋ผ ์ด๋ป๊ฒ ๋ด ์๋ฒ์ ๋ค์ด์จ ์ฌ์ฉ์๋ค์ UA๋ฅผ ํ์ธํ ์ ์์๊น? (์์ Apache๋ฅผ ์น์๋ฒ๋ก ์ด์ํ๋ค๊ณ ํ์ผ๋) Apache access log ์๋ Apache์์ ์ ๊ณตํด์ฃผ๋ ๋ชจ๋์ ์ด์ฉํด ์ ์ํ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๊ฐ ๋จ๊ฒจ์ง๊ณค ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด access log๋ฅผ ๋ฆฌ๋
์ค ๋ช
๋ น์ด๋ ์์
๋ก ๋ฝ์์๋ ์ง ํ์ฉํด์ ์ ๊ท์์ผ๋ก ํฌ๋งทํ
ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๊ทธ๋ฃนํ ์ํค๋ฉด ์ผ์ถ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํด ๋ผ์ ์๋ค. ( ๋ฒ๊ฑฐํ๋ค์ด ๋ง๋ค์ด๋ ์ ๊ท์์ ๊ฐ์ ธ๋ค ์ฌ์ฉํ ์๋ ์๊ฒ ๋ค. https://regexr.com/?37l4e ) ํ์ง๋ง, ์ฐ์ ์๋ํ๊ฐ ์๋์ด์์ด ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ๊ณ ์ถ์๋๋ง๋ค ๊ท์ฐจ๋์ฆ์ ๊ฑธ๋ฆด์ ์๊ณ ์ํผ ๊ฐ๋ฐ์ ํ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก(?) ๋ฐ์ดํฐ ์ถ์ถ์ ์๋ํ ํ๋ค ์ค์๊ฐ์ผ๋ก ๋ณด๊ณ ์ถ์๋ ์ ํ์ฌํญ์ด ๋ง๋ค.
์ข๋ ๋์ ๋ฐฉ๋ฒ(?) ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ํฐ๋ง ํ๋๋ฐ์๋ ๋ค์ํ ์คํ์์ค์ ๋ค์ํ ํด์ด ์๊ฒ ์ง๋ง ๊ฒฝํ์ด ๋ถ์กฑํ๊ฑด์ง ์์ง๊น์ง ElasticStack ๋งํ๊ฑธ ๋ชป๋ณธ๊ฒ ๊ฐ๋ค. ๊ฐ๋จํ๊ฒ ์ค๋ช
์ ํ๋ฉด access log ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ front๋จ์์ javascript ๋ก UA๋ฅผ ๊ตฌํ๋ค์ ์ด๋ฌํ ์ ๋ณด๋ฅผ ๋ฐ์์ ์๋ API๋ฅผ ๋ง๋ค์ด ๊ทธ์ชฝ์ผ๋ก ๋ณด๋ด๋ฉด ์๋ฒ์์ ํด๋น UA๋ฅผ ๋ถ์ํด์ ์นดํ์นด๋ก ๋ณด๋ด๊ณ ..!@#$%^blabla… ^^; ๊ทธ๋ฆผ์ผ๋ก ๋ณด์.
์ข๋ ๋์ ๋ฐฉ๋ฒ" ์ข๋ ๋์ ๋ฐฉ๋ฒ front๋จ์์๋ navigator.userAgent๋ฅผ ํ์ฉํ์ฌ UA๋ฅผ ๊ตฌํ ์ ์์๊ณ , API์์๋ UA๋ฅผ ๋ฐ๊ณ ํ์ฑ์ ํ๋๋ฐ ๊ด๋ จ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์๋ค.
private static final String VERSION_SEPARATOR = "."; private void userAgentParsingToMap(String userAgent, Map<String, Object> dataMap) { HashMap browser = Browser.lookup(userAgent); HashMap os = OS.lookup(userAgent); HashMap device = Device.lookup(userAgent); dataMap.put("browserName", browser.get("family")); dataMap.put("browserVersion", getVersion(browser)); dataMap.put("osName", os.get("family")); dataMap.put("osVersion", getVersion(os)); dataMap.put("deviceModel", device.get("model")); dataMap.put("deviceBrand", device.get("brand")); } private String getVersion(HashMap dataMap) { String majorVersion = (String)dataMap.get("major"); if (StringUtils.isEmpty(majorVersion)) { return StringUtils.EMPTY; } String minorVersion = (String)dataMap.get("minor"); String pathVersion = (String)dataMap.get("path"); StringBuffer sb = new StringBuffer(); sb.append(majorVersion); if (!StringUtils.isEmpty(minorVersion)) { sb.append(VERSION_SEPARATOR); sb.append(minorVersion); } if (!StringUtils.isEmpty(pathVersion)) { sb.append(VERSION_SEPARATOR); sb.append(pathVersion); } return sb.toString(); } ์ฐธ๊ณ ๋ก Java๋จ์์ UA๋ฅผ ํ์ฑํ๋ parser๊ฐ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ ๊ทธ์ค uap_clj๋ผ๋ ๋ชจ๋์ด ๊ทธ๋๋ง ์ ํ์ฑ์ด ๋์ด์ ์ฌ์ฉํ๊ฒ ๋์๋ค.
๋ชจ๋๋ณ ๋น๊ต ๋ชจ๋ Browser OS Device eu.bitwalker.useragentutils.UserAgent O ๋ถ๋ช
ํํจ (Android 5.x) X net.sf.uadetector.UserAgentStringParser O O ๋ถ๋ช
ํํจ (Smartphone) uap_clj.java.api.* O O O Parsing ๋น๊ต UA "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36" ๊ฒฐ๊ณผ - Browser : {patch=3239, family=Chrome Mobile, major=63, minor=0} - OS : {patch=1, patch_minor=, family=Android, major=5, minor=1} - Device : {model=Nexus 6, family=Nexus 6, brand=Generic_Android} ์์ ๊ฐ์ด ๊ตฌ์ฑ์ ํ๋ฉด Elasticsearch์ ์ธ๋ฑ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ Kibana์์ ์
๋ง์ ๋ง๊ฒ ์ค์๊ฐ์ผ๋ก ๋ณผ์์๊ฒ ๋์๋ค!
๋ด๊ฐ ์ด์์ค์ธ ์น์๋น์ค์ ์๋ต์๋๋ฅผ ๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด์๋ ์ด๋ค ๋ฐฉ๋ฒ์ด ์์๊น? ์น ์๋น์ค๋ฅผ ์ํด ์๋ฒ๋ฅผ ๊ตฌ์ฑํ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ์๋จ์ ์น์๋ฒ๋ฅผ ๋๊ณ ๊ทธ๋ค์ WAS๋ฅผ ๋๋ ์ค๊ณ๋ฅผ ํ๊ณค ํ๋ค. ์ฌ๊ธฐ์ ์น์๋ฒ๋ ๋ํ์ ์ผ๋ก Apache๋ Nginx๊ฐ ์๊ณ WAS๋ tomcat์ด๋ ๊ธฐํ ๋ค๋ฅธ ๋ชจ๋์ ์ฌ์ฉํ๋๋ฐ ์ด๋ ๊ฒ ๋๋จ๊ณ๋ก ๋๋๋ ์ด์ ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๊ฒ ์ง๋ง ์ฌ๊ธฐ์๋ ์๋จ์ ์น์๋ฒ(Apache)์ ์ค์ ์ผ๋ก ์๋ต์๋๋ฅผ ์ค์ผ์ ์๋ ๋ฐฉ๋ฒ์ ์์ ๋ณด๊ณ ์ ํ๋ค.
์นํ์ด์ง์ ์๋ต์๋๋ฅผ ์ค์ผ์ ์๋ ‘์ผ๋ฐ์ ์ธ’๋ฐฉ๋ฒ๋ค ๊ผญ ์๋ฒ์ ์ค์ ๋ค์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ์นํ์ด์ง์ ์๋ต์๋๋ฅผ ์ค์ผ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๋ค. ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ์ฝ๋ ๋ ๋ฒจ์์ ์ค์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ์คํ์ผ์ํธ๋ฅผ ์์ ์ ์ธํ๊ฑฐ๋ java script๋ ์ฝ๋ ์๋๋ถ๋ถ์ ๋ฃ๋๊ฒ๋ง์ผ๋ก๋ ์ด๋์ ๋ ์๋ต์๋๋ฅผ ์ค์ผ์ ์๋ค๊ณ ํ๋ค.
(์ฌ์กฑ) ์ ์
์์ ํ์ฌ ๋ํ๋์ด ํ์๋ก ์ฝ์ด๋ณด๋ผ๊ณ ์ ์ง์๋ค์๊ฒ ์ ๋ฌผํด์ฃผ์
จ๋ ์น์ฌ์ดํธ ์ต์ ํ๊ธฐ๋ฒ (์คํฐ๋ธ ์ฌ์ฐ๋์ค ์ )์ด ์๊ฐ์ด ๋๋ค. ๋ชจ๋ ์ฌ์ฃผ๋ ค๋ฉด ๋์ด ์ผ๋ง์ผ… ๊ทธ๋งํผ ์น๊ฐ๋ฐ์๋ค์๊ฒ ์ค์ํ๋ฉด์๋ ํํธ์ผ๋ก๋ ๊ธฐ๋ณธ์ด ๋๋ ๋ถ๋ถ๋ค์ด๋ ํ๋ฒ์ฏค ๋ชฉ์ฐจ๋ผ๋ ์ฝ์ด๋ณด๋๊ฒ ์ข์๋ฏ ํ๋ค.
์ฌ์ค ์ด ํฌ์คํ
์ ์์ฑํ๊ฒ๋ ๊ฐ์ฅ ํฐ ๊ณ๊ธฐ๋ ์ผ๋ง์ ์ฌ๋ด ํด์ปคํค์ ํ๋ฉด์ ๊ฒฝํํ ๋ถ๋ถ ๋๋ฌธ์ด๋ค. ( + ๋ค์ด๋ง ๋ดค์ง ์ค์ ๋ก ํด๋ณด์ง๋ ์์์… ) ์๋ฒ์์ node(React)๋ฅผ ๋์ฐ๊ณ ๊ทธ ์๋จ์ Apache๋ก ๋จ์ Port Redirect ( 80 โ 3000 ) ์์ผ์ฃผ๊ณ ์์๋๋ฐ react ์์ ์ฌ์ฉํ๋ bundle.js์ ์ฉ๋์ด ํฌ๋ค๋ณด๋ ์ต์ด ํ์ด์ง ์ ๊ทผ์ ๋ก๋ฉ์๊ฐ์ด 5์ด ์ด์๋์ด๋ฒ๋ฆฐ ๊ฒ์ด๋ค. bundle.js๋ฅผ ์ค์ฌ๋ณด๋๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๊ฐ ๊ฒฐ๊ตญ Apache ์ค์ ์ ํตํด 1์ด ์ด๋ด๋ก ์ค์ผ์ ์์๋ค.
gzip ์ฐ์ gzip์ด๋ ํ์ผ ์์ถ์ ์ฐ์ด๋ ์์ฉ ์ํํธ์จ์ด๋ก GNU zip์ ์ค๋ง์ด๋ผ๊ณ ํ๋ค. (์ฐธ๊ณ : ์ํค๋ฐฑ๊ณผ Gzip) ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์์ ํด์ผํ๋๋ฐ https://caniuse.com/#search=gzip ์ ๋ณด๋ฉด ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์์ ์ง์ํ๋๊ฒ์ ๋ณผ์ ์๋ค.
๋ฐ์ดํฐ ํ๋ฆ ๊ทธ๋ผ gzip ์ ์ฌ์ฉํ์๋์ ์ฌ์ฉํ์ง ์์์๋์ ์ฐจ์ด๋ ์ด๋ป๊ฒ ๋ค๋ฅผ๊น? ์ฐ์ Request/Response Flow ๋ฅผ ์ ๊น ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
gzip ์ฌ์ฉ ์ ์ถ์ฒ : betterexplained.com" ์ถ์ฒ : betterexplained.com ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ธก์ /index.html์ ์์ฒญํ๋ค. ์๋ฒ๋ Request๋ฅผ ํด์ํ๋ค. Response์ ์์ฒญํ ๋ด์ฉ์ ๋ด์ ๋ณด๋ธ๋ค. Response๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ฌ์ค๋ค. (100kb) gzip ์ฌ์ฉ ํ ์ถ์ฒ : betterexplained.com" ์ถ์ฒ : betterexplained.com ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ธก์ /index.html์ ์์ฒญํ๋ค. ์๋ฒ๋ Request๋ฅผ ํด์ํ๋ค. Response์ ์์ฒญํ ๋ด์ฉ์ ๋ด์ ๋ณด๋ธ๋ค. ์ฌ๊ธฐ์ ํด๋น ๋ด์ฉ์ ์์ถํ๋ ๊ณผ์ ์ด ์ถ๊ฐ๊ฐ ๋๋ค. Response header์ ์์ถ์ด ๋์ด์๋ค๋ ์ ๋ณด๋ฅผ ํ์ธํ ๋ธ๋ผ์ฐ์ ๋ ํด๋น ๋ด์ฉ์ ๋ฐ๊ณ (10kb), ์์ถ์ ํด์ ํ ํ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋ค. ์ ๋ฆฌํ๋ฉด, gzip์ ์ฌ์ฉํ๋ฉด ์๋ฒ๋ Client์๊ฒ ๋ณด๋ผ Response๋ฅผ ์์ถํ๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ๋น์ฉ์ ์ค์ผ์ ์์ด ์๋ต์๋๊ฐ ๋น ๋ฅธ ์ฅ์ ์ด ์๋ค.
๋ฌด์กฐ๊ฑด ์ฌ์ฉํด์ผ ํ๋๊ฐ? ๋ฌผ๋ก ๋ฌด์กฐ๊ฑด ์ข์ (๋ง์น show me the money ๊ฐ์)์ ๋ต์ ์๋ค. ์๋ฒ์์ ์์ถ์ ํ์ฌ Client์๊ฒ ๋ณด๋ด๋ฉด ๊ทธ๋๋ก ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋๊ฒ์ด ์๋๋ผ ์์ถ์ ํด์ ํ๋ ๊ณผ์ ์ด ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๋ค. ์ด๋ฌํ ๊ณผ์ ์์ ๋ธ๋ผ์ฐ์ ๋ cpu๋ฅผ ์ฌ์ฉํ๊ฒ ๋์ด ์คํ๋ ค ๋๋๋ง ํ๋ ๊ณผ์ ์ด ๋๋ ค์ง์ ์์ด ์์นซ ์๋ต์๋๋ ๋นจ๋ผ์ก๋ค ํ๋๋ผ๋ ์ฌ์ฉ์ ์ฒด๊ฐ์ ๋ ๋๋ ค์ง๊ฒ์ฒ๋ผ ๋ณด์ฌ์ง์ ์๋ค. ๋ฐ๋ผ์ ์ํฉ์ ๋ง์ถฐ gzip์ ์ฌ์ฉํด์ผ ํ ๊ฒ์ธ์ง ๋ง๊ฒ์ธ์ง์ ๋ํด ํ
์คํธ๊ฐ ํ์ํ๋ค.
๋ง์น๋ฉฐ ํ๋ถ์์ ๋๋ ์ ์
์์ , ์ํ์น๋ ์ ์ ์ธ ๋ฆฌ์์ค๋ฅผ ๋ด๋นํ๊ณ ํฐ์ผ์ ์๋ธ๋ฆฟ ์ฒ๋ผ ๋ฐ์ดํฐ ๊ฐ๊ณต์ด ํ์ํ ํ์ด์ง๋ฅผ ๋ด๋นํ๋ค๊ณ ์ฃผ๋ฌธ์ ์ธ์ฐ๋ฏ ํ์์ง๋ง, ์น์๋ฒ์์ ์์ถ์ ํ๋ฉด ์ด๋ค ํจ๊ณผ๊ฐ ์๋์ง ์ค์ ๋ก ๊ฒฝํํด๋ณด๋๊ฒ ๊ฐ์ฅ ์ค์ํ๊ฒ ๊ฐ๋ค. ์ ์ฉ ๋ฐฉ๋ฒ์ ๋ณต๋ถํ๋ ๋๋์ด๋ผ ์ํ์น ๊ณต์ ๋ฌธ์๋ฅผ ๋งํฌ ํ๋๊ฒ์ผ๋ก ํด๋น ํฌ์คํ
์ ๋ง๋ฌด๋ฆฌ ํ๊ฒ ๋ค.
Apache Document (์ฌ์ฉ๋ฒ) : https://httpd.apache.org/docs/2.2/ko/mod/mod_deflate.html ์ ์ฉ ํ
์คํธ ์ฌ์ดํธ https://developers.google.com/speed/pagespeed/insights http://www.whatsmyip.org/http-compression-test
Spring ํ๊ฒฝ์์ (Spring5๋ ๋ฌ๋ผ์ก์ง๋ง…) ์ธ๋ถ API๋ก์ ํธ์ถ์ ํ ๋ ์์ฃผ ์ฐ์ด๋ RestTemplate. ์ด๋ request์ ๋ํด ์ ์์ ์ธ ์๋ต์ด ์๋ ๊ฒฝ์ฐ์ ๋ํ ์ฒ๋ฆฌ๋ ์ด๋ป๊ฒ ํ ๊น? ๋ง์ฐํ๊ฒ ์๊ฐ์ ํด๋ณด๋ฉด Http Status Code๋ฅผ ๋ฐ์์ ํ๋ณ์ ํ๋ฉด ๋์ง๋ง Http Status Code๋ง ๋ด๋ ์์ฒญ~๋ง๋ค. ( ์ํคํผ๋์ ์ฐธ๊ณ : https://en.wikipedia.org/wiki/List_of_HTTP_status_codes ) if~else ๋ก ๋ค ๋๋์๋ ์๊ณ … ์ฐ์ ์ฑ๊ณต/์คํจ์ ๋ํ ํ๋ณ์ ์ด๋ป๊ฒ ํ ๊น ํ๊ณ ์ฝ๋๋ฅผ ํ๊ณ ํ๊ณ ๋ค์ด๊ฐ๋ค๊ฐ ์๊ฒ๋ ๋ถ๋ถ์ ๋ํด ์ ๋ฆฌ๋ฅผ ํด๋ณด๊ฒ ๋ค.
Http Status Code ๊ทธ๋ฃน์ ์ Spring-project github์ ๊ฐ๋ณด๋ฉด HttpStatus ํ์์ ๋ด๋ถ Enum์ผ๋ก ์๋์ฒ๋ผ ์ ์๋์ด ์๋ค. ( ๋งํฌ )
public enum HttpStatus { ... public Series series() { return Series.valueOf(this); } ... public enum Series { INFORMATIONAL(1), SUCCESSFUL(2), REDIRECTION(3), CLIENT_ERROR(4), SERVER_ERROR(5); ... public static Series valueOf(int status) { int seriesCode = status / 100; for (Series series : values()) { if (series.value == seriesCode) { return series; } } throw new IllegalArgumentException("No matching constant for [" + status + "]"); } } } ์ฝ 80์ฌ๊ฐ ์๋ต์ฝ๋๋ค์ ํฌ๊ฒ 5๊ฐ ๋ฌถ์์ผ๋ก ์ ์ํด ๋์๊ฒ์ ๋ณผ์์๋ค. ์ฆ, 201 / 201 / 202 ๊ฐ์ ๋
์๋ค์ ์ ๋ถ SUCCESSFUL ์ฑ๊ณต ์ผ๋ก ๊ทธ๋ฃนํ์ด ๋๋๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ผ RestTemplate ์์๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๊ณ ์๋? ์ฝ๋๋ฅผ ์ญ์ญ ๋ฐ๋ผ๊ฐ๋ค ๋ณด๋ฉด ์๋์ฒ๋ผ 4xx, 5xx ๋ ์๋ฌ๋ผ๊ณ ํ๋จํ๊ณ ๊ทธ์ ๋ฐ๋ผ RestClientException ์ ๋ฐํํ๋๊ฒ์ ํ์ธํ ์ ์๋ค.
RestTemplate ํธ์ถ ๋งํฌ try { ClientHttpRequest request = createRequest(url, method); if (requestCallback != null) { requestCallback.doWithRequest(request); } response = request.execute(); handleResponse(url, method, response); if (responseExtractor != null) { return responseExtractor.extractData(response); } else { return null; } } catch (IOException ex) { ์๋ฌ ํ๋ณ ๋งํฌ protected boolean hasError(HttpStatus statusCode) { return (statusCode.series() == HttpStatus.Series.CLIENT_ERROR || statusCode.series() == HttpStatus.Series.SERVER_ERROR); } ์ฑ๊ณต/์คํจ ์ฒ๋ฆฌ๋ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ ๊ฐ์ ์ ์ํ๊ธฐ ๋๋ฆ์ผ๊ฒ ๊ฐ๋ค. ์ฐ์ ์์ฃผ ๊ฐ๋จํ๊ฒ RestTemplate ๋ฅผ ์ฌ์ฉํ ๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ์ ์๋ ๋๋ก 4xx, 5xx๊ฐ ์๋ฌ๋ผ๊ณ ํ๋จํ ์ ์์๊ฒ ๊ฐ๊ณ
try { responseBody = restTemplate.postForObject(url, httpEntity, byte[].class); } catch (RestClientException e) { // ์๋ฌ์ธ ๊ฒฝ์ฐ RestClientException ์ ๋ด๋ฑ๋๋ค. log.error("##### restTemplate error, url = {}", url, e); } ์ ์๋ ์๋ฌ(?)์๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด DefaultResponseErrorHandler์ ์์๋ฐ๊ณ hasError๋ฉ์๋๋ฅผ ๋ฌด์กฐ๊ฑด ํจ์คํ๋๋ก Override ํ๊ณ ๋ ๋ค์ ์๋ต ์ฝ๋๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์์์ ์๊ฒ ๋ค. (๋ฌผ๋ก ์ด๋ฌํ ๋ฐฉ๋ฒ ๋ง๊ณ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์๊ฒ ๊ฐ๋ค.)