๐Ÿ‘จโ€๐Ÿ’ป

์ƒˆ๋กœ์šด ๋ธ”๋กœ๊ทธ - The Great Gatsby

2023-04-02 ย  | ย  ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ

post-img

๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ํ˜„์žฌ์˜ ๋ชจ์Šต๊นŒ์ง€ ์ „๋ถ€ ์ œ ์†์œผ๋กœ ์ง์ ‘ ๋งŒ๋“  ์ƒˆ๋กœ์šด ๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ ์ด์•ผ๊ธฐ๋ฅผ ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ํ˜น์‹œ.. ๊ธฐ์กด ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ๋กœ ๋ฐฉ๋ฌธํ•ด์ฃผ์‹  ๋ถ„์ด๋ผ๋ฉด.. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š๋”๋ผ๋„, ์ž์นซํ•˜๋ฉด ๋„ˆ๋ฌด ๋ป”ํ•ด์„œ ์ง€๋ฃจํ•  ์ˆ˜ ์žˆ๋Š” ์ด ๋ธ”๋กœ๊ทธ๋ฅผ ์ฝ์œผ๋Ÿฌ ์ฐพ์•„์™€์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. :-) ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค!

์™œ ๋˜ ๋ธ”๋กœ๊ทธ ๊ฐœ๋ฐœ..?

๋‚˜๋Š” ์ •๋ง ๋‹ค์–‘ํ•œ ๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“ค์–ด์™”๋‹ค. ๋Œ€๋ถ€๋ถ„ 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์ด๋ผ๋Š” ์•ฑ์„ ์ด์šฉํ•ด์„œ ๋Œ€๊ฐ•์˜ ํ‹€์„ ๋””์ž์ธํ–ˆ๋‹ค. ์–ด๋–ค ์š”์†Œ๊ฐ€ ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๊ณ , ๊ทธ ์š”์†Œ์˜ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋ ์ง€๋ฅผ ์ฆ๊ฒ๊ฒŒ ๊ทธ๋ ธ๋‹ค. ์™„์ „ ๋‹ค ๋ฐ˜์˜ํ•œ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ ์Šค์บ˜๋ ˆํ†ค์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ์— ์ •๋ง ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

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๋กœ ๋ฐฐํฌํ•˜๋˜ ๋‚  '๋‹ค์‹œ ๊ธ€์„ ๋งŽ์ด ์จ๋ด์•ผ์ง€'ํ•˜๋Š” ์ƒ๊ฐ์ด ๊ฐ€๋“ ์ฐจ์˜ฌ๋ž๋‹ค. ์Šค์Šค๋กœ ํž˜๋“  ์‹œ๊ธฐ๋ฅผ ๋ณด๋‚ด๋ฉด์„œ, ์Šค์Šค๋กœ ์‚ถ์— ๋™๊ธฐ๋ถ€์—ฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒˆ ๋ธ”๋กœ๊ทธ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•œ ๊ฒƒ๋„ ์ด์œ ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ธ€์„ ์“ธ ๋•Œ ๋งŒํผ์€ ๊ฑฐ์ง“์ด ์—†๋Š” ์˜จ์ „ํ•œ ๋‚˜์˜ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ž˜์„œ๋ผ๋„ ๋‚˜์—๊ฒŒ ์†”์งํ•ด์ง€๊ธฐ ์œ„ํ•ด์„œ๋ผ๋„ ๊ธ€์„ ์ž์ฃผ ๋งŽ์ด ์จ๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๋งˆ์นจ ์ƒˆ๋กœ์šด ๋ธ”๋กœ๊ทธ๋„ ๋„ˆ๋ฌด ๊ธฐ๊น”๋‚˜๊ฒŒ ๋ฝ‘ํ˜”์œผ๋‹ˆ๊นŒ ๋ง์ด๋‹ค. :-)

๋ชฉ์ฐจ

์ด์–ด์ง€๋Š” ๊ธ€,