๋ฐ๋ฅ๋ถํฐ ํ์ฌ์ ๋ชจ์ต๊น์ง ์ ๋ถ ์ ์์ผ๋ก ์ง์ ๋ง๋ ์๋ก์ด ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค๊ฒ ๋ ์ด์ผ๊ธฐ๋ฅผ ํ์ด๋ณด๊ฒ ์ต๋๋ค.
ํน์.. ๊ธฐ์กด ๋ธ๋ก๊ทธ ํฌ์คํธ๋ก ๋ฐฉ๋ฌธํด์ฃผ์ ๋ถ์ด๋ผ๋ฉด.. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค.
๊ทธ๋ ์ง ์๋๋ผ๋, ์์นซํ๋ฉด ๋๋ฌด ๋ปํด์ ์ง๋ฃจํ ์ ์๋ ์ด ๋ธ๋ก๊ทธ๋ฅผ ์ฝ์ผ๋ฌ ์ฐพ์์์ฃผ์ ๋ชจ๋ ๋ถ๋ค ๊ฐ์ฌํฉ๋๋ค. :-) ์์ํฉ๋๋ค!
์ ๋ ๋ธ๋ก๊ทธ ๊ฐ๋ฐ..?
๋๋ ์ ๋ง ๋ค์ํ ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค์ด์๋ค. ๋๋ถ๋ถ Jekyll์ด๋ผ๊ณ ํ๋ ํ์ผ ์์คํ ๊ธฐ๋ฐ์ ์ ์ ์น์ฌ์ดํธ ๋น๋ฉ ํ๋ ์์ํฌ๋ฅผ ๊ธฐ๋ฐํด์ ๋ง๋ค์์๋ค. github pages๋ก ๋ฐฐํฌํ๊ธฐ ํธํ๊ณ , ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ตฌ์ถํด๋ ํ ๋ง๋ฅผ ์๋ง ์ด์ฉํ๋ฉด ๊ฝค๋ ๊ทธ๋ด๋ฏํ ํํ๊ฐ ๊ฐ์ถฐ์ก๋ค. ๋๋ถ์ markdown์ ํ์ฉํ๋ ์ค๋ ฅ์ด ๋ง์ด ๋์๋ค. ๊ทธ๋ ์ง๋ง, ์จ์ ํ ๋ด๊ฐ ์ปค์คํ ํ๊ธฐ์๋ ๋ฌธ๋ฒ๋ ๊ดด์ํ๊ณ , ์ฝ๋๋ ์ง์ ๋ถํ๋ค.
๊ทธ ๋ค์์ ๋ ธ์ ์ ์ด์ฉํด์ '๋๋ง ๋ณผ ์ ์๋' ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค์ด๋๊ณ ๊ธ์ ์จ์๋ค. ์ด ์์ ์์ ๋ฌธ์๋ฅผ ์์ฑํ๊ณ , ๋ฌธ์๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์คํํด์ ๊ด๋ฆฌํ๋ ๊ฒ์๋ ๋ ธ์ ์ ๋ฐ๋ผ์ฌ ๋ค๋ฅธ ์ฑ์ด ์๋ค๊ณ ๊ฐํ ์๊ฐํ๋ค. ์์ง๋ ๋ ธ์ ์ ์ ์ฉํ๊ณ ์์ง๋ง, ๋ถ๋ช ํ '๋ธ๋ก๊ทธ'๊ฐ ๊ฐ์ง๋ ๋ชฉ์ ์ผ๋ก๋ ๋ด๊ฐ ์ฐ๊ณ ์์ง ์์๋ค.
๊ทธ๋์.. ์ค์ค๋ก ๋ถ์ธ '๋ธ๋ก๊ทธ ์ ๋ชฉ๋ฏผ'์ด๋ผ๋ ๋ณ๋ช ๋ต๊ฒ ๋ค์ ์๋ก์ด ํํ์ ๋ธ๋ก๊ทธ๋ฅผ ๊ฟ๊พธ๊ฒ ๋์๋ค. ํธํ๊ฒ ๊ธ์ ์์ฑํ ์ ์์ผ๋ฉด์๋, ์ฌ์ดํธ์ ์ ๋ฐ์ ์ธ ๋์์ธ๊ณผ ๊ธฐ๋ฅ์ ๋ด๊ฐ ๊ณ์ ํธํ๊ฒ ์ ์ง๋ณด์ ํ ์ ์๋, ๊ทธ๋ฐ ๋ธ๋ก๊ทธ๊ฐ ๋ง๋ค๊ณ ์ถ์ด์ก๋ค. ์์ฐ์ค๋ฝ๊ฒ ์์ ๋ถํฐ ๋ ํผ๋ฐ์ค๋ฅผ ๋ชจ์์ค๋ React๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ Gatsby์ ๋๊ธธ์ด ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฒ์๋ ์ ๋ง gh-pages๋ฅผ ์ด์ฉํด์ ๋ธ๋ก๊ทธ ์ฝํ ์ธ ์ ์ฝ๋์ ๋น๋๋ ์ฝ๋๊ฐ ๋ถ๋ฆฌ๋ ์ ์๊ฒ ๋ง๋ค๊ณ ์ถ์๋ค.
์ Gatsby..?
Gatsby๋ฅผ ์ ํํ ์ด์ ๋ ์ ๋ง ๋จ์ํ๋ค. Gatsby ๊ณต์ ํํ์ด์ง์ 'Gatsby enables developers to build fast, secure, and powerful websites using a React-based framework'๋ผ๊ณ ๋์์๋ฏ์ด, Gatsby๊ฐ React ๊ทธ ์์ฒด์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ React๋ฅผ ์ ๋ง ์ฌ๋ํ๊ณ , React ๋ง์ ๋ณด๊ธฐ ์ด์ ๊ณผ ์ดํ์ ๋ด ์ถ์ด ํ์ฐํ ๋ค๋ฅด๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ์๋ก์ด ๋ธ๋ก๊ทธ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ฉด์ ์ฃผ์ ์์ด Gatsby๋ฅผ ์ ํํ๋ค.
Gatsby๊ฐ ๊ฐ์ง๊ณ ์๋ plugin system๋ Gatsby๋ฅผ ์ ํํ๊ฒ ๋ง๋๋ ํฐ ์ญํ ์ ํ๋ค. ์ด ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค๋ฉด์ 12๊ฐ ์ ๋์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ค. ๋ค๋ฅธ node ํ๋ก์ ํธ๋ฅผ ํ ๋์ ๋์ผํ๊ฒ npm์ผ๋ก ํ๋ฌ๊ทธ์ธ ํจํค์ง๋ฅผ ์ค์นํ๊ณ , gatsby-config.js
๋ผ๋ ํ๋ก์ ํธ ์ค์ ํ์ผ์์ ๋ค์ํ ์ต์
์ ๋ถ์ฌํ๋ฉด, ์ ๋ง ๊ธฐ๊น๋๋ ์ ์ ์นํ์ด์ง๋ฅผ ๋๋ฑ ๋ง๋ค ์ ์๋ค.
Gatsby ํ๋ ์์ํฌ์ ๋ํ ์ฐฌ์์ ๊ฐ๊น์ด ๋ง์ ํ๊ฑฐ ๊ฐ์๋ฐ.. React ๊ธฐ๋ฐ์ ์๋ก์ด ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค๊ณ ์ถ์๋ ๋์ ๋์ฆ๋ฅผ ๋ฑ ์ถฉ์กฑ์ํค๋ ํ๋ ์์ํฌ๋ก๋ Gatsby๋งํ ๊ฒ์ด ์์๋ค. ๊ทธ๋์ ์ฃผ์ ์์ด Gatsby๋ฅผ ์ ํํ๋ค.
์ Tailwind CSS..?
2021๋ ํ๋ฐ๋ถํฐ React๋ฅผ ํ์ฉํ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด, ๋ฌด์กฐ๊ฑด Tailwind๋ฅผ CSS ํ๋ ์์ํฌ๋ก ํ์ฉํ๋ค. ๊ทธ๊ฒ ์ด ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋๋๋ฐ Tailwind CSS๋ฅผ ๋์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ด์ ์ค ๊ฐ์ฅ ํฐ ๋ถ๋ถ์ ์ฐจ์งํ๋ค.
Gatsby๋ ๋น์ฐํ React ํ๋ก์ ํธ์๊ธฐ ๋๋ฌธ์ Tailwind๋ก utility-firstํ ์คํ์ผ๋ง์ ํ๊ธฐ ํธํ๋ค. ๋ช๊ฐ์ง ํจํค์ง๋ฅผ ์ค์นํ๊ณ tailwind.config.js
ํ์ผ๋ง ์ ์ค์ ํด์ฃผ๋ฉด ๋์๋ค. Gatsby ํ๋ก์ ํธ์ Tailwind๋ฅผ ๋์
ํ๊ณ ์ถ๋ค๋ฉด, ๋น์ฐํ๊ฒ๋ ๊ณต์ ๋ฌธ์์ ์์ฃผ ์น์ ํ ์๋ด๋ฅผ ๋ฐ๋ผํ๊ธฐ๋ง ํ๋ฉด ๋๋ค. (๋งํฌ)
๋ด๊ฐ Tailwind๋ฅผ ์ ์ฉํ๋ ์ด์ ๋ ๊ทธ๋ฆฌ ๊ฑฐ์ฐฝํ์ง ์๋ค. Tailwind์ ๋ฑ๋ก๋ Awesomeํ ํด๋์ค๋ค์ ํ์ฉํด์ ๋ฐ์ํ ๋์์ธ์ ์ก๊ธฐ ์ ๋ง ํธํ๊ณ , VSCode์์ ์ต์คํ ์ ํ๋๋ง ์ค์นํด์ ๋ฐ๋ก๋ฐ๋ก ํด๋์ค๋ฅผ ์กฐํํ ์ ์์ผ๋ฉด์, ์ ๋ง ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๋์์ธ ํ ์ ์๋ค๋ ์ ์ด ์ ๋ถ๋ค. ๋ด์ฅ๋ ํด๋์ค๋ ์ ๋ง ํธํ์ง๋ง, ์์น๋ค์ ์ปค์คํ ํ๋ ๊ฒ๋ ๋ฌด์๋ณด๋ค ํธํ๋ค.
ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋จ์ ์ผ ์๋ ์๊ฒ ์ง๋ง, ํ์ฌ์์ ๋ถ๊ฐํผํ๊ฒ ์ธ๋ผ์ธ ์คํ์ผ๋ง์ ํด์ผํ๋ ์ํฉ์ด ์์๋๋ฐ ๋๋ ๋ชจ๋ฅด๊ฒ Tailwind์ ํด๋์ค๋ฅผ ์ง์ด๋ฃ๊ณ ๋ '์ ์๋๋๊ฑฐ์ผ!'๋ผ๊ณ ๋ต๋ตํดํ๋ ๊ฒฝํ์ด ์์ ์ ๋๋ก ํน ๋น ์ ธ์๋ค. ์ฌํผ, ๊ทธ๋์ ์ด ๋ธ๋ก๊ทธ๋ฅผ ๋์์ธํ๋๋ฐ ์ฃผ์ ์์ด Tailwind๋ฅผ CSS ์์คํ ์ผ๋ก ํ์ฉํ๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ๊ฐ๋ฐํ์ด..?
๋ธ๋ก๊ทธ ๋์์ธ ํค์ ์ด์ ๋ถํฐ ๋ฑ ํ๋๋ก ์ ํด๋์๋ค. ํ์ผ์ ๋งค์ผ ๋ฐ์๋ณด๋ Newneek์ ํํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ํผ์์ '์ง์'ํ๋ค. (๋ญ ๋์ถฉ ํ๋์ ๋ฐํ๋ค๋ ๋๋์ ์ธ ํํ์ด๋ค.) ๋์์ธ์ ๊ธฐ๋ณธ์์์ธ ์ ๊ณผ ์ ์ผ๋ก ์ ๋ง ๋ชจ๋ํ ์น์ ๊ทธ๋ ค๋๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ์๋ก์ด ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค๋๋ border-radius
์์๊ฐ ์๋ ์ง์ ์ผ๋ก๋ง ๊ตฌ์ฑํ๊ณ ์ถ์๋ค.
apple์์ ์ต๊ทผ์ ๋ฐฐํฌํ Freeform์ด๋ผ๋ ์ฑ์ ์ด์ฉํด์ ๋๊ฐ์ ํ์ ๋์์ธํ๋ค. ์ด๋ค ์์๊ฐ ์์์ผ๋ฉด ์ข๊ฒ ๊ณ , ๊ทธ ์์์ ์ปดํฌ๋ํธ ์ด๋ฆ์ ์ด๋ป๊ฒ ํ๋ฉด ๋ ์ง๋ฅผ ์ฆ๊ฒ๊ฒ ๊ทธ๋ ธ๋ค. ์์ ๋ค ๋ฐ์ํ๊ฑด ์๋์ง๋ง ์ปดํฌ๋ํธ ์ค์บ๋ ํค์ ๊ตฌ์ฑํ๋๋ฐ์ ์ ๋ง ๋ง์ ๋์์ด ๋์๋ค.
๊ทธ๋ ค์ง ๋๊ฐ์ ๋์์ ๊ฐ์ง๊ณ ์ด๋ค ๊ฒ๋ค์ ๊ฐ๋ฐํด์ผ ํ๋์ง ๋ ธ์ ์ ์ด์ฉํด์ ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์๋ค. ์ฒ์๋ถํฐ ์๋ฒฝํ๊ฒ ํ์ํ ๊ฒ์ ์ ๋ฆฌํ๊ธฐ ๋ณด๋ค๋ ๋์์ ๋ฐ์๋ ์์๋ค์ ๋นผ๋จน์ง ์๋ ๊ฒ์ ์ง์คํ๋ค. ํฌ๋๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋๊น ํ์คํ ์ปดํฌ๋ํธ๋ฅผ ๋ฌด์์ ๋ง๋ค ํ์๊ฐ ์์ด์ ์ข์๋ค.
ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ค ์์ฑํ๊ณ , Layout ์ปดํฌ๋ํธ๋ฅผ ์์์ผ๋ก ๊ฐ ํ์ด์ง, ๊ฐ ์ปดํฌ๋ํธ์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ด๋ค ํ์์ผ๋ก ๋๋ฌํด์ผ ๋ ์ด์์์ด ๊ทธ๋ ค์ง๋์ง ๊ตฌ์ํ๋ค. ๊ทธ๋ฌ๊ณ ๋๋๊น ํ๋ก์ ํธ ๊ตฌ์กฐ๊ฐ ์ด๋ฏธ ๋ค ํด๋, js ํ์ผ๋ก ๋ง๋ค์ด์ ธ ์์๋ค. ๋ด๊ฐ ๊ตฌ์ถํ ๋ธ๋ก๊ทธ ํ๋ก์ ํธ์ ๋๋ต์ ์ธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
โ posts/
โ โ .../0000-00-00/ ๐ (post slug)
โ
โ src/components
โ โ ...components jsx code ๐ (Post, PostHeader, PostNav ..)
โ src/layout
โ โ /index.js
โ src/pages/
โ โ /404.js ๐ (notFound page)
โ โ /hankyeolk.js ๐ (about page)
โ โ /index.js ๐ (main page)
โ src/styles/
โ โ /gloabl.css ๐ (tailwind๋ฅผ ๊ธฐ๋ฐํ ์ ์ญ์ ์ธ ์ปค์คํ
CSS ์ฝ๋)
โ src/templates/
โ โ /post-template.js ๐ (gatsby-node์ ๋ฑ๋กํ api๋ก ํฌ์คํธ๋ฅผ ์ฐ์ด๋ด๋ ํ
ํ๋ฆฟ JSX)
โ
โ static/
โ ...basic images
๊ตฌ์กฐ๋ฅผ ์ง๊ณ ๋์๋ ๋์๊ณผ ๋จธ๋ฆฟ์์์ ๊ทธ๋ฆฌ๋๋๋ก ์ค๋น๋ ๋ฐ์ดํฐ ํ์์ ๋ง์ถฐ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด๊ฐ๋ค. ์ค๋๋ง์ React ํ๋ก์ ํธ๋ฅผ ์งํํด์ ๋๋ฌด ์ฌ๋ฏธ์์๋ค. react-hot-dev-server๊ฐ ๋ก์ปฌ ์ฃผ์์ ๋ฐ๋ก๋ฐ๋ก ๊ทธ๋ ค๋ด๋ ์ ์ ํ์ด์ง๋ฅผ ๋ณด๋ฉด์ ์ค๋ฅ๋ฅผ ์ก์๋ด๋ ๊ฒฝํ์ด ๊ฐ๋ฐ ํ๋ก์ ํธ๋ฅผ ๊ณ์ํ๊ฒ ๋ง๋๋ ์ด์ ๋ค.
๊ฐ๋ฐ์ด ์ฌ์ด ๊ฒ๋ง์ ์๋์๋ค. Gatsby์ ์๋ data-layer๋ผ๋ ๊ฐ๋ ์ ๋ฏ์ค์๋ค. ์์ฒด ํ์ผ์์คํ ์ด๋ ์ธ๋ถ api๋ฑ์ ํตํด์ fetching๋๋ ๋ฐ์ดํฐ๋ค์ Gatsby์ GraphQL ๊ธฐ๋ฐ์ data-layer๋ฅผ ๊ฑฐ์น๊ฒ ๋์ด์๋ค. ๋ด๋ถ ์ปดํฌ๋ํธ๋ ํ์ด์ง ์ฝ๋์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋์ GraphQL์ ์ฌ์ฉํด์ผ ํ๋ค. ์ด๋ฐ ๋ฏ์ ๊ฒ๋ค์ ์ดํดํ๊ณ ์ด๊ฒจ๋ด๋ ๊ฒ์ด ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๊ฐ์ฅ ์ฆ๊ฑฐ์ ๋ ๊ฒ ๊ฐ๋ค.
๊ฐ๋จํ๊ฒ ๋ณด์ฌ์ฃผ์๋ฉด..
์ด์ ๋ธ๋ก๊ทธ์๋ ์์๋, ์ด์ /๋ค์ ๋ธ๋ก๊ทธ ๊ธ๋ก ๋์ด๊ฐ๊ฒ ํด์ฃผ๋ PostNavigation
์ปดํฌ๋ํธ๊ฐ ํ์ํ๋ค. ์ด ์ปดํฌ๋ํธ๋ ๊ฐ๊ฐ์ ํฌ์คํธ์ ๋ํ ๋๋ต์ ์ธ ์ ๋ณด๊ฐ ๋ด๊ธด ๊ฐ์ฒด๋ฅผ Props๋ก ์ ๋ฌ๋ฐ๋๋ค.(nextPost, prevPost) Props๋ฅผ ๋ด๋ ค์ฃผ๋ ์ฃผ์ฒด๋ Post-template
์ด๋ค. ์ด ํ
ํ๋ฆฟ์์๋ postQuery๋ฅผ ์ด์ฉํด์ ์ปดํฌ๋ํธ๊ฐ ๋๋๋ง ๋๊ธฐ์ ์ ํ์ผ ์์คํ
์ผ๋ก md ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด ๋๊ฒจ์ค๋ค.
// src/templates/Post-template.jsx
import { graphql } from 'gatsby';
const PostTemplate = ({ data }) => {
const { prevPost, nextPost } = data;
return (
<Layout>
...
<PostNavigation
prevPost={prevPost ? prevPost : ''}
nextPost={nextPost ? nextPost : ''}
/>
</Layout>
);
};
export const postQuery = graphql`
query ($postSlug: String, $nextSlug: String, $prevSlug: String) {
nextPost: markdownRemark(fields: { postSlug: { eq: $nextSlug } }) {
frontmatter {
title
createdAt
categories
emoji
}
fields {
postSlug
}
}
prevPost: markdownRemark(fields: { postSlug: { eq: $prevSlug } }) {
frontmatter {
title
createdAt
categories
emoji
}
fields {
postSlug
}
}
}
`;
Props๋ก ๋์ด์จ ์ด์ /๋ค์ ํฌ์คํธ์ ๋ํ ์ ๋ณด(๋ ๊ฐ์ ๊ฒฝ์ฐ์๋ ํฌ์คํธ ์ ๋ชฉ, ๋ ์ง, ์ด๋ชจ์ง, ์ฃผ์๊ฐ์ ์ด์ฉํ๋ค.)๋ฅผ ์ด์ฉํด์ ์ปดํฌ๋ํธ๋ฅผ ๊ทธ๋ฆฌ๋ ๊ฒ์ ๊ธฐ์กด ๋ฆฌ์กํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋์ผํ๋ค. ์ค์ํ ๊ฒ์ ๊ฐ ์ ๋ณด์์ post.fields.postSlug
๋ผ๊ณ ํ๋ ํฌ์คํธ์ '์ฃผ์๊ฐ'์ Gatsby์์ ์ ๊ณตํ๋ Link
์ปดํฌ๋ํธ์ ์ ๋๊ฒจ์ฃผ๋ ๊ฒ์ด๋ค. (postSlug๋ gatsby-nodeํ์ผ์์ api๋ก ๋ด๊ฐ ๋ง๋ graphql ์ฟผ๋ฆฌ ํ๋๋ช
์ด๋ค.)
// src/components/PostNavigation.jsx
import { Link } from 'gatsby';
const PostNavigation = ({prevPost, nextPost}) => {
return (
...
{nextPost && (
<div className='md:w-[50%] w-full postCard-hover'>
<Link className='postNav-card' to={`${nextPost.fields.postSlug}`} >
<div className='postNav-icon'>{nextPost.frontmatter.emoji}</div>
<div className='postNav-info-container'>
<h3 className='postNav-title'>
{nextPost.frontmatter.title}
</h3>
<p className='postNav-date'>
{nextPost.frontmatter.createdAt}
</p>
</div>
</Link>
</div>
)}
)
}
๊ทธ๋์ ์๋ก์ด ๋ธ๋ก๊ทธ๋ ์ด๋..?
๋งํ ์ํผ์ค์ ์ ๋ช ํ ์ํผ์๋ '๋ง๋ฆฐํฌ๋ ์ ์๊ฒฐ์ '์์ ํฐ์์ผ ํด์ ๋จ๊ณผ ํด๊ตฐ์ ๋ฌด์๋ฏธํ ์ ์์ ๋๋ด๋ฌ ์จ ์นํฌ์ค์ ์ ๋ช ํ ์งค๋ก ๋ด ์๊ฐ์ ์ ๋ฆฌํ ์ ์์ ๊ฒ ๊ฐ๋ค. ๋ธ๋ก๊ทธ์ ๋ํ ์ ๋ชฉ ์ํ๊ณผ ์ญ๋ง์ด์ '๋๋ด๋ฌ ์จ' ์ ๋ง ๋ง์์ ์ ๋๋ ๋ธ๋ก๊ทธ๊ฐ ๋ง๋ค์ด์ง๊ณ ์๋ค. (์์ง๋ ๊ณ์ ์ฝ๋๋ฅผ ์น๊ณ ์๊ธดํด์ ๋ง๋ค์ด์ง๋ค๊ณ ํํํ๋ค.)
Gatsby๋ฅผ ๊ธฐ๋ณธ ํ๋ ์์ํฌ๋ก ํ๋ค๋ณด๋ ํ์คํ ์ ์ง๋ณด์๊ฐ ๋๋ฌด ํธํ๋ค. ๋์์ธ์ ์์ ํด์ผ ํ๋ค๋ฉด ๊ทธ๋ฅ VSCode๋ฅผ ์ผ๊ณ , Tailwind๋ฅผ ์ด์ฉํด์ ์ด๋ฆฌ์ ๋ฆฌ ๋ง์ง๊ธฐ๋ง ํ๋ฉด ๋๋ค. ๋ฐ์ดํฐ ํ์์ ์์ ํด์ผ ํ๋ค๋ฉด, ์ง์ ๋ Props๊ฐ ์๊ฒฉํ ๊ณณ์ ๋นก์ธ๊ฒ ์ง๋ง, GraphQL์ ์ด์ฉํด์ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋นผ๊ฑฐ๋ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ๋๋ค.
์ผ๋ถ๋ฌ ๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ TypeScript๋ฅผ ์น๋ ํ๋ก์ ํธ๋ฅผ ํ์ง๋ ์์๋ค. Type์ ๋ํ ์์ ์ฑ์ ๋ณด์ฅ๋ฐ์ ๊ฐ๋ฉด์๊น์ง ๊ฐ๋ฐํ ํฐ ๊ท๋ชจ์ ํ๋ก์ ํธ๊ฐ ์๋๋ผ๊ณ ์ค์ค๋ก ํ๋จํ๋ค. ๋น ๋ฅด๊ฒ ๊ทธ๋ ค์ ๋น ๋ฅด๊ฒ ๋ฐฐํฌํ๋ ๊ฒ์ด ๋ชฉํ์๋ค. ๊ทธ๋ ์ง๋ง ๊ธฐํ๊ฐ ๋๋ค๋ฉด TypeScript๋ก ์ ์ฒด ์ฝ๋๋ฅผ ๊ตํํ๊ณ ์ถ๋ค. gh-pages
๋ฅผ ์ด์ฉํด์ ์ฝํ
์ธ ์ ์ฝ๋๊ฐ ๋ถ๋ฆฌ๋๊ฒ ๋ฐฐํฌํ๋ ๊ฒ๋ ํ์คํ ์ตํ๋ค. ๋ง์์ ๋ ๋ค!
๊ฒฐ๊ตญ ์ค์ํ ๊ฒ์, ๊พธ์คํ๊ฒ ๊ธ์ ์์ฑํ๋ ๊ฒ.
๋ฐ๋ฅ๋ถํฐ ์ง๊ธ์ ๋ชจ์ต๊น์ง, ๊ทธ๋ฆฌ๊ณ ์์ผ๋ก์ ๋ชจ์ต๊น์ง ๋ชจ๋ ๋ด ์์ ์ง๋๊ฐ ์๋ก์ด ๋ธ๋ก๊ทธ๊ฐ ๋๋ฌด ๋ง์์ ๋ ๋ค. ์ฒ์ ๋ธ๋ก๊ทธ๋ฅผ github pages๋ก ๋ฐฐํฌํ๋ ๋ '๋ค์ ๊ธ์ ๋ง์ด ์จ๋ด์ผ์ง'ํ๋ ์๊ฐ์ด ๊ฐ๋ ์ฐจ์ฌ๋๋ค. ์ค์ค๋ก ํ๋ ์๊ธฐ๋ฅผ ๋ณด๋ด๋ฉด์, ์ค์ค๋ก ์ถ์ ๋๊ธฐ๋ถ์ฌ๋ฅผ ํ๊ธฐ ์ํด์ ์ ๋ธ๋ก๊ทธ๋ฅผ ๊ตฌ์ถํ๋ ํ๋ก์ ํธ๋ฅผ ์์ํ ๊ฒ๋ ์ด์ ๊ฐ ์์๋ค. ๊ธ์ ์ธ ๋ ๋งํผ์ ๊ฑฐ์ง์ด ์๋ ์จ์ ํ ๋์ ๋ชจ์ต์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋์๋ผ๋ ๋์๊ฒ ์์งํด์ง๊ธฐ ์ํด์๋ผ๋ ๊ธ์ ์์ฃผ ๋ง์ด ์จ๋ณด๋ ค๊ณ ํ๋ค. ๋ง์นจ ์๋ก์ด ๋ธ๋ก๊ทธ๋ ๋๋ฌด ๊ธฐ๊น๋๊ฒ ๋ฝํ์ผ๋๊น ๋ง์ด๋ค. :-)