์์ด๋์ด๋ ๊ธฐํ์ ์๋ ์ ํด๋จ์ง๋ง 1๋ ์ด ์ง๋ ์ง๊ธ์์์ผ ์์ฑํ ์ฒซ ํ ์ด ํ๋ก์ ํธ ๋ญ๋จน์ง(what-eat). ’๋ญ๋จน์ง’๋ฅผ ๊ฐ๋ฐํ๋ฉฐ ๊ฒช์๋ ์ด์ผ๊ธฐ๋ฅผ ๊ณต์ ํ๋ ค ํฉ๋๋ค.
๋ญ๋จน์ง?
์ ์ฌ๊ณผ ์ ๋ ๋ฉ๋ด๋ฅผ ์ ๋ป ๊ณ ๋ฅด์ง ๋ชปํ๊ณ ํ๋ ์์ ๋ฏธ๋๊ฒ์์ด ์์์ต๋๋ค. ํ์, ์ค์, ์์, ์ผ์, ๋ถ์ ์ค ์ค๋์ ๋จน๊ณ ์ถ์ง ์์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋นผ๊ณ ๋จ์ ์นดํ ๊ณ ๋ฆฌ์์ ๋ฉ๋ด๋ฅผ ๊ณ ๋ฅด๋ ๋ฐฉ์์ ๊ฒ์์ด์์ฃ .
’๋ญ๋จน์ง’๋ ๊ทธ ๊ฒ์์ ๊ณ ์ค๋ํ ์ธํฐ๋ท์ผ๋ก ์ฎ๊ฒจ๋์ ํ๋ก์ ํธ์ ๋๋ค.
์คํจ
์ฌ์ค ๋ญ๋จน์ง๋ ์ด๋ฏธ ๋ช ๋ฒ์ด๊ณ ์ repository์ ์ด๋ฐ์ ๋ฐ ํํ์ ์ด๋ฆ์ผ๋ก ๋ง๋ค์ด์ก๋ค๊ฐ ์ฌ๋ผ์ก์ต๋๋ค. ๊ทธ ์์ฌ๊ฐ ๋จ์์๊ธฐ๋ ํ์ฃ . (https://github.com/wesbin/what-eat/releases/tag/v20210317) ๋ค์ ์๊ฐํด๋ ์ด ๋ฒ์ ์ ์ฐธ ๋ง์ ๋ค์ง ์์ต๋๋ค.
๋คํํ ์ ๋ ์ฌ๊ธฐ์ ๋ฉ์ถ ์ด์ ๋ ์์์ต๋๋ค. ์ ๋ '์คํจ’๋ฅผ ์ฑ๊ณต์ ์ด๋จธ๋๋ก ๋ง๋ค๊ธฐ ์ํด ์ด์ ๋ฅผ ํ๋ฒ ์ฐพ์๋ณด๊ธฐ๋ก ํฉ๋๋ค.
์คํจ์ ์ด์
๊ฒฐ๋ก ์ ์ด๋ ์ต๋๋ค. ๋ํ ์ผํ ๊ณํ(ํน์ ๊ธฐํ)์ ๋ถ์กฑ.
์คํจํ๋ ํ๋ก์ ํธ๋ค์ ๋์ด์ผ ๋ณด๋ฉด ์ ๋ “๊ทธ๊ฑด ๊ทธ๋ ๊ฒ ํ๊ณ , ์ ๊ฑด ๊ทธ๋ ๊ฒ ๋ง๋ค๋ฉด ๋๊ฒ ์ง”๋ผ๋ฉฐ ํ๋ก์ ํธ๋ฅผ ์์ํ์ต๋๋ค. ๊ทธ์ ๋จธ๋ฆฟ์์ผ๋ก ์๊ฐํ ๋ชฉ์ (Mock-up) ์์ค์ ๊ฒ์ ๊ตฌํํ๋ ค ํ๋ ๊ฒ์ด์ฃ . ์ง๊ธ ์๊ฐํ๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ ๋ปํ ๊ฒ์ด์์ฃ .
๋ค์ ๋ญ๋จน์ง
์ ๋ง ๋ณ๊ฑฐ ์๋ ๊ธฐํ์์ ๋๋ค.
ํผ์ ๋ณผ ๋ ๋ชฐ๋๋๋ฐ ์ฌ๋ ค์ ๋ณด๋ ๊ธ์จ ์ ๋ง ์ ์ด์๋ค
๊ฐค๋ญ์ ํญ์ ๋จธ๋ฆฟ์์ ์๋ ๋ด์ฉ์ ๊บผ๋ด๋์ผ๋ฉด์ ๋ฐฐํฌ๋ ๊ตฌํ์ ์ด๋ค ์์ผ๋ก ํ ๊ฒ์ธ์ง ์กฐ์ฌํ๊ณ ๋ฉ๋ชจํด๋ ์์ค์ด์ฃ . ๊ทธ ์์ค์ ์ค๊ฐ์ 3๋ฒ ์ ๋ ์กฐ๊ธ์ฉ ๋ด์ฉ์ด ๋ฐ๋๊ธฐ๋ ํ์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ฐ ๊ธฐํ์์ด์ง๋ง ์๋ ๊ฒ๊ณผ ์๋ ๊ฒ์ ์ฐจ์ด๋ ์์ฒญ๋ฌ์ต๋๋ค.
’๋ญ๋จน์ง’๊ฐ ์์ฑ์ด ๋์์ผ๋๊น์!!
์์ฑ๋ ’๋ญ๋จน์ง’๋ https://wesbin.github.io/what-eat/ ์์ ์ฒดํํ์ค ์ ์์ผ์ญ๋๋ค.
์์์๋ ’๋ญ๋จน์ง’๊ฐ ์ด๋ป๊ฒ ์์๋์๋์ง ์๊ธฐํ์์ต๋๋ค. ์ฌ๊ธฐ์๋ถํฐ๋ ’๋ญ๋จน์ง’๋ฅผ ์ค์ ๋ก ๊ฐ๋ฐํ๋ฉด์ ๊ฒช์๋ ์ผ๋ค์ ๋ํด ์๊ธฐํ๋ ค ํฉ๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ ๋ง ๋ค์ํ ์ฅ์ ๋ฌผ๋ค์ด ์์์ต๋๋ค. React.js์ ๋ํ ์์ํจ, Github Pages๋ฅผ ์ด์ฉํ ๋ฐฐํฌ. ์ง๊ธ ์๊ฐํ๋ฉด ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ํ๋ ๋ชจ๋ ์์ ๋ค์ด ์์ํ๊ฒ ์งํ์ด ๋์๋ ์ ์ด ์์๋ ๊ฑฐ ๊ฐ๋ค์.
๊ทธ๋ฐ ์ฅ์ ๋ฌผ๋ค ์ค์์๋ ๊ฐ์ฅ ๋์๋ ์ฅ์ ๋ฌผ์ธ Github API ๊ทธ๋ฆฌ๊ณ Proxy๋ฅผ ์ค์ฌ์ผ๋ก ์ด ๊ธ์ ์์ฑํ๊ณ ์ ํฉ๋๋ค. ์ฐ์ ์ ๊ฐ Github API๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ๋ง์๋๋ ค์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
Why?
’๋ญ๋จน์ง’๋ Github๊ฐ ์ ๊ณตํ๋ ์๋น์ค ์ค ํ๋์ธ Github Pages(https://pages.github.com/)๋ฅผ ์ด์ฉํ์ฌ ๋ฐฐํฌ๋ฅผ ์งํํ์ต๋๋ค. Github์ ์ ๋ก๋๋ ์์ค๋ฅผ ์ด์ฉํ์ฌ ๋ฐฐํฌ๋ฅผ ๋์์ฃผ๋ ์๋น์ค์ ๋๋ค. ํน์ง์ด ์๋ค๋ฉด Server-side ์ฝ๋๋ฅผ ์คํํ์ง ์๋๋ค๋ ์ ์ ๋๋ค. ์ค์ง ์ ๋ก๋๋ ์ ์ ์ธ ํ์ผ๋ค์ ์ฝ์ด๋ด์ฃ .
’๋ญ๋จน์ง’์์๋ ์ถ์ฒจ์ ์ฌ์ฉ๋ ๋ฉ๋ด๋ค์ด ์ ์ฅ๋ ๊ณณ์ด ํ์ํ์ต๋๋ค. DB ๊ฐ์ ๊ฒ๋ ๋ฌผ๋ก ์ข์ง๋ง ๊ฐ๋จํ๊ฒ JSON ํ์ผ์ด๋ผ๋ ํ์ํ์ต๋๋ค. ํ์ง๋ง ์์์ ๋ง์๋๋ฆฐ Github pages์ ํน์ง ๋๋ฌธ์ DB๋ JSON ํ์ผ๋ ์ด์ฉํ ์ ์์์ต๋๋ค. ๊ทธ๋ ๋์ ๋ ๊ฒ Github API๋ฅผ ์ด์ฉํ์ฌ Repository์ issue ๊ธฐ๋ฅ์ ์ด์ฉํ ๋๊ธ ์๋น์ค์์ต๋๋ค.
์ด๋ ๊ทธ๋ฅ Cloud ์๋น์ค๋ฅผ ์ด์ฉํ๊ฒ ๋ค๊ณ ์ ํํ์ผ๋ฉด ์ด ๊ณ ์์ ์ ํ์ ์๋…
๊ทธ๋ฆฌ๊ณ ์ ๋ Github API๋ฅผ ์ด์ฉํ์ฌ ์ด์๋ฅผ ๋๊ธ๋ก์๊ฐ ์๋ ๋ฉ๋ด๋ก์ ํ์ฉํ ์๊ฐ์ ํ๊ฒ ๋ฉ๋๋ค.
Github API
Github API(https://docs.github.com/en/rest)๋ ์ ๋ง ๋ง์ ๊ธฐ๋ฅ๋ค์ด ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์๊ฐ๋ณด๋ค ๋ง์ ์ฌ๋๋ค์ด ์ ๋ง๋ค์ ํด์ ๋ง๋ค์ด ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ ๋ ๋๋ฆ ๊ทธ๋ ๊ฒ ๋๊ณ ์.
๊ทธ์ค์์ ์ ๋ issue๋ฅผ ๊ฐ์ ธ์ ์ฝ๊ณ , ์ฐ๋ ๊ธฐ๋ฅ์ด ํ์ํ์ต๋๋ค. ์ด๊ฑด ์ ๋ง ์๊ฐ๋ณด๋ค ์ฌ์ ์ต๋๋ค.
์ง๊ธ ๋ณด๋ ์๋ค์. ์์ํ๊ฒ ํ๋ฆฐ ๋ถ๋ถ์ด
Github API๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค. ๊ณต์ ๋ฌธ์์์ URL์ ํ์ธํ๊ณ
์ ๋นํ ๋ ๋ ค์ฃผ๋ฉด ๋!
์๋์ ๊ฐ์ด ์์ฒญํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ ๋ ๊ตณ์ด postman์ ์ด์ฉํ์ง๋ง ์์ ๊ฐ์ด ๊ฐ๋จํ GET ์์ฒญ์ธ ๊ฒฝ์ฐ์ ์ฃผ์์ฐฝ์ ์ ๋ ฅํด๋ ๋ฌด๋ฐฉํฉ๋๋ค. POST๋ PUT, DELETE์ ๊ฒฝ์ฐ์๋ ํฌ๊ฒ ์ด๋ ต์ง ์์ต๋๋ค. Personal access Token์ ๋ฐ๊ธ๋ฐ์ Header์ Authorization: ’token [๋ฐ๊ธ๋ฐ์ ํ ํฐ ๋ฒํธ]’๋ง ๋ฃ์ด์ฃผ์๋ฉด ์์ํ๊ฒ ๋์๊ฐ๋๋ค. ํ์ง๋ง ๊ทธ๊ฑด ์ด๋๊น์ง๋ ’๊ฐ์ธ’์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ํด๋นํฉ๋๋ค.
์ ์ ๊ฒฝ์ฐ์ ๋ค๋ฅธ ์ด์ฉ์์ ๊ณ์ ์ ๋ณด ์ฆ, ๋ก๊ทธ์ธ ๋์์ด ํ์ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ๊ทธ ๋ ์์ด ๋ฑ์ฅํ์ฃ . CORS…
ใ
๋ใ
ฃใ
ใ
ใน ใ
ใ
ฃ;ใ
ใดใ
ใน
CORS
Cross-Origin Resource Sharing(๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ )๋ SOP(Same-Origin Policy)์ ์ง์ ์ด๋ฃจ๋ ๊ฐ๋ ์ ๋๋ค. SOP๋ ๋ง ๊ทธ๋๋ก “๊ฐ์ ์ถ์ฒ์์๋ง ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ ์ ์๋ค”๋ผ๋ ์ ์ฑ ์ธ๋ฐ ์น์์ ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ ๊ฒ์ ํํ ์ผ์ด์ฃ . ๊ทธ๋ ๊ธฐ์ ์์ธ ์กฐํญ์ ๋๊ธฐ๋ก ํฉ๋๋ค. ๊ทธ์ค ํ๋๊ฐ “CORS ์ ์ฑ ์ ์งํจ ๋ฆฌ์์ค ์์ฒญ”์ ๋๋ค. ์๋ต(CORS์ ๋ํ ์์ธํ ์ด์ผ๊ธฐ๋ ๋ค๋ฅธ ๊ธ์์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.) ~
CORS ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์
์ ๊ฐ ์๊ณ ์๋ ๊ฑด
๋ ๊ฐ์ง์ ๋๋ค. ์๋ฒ์์ Access-Control-Allow-Origin์ ์ธํ ํด์ฃผ๊ฑฐ๋ proxy๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด์ฃ . ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ ๊ฐ Github์ ์์ฒญํด ์ป๊ฑฐ๋
์ณ๋ค์ด๊ฐ์
์ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ฐ์ค๋ ๋จ๋ ๊ฑด proxy์๋ฒ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
proxy server
proxy ์๋ฒ๋ ์ค๊ณ ์๋ฒ, ๋์ ์๋๋ฐฉ(์ถ์ฒ์ ์ถ์ฒ) ์ฌ์ด์ ์์ฒญ์ ๋ฐ๊ณ ์ ๋ฌํด์ฃผ๋ ์๋ฒ๋ฅผ ๋งํฉ๋๋ค. ๋ณด์์ ๊ฐํํ๋ ค ์ฌ์ฉํ๊ธฐ๋ ํ์ง๋ง ์น ํน์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์์ด๊ธฐ ์ํด ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค. ์ ํฌ๊ฐ ๋ณด๋ด๋ ์์ฒญ์ ๋ง์น CORS ์ ์ฑ ์ ์งํจ ๊ฒ์ฒ๋ผ ์์ฅํด ๋ธ๋ผ์ฐ์ ๋ฅผ ์์ด๋ ๊ฒ์ด์ฃ .(proxy์ ๊ดํ ์ด์ผ๊ธฐ๋ ๋ค๋ฅธ ๊ธ์์ ์์ธํ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.)
proxy ์๋ฒ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ package.json ์๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ๋ฉด proxy๊ฐ ๋์ํ๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง ์ ์ ๊ฒฝ์ฐ์ github pages๋ฅผ ์ด์ฉํด ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ๋ฒ์ ๋์ง ์์์ต๋๋ค. ํด์ ์ ๋ azure์ App service๋ฅผ ์ด์ฉํด Node ์๋ฒ๋ฅผ ๋ฐฐํฌ๋ฅผ ํ๊ธฐ๋ก ํ์ต๋๋ค.
{
"name": ~~~,
"version": ~~~,
"proxy": "https://api.github.com",
~~~
}
์ ๊ฐ azure์ ๋ฐฐํฌํ proxy ์๋ฒ์ ์์ค๋ ์ด๊ณณ(https://github.com/wesbin/github-proxy)์์ ๋ณด์ค ์ ์์ต๋๋ค. ํน์ ๋ณด์ จ๋ค๋ฉด ์์๊ฒ ์ง๋ง ์ ๋ง ๊ฐ๋จํฉ๋๋ค. ํฌ์ธํธ๋ app.js์์ ์ฌ์ฉํ cors ๋ฏธ๋ค์จ์ด์ ์์ฃ . ์์ฃผ ๊ฐ๋จํ๊ฒ CORS ์์ฒญ์ ์ค์ ํ ์ ์๋ ๋ฏธ๋ค์จ์ด์ ๋๋ค. ์ ์ ๊ฒฝ์ฐ์ ๋ค๋ฅธ ์ค์ ์์ด ์ฌ์ฉํ์ง๋ง ๋ค์ํ ์ค์ ๋ฐฉ๋ฒ์ด ์์ผ๋ ์ฐพ์์ ์ฌ์ฉํ์๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์์ฑ
๊ทธ๋ ๊ฒ ์ ์ฒซ ํ ์ด ํ๋ก์ ํธ์ธ ๋ญ๋จน์ง๊ฐ ์์ฑ๋์์ต๋๋ค. ๋์์์ด ์ญ์ฑ ์ ๊ณ ๋ณด๋ ๊ณผ์ฐ ์ด ๊ธ์ด ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋ ์ ์์๊น ์ถ๋ค์. ใ ใ
์ ์ ๊ธ์ฌ์ฃผ๊ฐ ๋ชจ์๋ ๊ฑด์ง, ๋ฏธ๋ฃจ๊ณ ๋ฏธ๋ฃจ๋ค ํ๋ก์ ํธ๊ฐ ๋๋ 2๋ฌ์ด๋ ์ง๋ ์์ ์์ ์ด ๊ธ์ ์ฐ๊ณ ์์ด ๊ทธ๋์ ๊ฐ์ ์ด ์ฌ๋ผ์ง ๊ฑด์ง. ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๊ฒช์๋ ๊ณ ์๋ค์ด ์ ๋๋ฌ๋์ง ์๋ ๋๋์ด ์๋ค์.
๊ทธ๋๋ ์ ์ด๋ ์ ์๊ฒ๋ ํ ์ด ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ๊ฒช์๋ ๊ณ ์๋ค์ด ์ ๊ฐ๋ฐ ์ด์ผ๊ธฐ์ ํฐ ๋์์ด ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ง์ฝ ์ด ๊ธ์ ์ฌ๊ธฐ๊น์ง ์ฝ์ด์ฃผ์ ๋ถ๋ค์ด ์๋ค๋ฉด ๊ทธ๋ฆฌ๊ณ ์์ง ํ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํด๋ณด์ง ์์ผ์ จ๋ค๋ฉด
๊ผญ! ํด๋ณด์๊ธธ ๋ฐ๋๋๋ค.
๋์ ๊ณํ์ ์ต๋ํ ์๊ฒ ์ก์๋ณด์ธ์. ์๊ฐ๋ณด๋ค ๋ ํ๋๋๊น์.
๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋๊ธ