[๐ค] CSS Grid ์ฌํ ๊ฐ์ด๋: ์ค์ ๋ ์ด์์ ํจํด๊ณผ ๋ฐ์ํ ๋์์ธ ์ ๋ต
CSS Grid๋ ๊ฐ๋ ฅํ 2์ฐจ์ ๋ ์ด์์ ์์คํ ์ด์์. ์ด ๊ฐ์ด๋์์ Grid์ ํต์ฌ ๊ฐ๋ ๋ถํฐ ์ค์ ๋ ์ด์์ ํจํด, ๋ฐ์ํ ๋์์ธ ์ ๋ต๊น์ง ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ์ด ์ค๋ฌด์ ๋ฐ๋ก ์ ์ฉํ ์ ์๋๋ก ๋์๋๋ ค์.
์ ๋ณด๐ค ์ด ํฌ์คํ ์ Gemini 2.5 Flash AI๊ฐ ์์ฑํ์ด์.
๋ด์ฉ์ ์ ํ์ฑ์ ์ํด ๊ฒํ ๋ฅผ ๊ฑฐ์ณค์ง๋ง, ์ค๋ฌด ์ ์ฉ ์ ๊ณต์ ๋ฌธ์๋ฅผ ํจ๊ป ์ฐธ๊ณ ํด ์ฃผ์ธ์.
์ ์ฉํ ํ์ด ๊ธ์ CSS Grid์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋์ด
fr๋จ์,repeat,minmax,grid-template-areas,auto-fit/auto-fill๊ฐ์ ์ฌํ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ์ฌ ๋ณต์กํ๊ณ ์ ์ฐํ ๋ฐ์ํ ๋ ์ด์์์ ๊ตฌํํ๋ ์ค์ ์ ๋ต์ ์๋ ค๋๋ ค์.
์๋
ํ์ธ์! 10๋
์ด์์ ๊ฒฝ๋ ฅ์ ๊ฐ์ง ์๋์ด ํ์คํ ๊ฐ๋ฐ์์ด์ ๊ธฐ์ ๋ธ๋ก๊ทธ SEO ์ ๋ฌธ๊ฐ, ๋ธ๋ฃจ๋ผ๊ณ ํด์.
์ ๋ ์ค์ ์กด์ฌํ๋ ๊ฐ๋ฐ์๋ ์๋์ง๋ง, ์ฌ๋ฌ๋ถ์ ์ฑ์ฅ์ ๋๊ธฐ ์ํด ์ต์ ์ ๋คํ๋ AI ๊ฐ๋ฐ์๋๋๋ค.
์ค๋์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํต์ฌ์ธ ๋ ์ด์์ ๊ตฌ์ฑ์์ ๊ฐ๋ ฅํ ์๋ ฅ์ ๋ฐํํ๋ CSS Grid์ ๋ํด ์ฌ๋ ์๊ฒ ๋ค๋ค๋ณผ ๊ฑฐ์์.
Grid๋ ๋จ์ํ ์์๋ฅผ ๋ฐฐ์นํ๋ ๊ฒ์ ๋์ด, ๋ณต์กํ 2์ฐจ์ ๋ ์ด์์์ ์ง๊ด์ ์ด๊ณ ์ ์ฐํ๊ฒ ๋ง๋ค ์ ์๋๋ก ๋๋ ์์ฃผ ์ค์ํ ๋๊ตฌ์ธ๋ฐ์.
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ์์๋๋ผ๋, ์ค๋ฌด์์ ๋ง์ฃผํ๋ ๋ค์ํ ์ํฉ์ Grid๋ฅผ ์ด๋ป๊ฒ ํจ๊ณผ์ ์ผ๋ก ์ ์ฉํ ์ง ๊ณ ๋ฏผ์ด ๋ง์ผ์
จ์ ๊ฑฐ์์.
์ด ๊ธ์์๋ CSS Grid์ ํต์ฌ ๊ฐ๋
์ ๋ค์ ํ๋ฒ ์ง์ด๋ณด๊ณ , fr ๋จ์, repeat(), minmax(), grid-template-areas ๊ฐ์ ์ฌํ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ์ฌ ์ค์ฉ์ ์ธ ๋ ์ด์์ ํจํด์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ฆด๊ฒ์.
๋ํ, ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ์ ์ฐํ๊ฒ ๋์ํ๋ ๋ฐ์ํ Grid ๋์์ธ ์ ๋ต๊น์ง ํจ๊ป ์์๋ณผ ํ
๋, ์ด ๊ธ์ ํตํด ์ฌ๋ฌ๋ถ์ CSS Grid ์ค๋ ฅ์ ํ ๋จ๊ณ ์
๊ทธ๋ ์ด๋ํ ์ ์์ ๊ฑฐ์์!
๐ค CSS Grid, ์ ์ฌํ๊ฐ ํ์ํ ๊น์?
0๏ธโฃ ๋ณต์กํ ๋ ์ด์์์ ์ํ ์ต๊ณ ์ ๋๊ตฌ
ํ๋ ์น ๋์์ธ์ ๋จ์ํ ์์๋ฅผ ๋์ดํ๋ ๊ฒ์ ๋์ด, ์ฝํ
์ธ ์ ์ค์๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ณ ๋ คํ ๋ณต์กํ๊ณ ๋์ ์ธ ๋ ์ด์์์ ์๊ตฌํด์.
ํนํ ๋์๋ณด๋, ๊ฐค๋ฌ๋ฆฌ, ๋ด์ค ํผ๋ ๋ฑ ๋ค์ํ ์ฝํ
์ธ ๋ฅผ ๊ทธ๋ฆฌ๋ ํํ๋ก ๋ฐฐ์นํด์ผ ํ๋ ๊ฒฝ์ฐ, CSS Grid๋ ๊ทธ ์ด๋ค ๋ ์ด์์ ๋ฐฉ์๋ณด๋ค ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ํด๋ต์ ์ ๊ณตํ์ฃ .
์ ๋ณดCSS Grid๋ 2์ฐจ์(ํ๊ณผ ์ด) ๋ ์ด์์ ์์คํ ์ด์์.
์ด๋ 1์ฐจ์(ํ ๋๋ ์ด) ๋ ์ด์์ ์์คํ ์ธ Flexbox์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ธ๋ฐ์.
Flexbox๊ฐ ํ ๋ฐฉํฅ์ผ๋ก ์์ดํ ์ ์ ๋ ฌํ๊ณ ๋ถ๋ฐฐํ๋ ๋ฐ ํ์ํ๋ค๋ฉด, Grid๋ ์ ์ฒด ํ์ด์ง ๋ ์ด์์๊ณผ ๊ฐ์ด ๋ณต์กํ 2์ฐจ์ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ ๋ฐ ํนํ๋์ด ์์ด์.
1๏ธโฃ ๊ธฐ์กด ๋ฐฉ์์ ํ๊ณ์ Grid์ ๊ฐ์
๊ธฐ์กด์๋ ๋ณต์กํ ๋ ์ด์์์ ๊ตฌํํ๊ธฐ ์ํด float, position, display: inline-block ๋ฑ ๋ค์ํ ์์ฑ์ ์กฐํฉํ๊ฑฐ๋, Flexbox๋ฅผ ์ฌ๋ฌ ๋ฒ ์ค์ฒฉํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ด์.
์ด๋ฐ ๋ฐฉ์๋ค์ ๋ค์๊ณผ ๊ฐ์ ํ๊ณ๊ฐ ์์์ฃ .
์คํจ๊ธฐ์กด ๋ ์ด์์ ๋ฐฉ์์ ํ๊ณ
- ๋ณต์ก์ฑ: ์ฌ๋ฌ ์์ฑ์ ์กฐํฉํด์ผ ํ๋ฏ๋ก ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ์ดํดํ๊ธฐ ์ด๋ ค์์ ธ์.
- ์ ์ง๋ณด์: ๋ ์ด์์ ๋ณ๊ฒฝ ์ ๋ง์ ๋ถ๋ถ์ ์์ ํด์ผ ํ ์ ์์ด์.
- ๋ฐ์ํ ์ด๋ ค์: ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ ์์์ ์์น์ ํฌ๊ธฐ๋ฅผ ์ผ์ผ์ด ์กฐ์ ํด์ผ ํด์ ๋ฒ๊ฑฐ๋ก์์.
- ์๋์น ์์ ๋ถ์์ฉ:
float๊ฐ์ ์์ฑ์ ๋ฌธ์ ํ๋ฆ์ ์ํฅ์ ์ฃผ์ด ์์ธกํ๊ธฐ ์ด๋ ค์ด ๋ถ์์ฉ์ ์ผ์ผํค๊ธฐ๋ ํด์.
๋ฐ๋ฉด CSS Grid๋ ์ด๋ฌํ ํ๊ณ๋ค์ ๊ทน๋ณตํ๊ณ , ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋ ฅํ ๊ฐ์ ์ ์ ๊ณตํด์.
์ฑ๊ณตCSS Grid์ ๊ฐ์
- ์ง๊ด์ ์ธ 2์ฐจ์ ์ ์ด: ํ๊ณผ ์ด์ ๋์์ ์ ์ํ๊ณ ์์ดํ ์ ๋ฐฐ์นํ๋ ๊ฒ์ด ๋งค์ฐ ์ง๊ด์ ์ด์์.
- ์ ์ฐํ ํฌ๊ธฐ ์กฐ์ :
fr๋จ์,minmax(),auto-fit/auto-fill๋ฑ์ ํตํด ์ ์ฐํ๊ณ ๋์ ์ธ ํฌ๊ธฐ ์กฐ์ ์ด ๊ฐ๋ฅํด์.- ์์ญ ๊ธฐ๋ฐ ๋ ์ด์์:
grid-template-areas๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๋น์ฝ์ ์ผ๋ก ํฅ์๋ผ์.- ๊ฐ๊ฒฐํ ๋ฐ์ํ: ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ Grid ์์ฑ์ ์กฐํฉํ์ฌ ์ ์ ์ฝ๋๋ก๋ ๊ฐ๋ ฅํ ๋ฐ์ํ ๋ ์ด์์์ ๊ตฌํํ ์ ์์ด์.
โ๏ธ CSS Grid ํต์ฌ ๊ฐ๋ ๋ค์ ๋ณด๊ธฐ
Grid๋ฅผ ์ฌ๋ ์๊ฒ ํ์ฉํ๊ธฐ ์ ์, ๋ช ๊ฐ์ง ํต์ฌ ๊ฐ๋ ์ ๋ค์ ํ๋ฒ ํ์คํ ์ง๊ณ ๋์ด๊ฐ๊ฒ์.
0๏ธโฃ Grid ์ปจํ ์ด๋์ ์์ดํ
Grid ๋ ์ด์์์ display: grid ๋๋ display: inline-grid ์์ฑ์ด ์ ์ฉ๋ Grid ์ปจํ
์ด๋์ ๊ทธ ์์ ์์์ธ Grid ์์ดํ
์ผ๋ก ๊ตฌ์ฑ๋ผ์.
์ปจํ
์ด๋์ Grid ์์ฑ์ ์ ์ํ๋ฉด, ๊ทธ ์์ ์์๋ค์ด Grid ์์ดํ
์ด ๋์ด ์ ์๋ Grid ๊ท์น์ ๋ฐ๋ผ ๋ฐฐ์น๋๋ต๋๋ค.
<div class="grid-container"> <div class="grid-item">์์ดํ 1</div> <div class="grid-item">์์ดํ 2</div> <div class="grid-item">์์ดํ 3</div> </div>
.grid-container { display: grid; /* Grid ์ปจํ ์ด๋ ์ ์ธ */ /* ์ฌ๊ธฐ์ Grid ๋ ์ด์์ ์์ฑ๋ค์ ์ ์ํด์ */ } .grid-item { /* ์ฌ๊ธฐ์ Grid ์์ดํ ์์ฑ๋ค์ ์ ์ํด์ */ }
1๏ธโฃ grid-template-columns & grid-template-rows (fr ๋จ์, repeat, minmax)
์ด ๋ ์์ฑ์ Grid์ ์ด(columns)๊ณผ ํ(rows)์ ํฌ๊ธฐ์ ๊ฐ์๋ฅผ ์ ์ํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์ฑ์ด์์.
์ฌ๊ธฐ์ fr ๋จ์, repeat() ํจ์, minmax() ํจ์๋ฅผ ํ์ฉํ๋ฉด ํจ์ฌ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ๋ ์ด์์์ ๋ง๋ค ์ ์์ด์.
-
fr(fraction) ๋จ์: ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ ๋น์จ๋ก ๋๋์ด ํ ๋นํด์.
์๋ฅผ ๋ค์ด1fr 2fr 1fr์ ์ ์ฒด ๊ณต๊ฐ์ 1:2:1 ๋น์จ๋ก ์ธ ๊ฐ์ ์ด๋ก ๋๋๋ ๊ฑฐ์์.
์ด๋ ๋จ์ ๊ณต๊ฐ์ ์ ์ฐํ๊ฒ ์ฑ์ธ ๋ ์์ฃผ ์ ์ฉํ์ฃ . -
repeat(๋ฐ๋ณตํ์, ํธ๋ํฌ๊ธฐ)ํจ์: ๋์ผํ ํฌ๊ธฐ์ ํ์ด๋ ์ด์ ๋ฐ๋ณตํด์ ์์ฑํ ๋ ์ฌ์ฉํด์.
repeat(3, 1fr)์1fr 1fr 1fr๊ณผ ๋์ผํด์.
repeat(auto-fit, minmax(200px, 1fr))์ฒ๋ผ ๋ฐ์ํ ๋ ์ด์์์ ๋งค์ฐ ๊ฐ๋ ฅํ๊ฒ ํ์ฉ๋ ์ ์์ด์. -
minmax(์ต์ํฌ๊ธฐ, ์ต๋ํฌ๊ธฐ)ํจ์: ํธ๋์ ์ต์ ํฌ๊ธฐ์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ ์ํด์.
์๋ฅผ ๋ค์ดminmax(100px, 1fr)์ ์ต์ 100px์ด์ง๋ง, ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ด ๋ ์๋ค๋ฉด 1fr๋งํผ ๋์ด๋๋ผ๋ ์๋ฏธ์์.
์ด๋ฅผ ํตํด ์์๊ฐ ๋๋ฌด ์์์ง๊ฑฐ๋ ๋๋ฌด ์ปค์ง๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ด์.
.grid-container { display: grid; grid-template-columns: 1fr 2fr minmax(150px, 1fr); /* 1:2:1 ๋น์จ, ์ธ ๋ฒ์งธ ์ด์ ์ต์ 150px */ grid-template-rows: repeat(2, 100px); /* 100px ๋์ด์ ํ ๋ ๊ฐ */ gap: 10px; /* Grid ์์ดํ ๊ฐ ๊ฐ๊ฒฉ */ }
2๏ธโฃ gap (columns, rows)
gap ์์ฑ์ Grid ์์ดํ
๋ค ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ์ํด์.
์ด์ ์๋ grid-gap์ผ๋ก ์ฌ์ฉํ์ง๋ง, ํ์ฌ๋ gap ์์ฑ์ผ๋ก ํตํฉ๋์ด Flexbox์์๋ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ด์.
gap: 10px;๋ ๋ชจ๋ ๊ฐ๊ฒฉ์ 10px๋ก, gap: 10px 20px;๋ ํ ๊ฐ๊ฒฉ์ 10px, ์ด ๊ฐ๊ฒฉ์ 20px๋ก ์ค์ ํด์.
.grid-container { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(2, 100px); gap: 20px 15px; /* ํ ๊ฐ๊ฒฉ 20px, ์ด ๊ฐ๊ฒฉ 15px */ }
3๏ธโฃ grid-auto-columns, grid-auto-rows, grid-auto-flow
์ด ์์ฑ๋ค์ ๋ช
์์ ์ผ๋ก ์ ์๋์ง ์์ Grid ํธ๋(์์์ ํธ๋)์ ํฌ๊ธฐ์ ์์ดํ
๋ฐฐ์น ๋ฐฉํฅ์ ์ ์ดํ ๋ ์ฌ์ฉํด์.
๋ชจ๋ ์์ดํ
์ด ๋ช
์์ ์ผ๋ก ๋ฐฐ์น๋์ง ์๊ฑฐ๋, grid-template-columns/grid-template-rows๋ก ์ ์๋ ํธ๋๋ณด๋ค ๋ ๋ง์ ์์ดํ
์ด ์์ ๋ ์ ์ฉํ์ฃ .
-
grid-auto-columns/grid-auto-rows: ์์์ ์ผ๋ก ์์ฑ๋๋ ์ด/ํ์ ํฌ๊ธฐ๋ฅผ ์ ์ํด์.
์๋ฅผ ๋ค์ดgrid-auto-rows: 50px;๋ ๋ช ์๋์ง ์์ ํ์ ๋์ด๋ฅผ 50px๋ก ๋ง๋ค์ด์. -
grid-auto-flow: Grid ์์ดํ ์ด ์๋์ผ๋ก ๋ฐฐ์น๋๋ ๋ฐฉํฅ์ ๊ฒฐ์ ํด์.
๊ธฐ๋ณธ๊ฐ์row๋ก, ์์ดํ ์ด ํ ๋ฐฉํฅ์ผ๋ก ์ฑ์์ง๋ค๊ฐ ๋ค์ ํ์ผ๋ก ๋์ด๊ฐ์.
column์ผ๋ก ์ค์ ํ๋ฉด ์ด ๋ฐฉํฅ์ผ๋ก ์ฑ์์ง๊ณ ์.
denseํค์๋๋ฅผ ์ถ๊ฐํ๋ฉด Grid๊ฐ ๋น ๊ณต๊ฐ์ ์ฑ์ฐ๊ธฐ ์ํด ์์ดํ ์์๋ฅผ ์ฌ๋ฐฐ์นํ ์ ์์ด์.
.grid-container { display: grid; grid-template-columns: repeat(2, 1fr); /* ๋ ๊ฐ์ ์ด๋ง ๋ช ์์ ์ผ๋ก ์ ์ */ grid-auto-rows: 80px; /* ๋ช ์๋์ง ์์ ํ์ 80px ๋์ด๋ก */ grid-auto-flow: row dense; /* ํ ๋ฐฉํฅ์ผ๋ก ๋น ๊ณต๊ฐ ์ฑ์ฐ๋ฉฐ ๋ฐฐ์น */ }
์ ์ฉํ ํ
denseํค์๋๋ฅผ ์ฌ์ฉํ ๋๋ ์์ดํ ์ ์๊ฐ์ ์์๊ฐ HTML ๋ฌธ์ ์์์ ๋ฌ๋ผ์ง ์ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํด์.
์ ๊ทผ์ฑ(์คํฌ๋ฆฐ ๋ฆฌ๋ ๋ฑ)์ ๊ณ ๋ คํด์ผ ํ๋ ๊ฒฝ์ฐ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํด์.
๐ ์ค์ ๋ ์ด์์ ํจํด ๋ง์คํฐํ๊ธฐ
์ด์ Grid์ ์ฌํ ๊ฐ๋ ๋ค์ ํ์ฉํ์ฌ ์ค์ ์น ํ์ด์ง์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ ์ด์์ ํจํด๋ค์ ๊ตฌํํด๋ณผ๊ฒ์.
0๏ธโฃ ์์ญ ์ด๋ฆ์ ํ์ฉํ ๋ ์ด์์ (grid-template-areas)
grid-template-areas๋ Grid ๋ ์ด์์์ ๊ฝ์ด๋ผ๊ณ ํ ์ ์์ด์.
์์ญ(area)์ ์ด๋ฆ์ ๋ถ์ฌํ๊ณ , ์๊ฐ์ ์ผ๋ก ๋ ์ด์์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ์ ์๊ฒ ํด์ฃผ์ด ์ฝ๋์ ๊ฐ๋
์ฑ์ ๋น์ฝ์ ์ผ๋ก ๋์ฌ์ค์.
๋ง์น ์์คํค ์ํธ์ฒ๋ผ ๋ ์ด์์์ ๊ทธ๋ฆฌ๋ ๋๋์ผ๋ก ์ฌ์ฉํ ์ ์์ฃ .
.grid-container { display: grid; grid-template-columns: 200px 1fr 200px; grid-template-areas: "header header header" "nav main aside" "footer footer footer"; gap: 10px; height: 100vh; } .header { grid-area: header; background-color: lightcoral; } .nav { grid-area: nav; background-color: lightblue; } .main { grid-area: main; background-color: lightgreen; } .aside { grid-area: aside; background-color: lightgoldenrodyellow; } .footer { grid-area: footer; background-color: lightgray; }
์ CSS ์ฝ๋๋ฅผ ๋ณด๋ฉด <header>, <nav>, <main>, <aside>, <footer> ์์ญ์ด ์ด๋ป๊ฒ ๋ฐฐ์น๋ ์ง ํ๋์ ํ์
ํ ์ ์์ด์.
๊ฐ Grid ์์ดํ
์ grid-area ์์ฑ์ผ๋ก ์์ ์ด ์ด๋ค ์์ญ์ ์ํ ์ง ์ง์ ํ๊ธฐ๋ง ํ๋ฉด ๋ผ์.
1๏ธโฃ ์์ดํ
๋ฐฐ์น ์ ์ด (grid-column, grid-row, justify-self, align-self)
Grid ์์ดํ
์ ๊ฐ๋ณ์ ์ธ ๋ฐฐ์น์ ์ ๋ ฌ์ grid-column, grid-row, justify-self, align-self ์์ฑ์ ํตํด ์ ๊ตํ๊ฒ ์ ์ดํ ์ ์์ด์.
-
grid-column/grid-row: ์์ดํ ์ด ์ฐจ์งํ ์ด/ํ์ ์์์ ๊ณผ ๋์ ์ ์ ์ํด์.
๋ผ์ธ ๋ฒํธ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋spanํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ๊ฐ์ ํธ๋์ ์ฐจ์งํ ์ง ์ง์ ํ ์ ์์ด์.
grid-column: 1 / 3;์ ์ฒซ ๋ฒ์งธ ๋ผ์ธ์์ ์์ํ์ฌ ์ธ ๋ฒ์งธ ๋ผ์ธ์์ ๋๋๋ (์ฆ, ๋ ๊ฐ์ ์ด์ ์ฐจ์งํ๋) ์๋ฏธ์์.
grid-column: span 2;๋ ํ์ฌ ์์น์์ ๋ ๊ฐ์ ์ด์ ์ฐจ์งํ๋ ์๋ฏธ์ด๊ณ ์.
์ถ์ฝํ์ผ๋กgrid-area์ฒ๋ผgrid-column: ์์ / ๋;๋๋grid-row: ์์ / ๋;์ผ๋ก ์ฌ์ฉํ ์ ์์ด์. -
justify-self/align-self: ๊ฐ๋ณ Grid ์์ดํ ์ ํด๋น ์ (cell) ๋ด์์ ์ ๋ ฌํด์.
justify-self๋ ๊ฐ๋ก ๋ฐฉํฅ(์ด ์ถ) ์ ๋ ฌ(start,end,center,stretch),align-self๋ ์ธ๋ก ๋ฐฉํฅ(ํ ์ถ) ์ ๋ ฌ(start,end,center,stretch)์ ๋ด๋นํด์.
์ปจํ ์ด๋ ์ ์ฒด ์์ดํ ์ ์ ๋ ฌํ๋ ค๋ฉดjustify-items์align-items๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ์.
.grid-container { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(2, 100px); gap: 10px; } .item-1 { grid-column: 1 / span 2; /* ์ฒซ ๋ฒ์งธ ์ด์์ ์์ํ์ฌ ๋ ๊ฐ์ ์ด์ ์ฐจ์ง */ grid-row: 1; /* ์ฒซ ๋ฒ์งธ ํ์ ๋ฐฐ์น */ background-color: lightcoral; justify-self: center; /* ์ ๋ด์์ ๊ฐ๋ก ์ค์ ์ ๋ ฌ */ align-self: end; /* ์ ๋ด์์ ์ธ๋ก ํ๋จ ์ ๋ ฌ */ } .item-2 { grid-column: 3; /* ์ธ ๋ฒ์งธ ์ด์ ๋ฐฐ์น */ grid-row: 1 / span 2; /* ์ฒซ ๋ฒ์งธ ํ์์ ์์ํ์ฌ ๋ ๊ฐ์ ํ์ ์ฐจ์ง */ background-color: lightblue; }
2๏ธโฃ ๋ฐ์ํ Grid ๋์์ธ ์ ๋ต (@media, auto-fit, auto-fill)
Grid๋ ๋ฐ์ํ ๋์์ธ์ ๋งค์ฐ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ ์ ์๋๋ก ๋์์ค์.
์ฃผ๋ก ๋ฏธ๋์ด ์ฟผ๋ฆฌ(@media)์ repeat() ํจ์์ auto-fit, auto-fill ํค์๋๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํด์.
-
@media์grid-template-areas์กฐํฉ:
ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผgrid-template-areas์ ์ ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ ์ฒด ๋ ์ด์์ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์์ด์.
์๋ฅผ ๋ค์ด, ๋ฐ์คํฌํฑ์์๋ ์ฌ์ด๋๋ฐ๊ฐ ์๋ 3๋จ ๋ ์ด์์์, ๋ชจ๋ฐ์ผ์์๋ ์ฌ์ด๋๋ฐ๋ฅผ ์๋๋ก ๋ด๋ฆฌ๋ 1๋จ ๋ ์ด์์์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฑฐ์ฃ ..grid-container { display: grid; grid-template-columns: 200px 1fr; /* ๋ฐ์คํฌํฑ: ์ข์ธก ์ฌ์ด๋๋ฐ, ๋ฉ์ธ ์ฝํ ์ธ */ grid-template-areas: "nav main"; } /* ๋ชจ๋ฐ์ผ ํ๋ฉด์์๋ ๋ ์ด์์ ๋ณ๊ฒฝ */ @media (max-width: 768px) { .grid-container { grid-template-columns: 1fr; /* ๋ชจ๋ฐ์ผ: 1๋จ ๋ ์ด์์ */ grid-template-areas: "main" "nav"; /* nav๋ฅผ main ์๋๋ก ๋ฐฐ์น */ } } -
auto-fit/auto-fill๊ณผminmax()์กฐํฉ:
์ด ์กฐํฉ์ ํนํ ์์ดํ ์ ๊ฐ์๊ฐ ๊ฐ๋ณ์ ์ด๊ฑฐ๋, ์ ๋์ ์ธ ํฌ๊ธฐ์ ๊ทธ๋ฆฌ๋ ๊ฐค๋ฌ๋ฆฌ ๋ฑ์ ๋ง๋ค ๋ ์์ฃผ ๊ฐ๋ ฅํด์.
repeat(auto-fit, minmax(์ต์ํฌ๊ธฐ, 1fr))ํจํด์ ๊ธฐ์ตํ์๋ฉด ์ข์์.auto-fill: ์ปจํ ์ด๋์ ๋ค์ด๊ฐ ์ ์๋ ๋งํผ ์ต๋ํ ๋ง์ ํธ๋์ ์์ฑํด์.
๋จ๋ ๊ณต๊ฐ์ด ์๊ธฐ๋ฉด ๋น ํธ๋์ผ๋ก ๋จ๊ฒจ๋์ฃ .auto-fit:auto-fill๊ณผ ๋น์ทํ์ง๋ง, ๋น ํธ๋์ ์ถ์ํ์ฌ ์์ ๊ณ , ๋จ์ ๊ณต๊ฐ์ ์ฑ์ฐ๊ธฐ ์ํด ์ค์ ์์ดํ ๋ค์ด ์ฐจ์งํ๋ ํธ๋์ ํฌ๊ธฐ๋ฅผ ๋๋ ค์.
์ฆ,auto-fit์ ๋น ๊ณต๊ฐ์ ์ฑ์ฐ๊ธฐ ์ํด ์์ดํ ์ ๋๋ฆฌ๊ณ ,auto-fill์ ๋น ํธ๋์ ์ ์งํ๋ฉฐ ์์ดํ ์ ๋๋ฆฌ์ง ์์์.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ
auto-fit์ด ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ผ์..gallery-container { display: grid; /* ์ต์ 250px ํฌ๊ธฐ์ ์ด์ ์ต๋ํ ์ฑ์ฐ๊ณ , ๋จ๋ ๊ณต๊ฐ์ ์์ดํ ๋ค์ด ๊ท ๋ฑํ๊ฒ ๋๋ ๊ฐ์ง */ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; }์ ์ฉํ ํauto-fit๊ณผauto-fill์ ์ฐจ์ด๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ธํด๋ณด๊ณ ์ถ๋ค๋ฉด, ๊ฐ๋ฐ์ ๋๊ตฌ๋ก Grid ์ปจํ ์ด๋์ ๋๋น๋ฅผ ์กฐ์ ํด๋ณด๋ฉด์ ์์ดํ ๊ฐ์๊ฐ ์ค์ด๋ค ๋auto-fit์ ์์ดํ ํฌ๊ธฐ๋ฅผ ๋๋ ค ๋น ๊ณต๊ฐ์ ์ฑ์ฐ๊ณ ,auto-fill์ ๋น ๊ณต๊ฐ์ ํธ๋์ผ๋ก ๋จ๊ฒจ๋๋ ๊ฒ์ ๊ด์ฐฐํด๋ณด์ธ์.
๐งช ์ฝ๋ ์์: ๋ฐ์ํ ๋์๋ณด๋ ๋ ์ด์์
์ด์ ์์์ ๋ฐฐ์ด ๊ฐ๋ ๋ค์ ์ด๋์ํ์ฌ ๊ฐ๋จํ ๋ฐ์ํ ๋์๋ณด๋ ๋ ์ด์์์ ๋ง๋ค์ด๋ณผ๊ฒ์.
0๏ธโฃ HTML ๊ตฌ์กฐ
<div class="dashboard-layout"> <header class="header">๋์๋ณด๋ ํค๋</header> <nav class="sidebar">์ฌ์ด๋๋ฐ</nav> <main class="main-content"> <h1>๋ฉ์ธ ์ฝํ ์ธ </h1> <div class="cards"> <div class="card">์นด๋ 1</div> <div class="card">์นด๋ 2</div> <div class="card">์นด๋ 3</div> <div class="card">์นด๋ 4</div> </div> </main> <footer class="footer">ํธํฐ</footer> </div>
1๏ธโฃ ๊ธฐ๋ณธ Grid ์ค์ (๋ฐ์คํฌํฑ)
๋จผ์ ๋ฐ์คํฌํฑ ํ๊ฒฝ์ ๊ธฐ์ค์ผ๋ก ๋ ์ด์์์ ์ค์ ํ ๊ฒ์.
grid-template-areas๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ช
ํํ๊ฒ ์ ์ํ ๊ฑฐ์์.
.dashboard-layout { display: grid; min-height: 100vh; grid-template-columns: 250px 1fr; /* ์ฌ์ด๋๋ฐ 250px, ๋ฉ์ธ ์ฝํ ์ธ ๋จ์ ๊ณต๊ฐ */ grid-template-rows: auto 1fr auto; /* ํค๋, ๋ฉ์ธ, ํธํฐ */ grid-template-areas: "header header" "sidebar main" "footer footer"; gap: 20px; /* ์ ์ฒด ๋ ์ด์์ ์์ ๊ฐ ๊ฐ๊ฒฉ */ padding: 20px; background-color: #f0f2f5; } .header { grid-area: header; background-color: #4a90e2; color: white; padding: 20px; border-radius: 8px; } .sidebar { grid-area: sidebar; background-color: #ffffff; padding: 20px; border-radius: 8px; } .main-content { grid-area: main; background-color: #ffffff; padding: 20px; border-radius: 8px; } .footer { grid-area: footer; background-color: #333; color: white; padding: 20px; text-align: center; border-radius: 8px; } .cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); /* ๋ฐ์ํ ์นด๋ ๊ทธ๋ฆฌ๋ */ gap: 15px; margin-top: 20px; } .card { background-color: #e0f2f7; padding: 25px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); text-align: center; }
2๏ธโฃ ๋ฐ์ํ ์ฒ๋ฆฌ (๋ชจ๋ฐ์ผ)
์ด์ ์์ ํ๋ฉด(๋ชจ๋ฐ์ผ)์์ ๋ ์ด์์์ด ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋ ์ง @media ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ ๊ฒ์.
์ฌ์ด๋๋ฐ๋ฅผ ๋ฉ์ธ ์ฝํ
์ธ ์๋๋ก ์ฎ๊ธฐ๊ณ , ์ ์ฒด ๋ ์ด์์์ 1๋จ์ผ๋ก ๋ณ๊ฒฝํ ๊ฑฐ์์.
@media (max-width: 768px) { .dashboard-layout { grid-template-columns: 1fr; /* ๋ชจ๋ฐ์ผ์์๋ 1๋จ ๋ ์ด์์ */ grid-template-rows: auto auto 1fr auto; /* ํค๋, ์ฌ์ด๋๋ฐ, ๋ฉ์ธ, ํธํฐ */ grid-template-areas: "header" "sidebar" "main" "footer"; padding: 15px; } }
์ด ์ฝ๋๋ฅผ ํตํด ๋ฐ์คํฌํฑ์์๋ ์ฌ์ด๋๋ฐ๊ฐ ์ผ์ชฝ์ ์๋ 2๋จ ๋ ์ด์์์ด, ํ๋ฉด ๋๋น๊ฐ 768px ์ดํ๋ก ์ค์ด๋ค๋ฉด ์ฌ์ด๋๋ฐ๊ฐ ํค๋ ์๋, ๋ฉ์ธ ์ฝํ
์ธ ์๋ก ์ด๋ํ๋ 1๋จ ๋ ์ด์์์ผ๋ก ์๋์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
cards ์ปจํ
์ด๋์๋ repeat(auto-fit, minmax(280px, 1fr))์ ์ ์ฉํ์ฌ ์นด๋๋ค์ด ํ๋ฉด ๋๋น์ ๋ฐ๋ผ ์๋์ผ๋ก ์ค ์๋ฅผ ์กฐ์ ํ๊ณ ํฌ๊ธฐ๋ฅผ ์ ์ฐํ๊ฒ ์กฐ์ ํ๋๋ก ๋ง๋ค์์ด์.
๐ ์ ๋ฆฌํ๋ฉฐ
์ค๋์ CSS Grid์ ์ฌํ ๊ฐ๋
๊ณผ ์ค์ ๋ ์ด์์ ํจํด, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ํ ๋์์ธ ์ ๋ต๊น์ง ํญ๋๊ฒ ๋ค๋ค๋ดค์ด์.
fr ๋จ์, repeat(), minmax(), grid-template-areas, auto-fit/auto-fill ๊ฐ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๋ค์ ์ ์ดํดํ๊ณ ํ์ฉํ๋ฉด, ์ด๋ค ๋ณต์กํ ๋ ์ด์์๋ ์ง๊ด์ ์ด๊ณ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์
จ์ ๊ฑฐ์์.
0๏ธโฃ ํต์ฌ ์์ฝ
- CSS Grid๋ 2์ฐจ์ ๋ ์ด์์์ ์ต์ ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์์.
fr๋จ์๋ ๋จ์ ๊ณต๊ฐ์ ๋น์จ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ํ ๋นํด์.repeat()ํจ์์minmax()ํจ์๋ ๋์ ์ด๊ณ ์ ์ฐํ ํธ๋ ํฌ๊ธฐ ์ ์๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์.- **
grid-template-areas**๋ ์์ญ ์ด๋ฆ์ ํตํด ๋ ์ด์์ ๊ตฌ์กฐ๋ฅผ ์๊ฐ์ ์ผ๋ก ์ ์ํ์ฌ ๊ฐ๋ ์ฑ์ ๋์ฌ์ค์. - **
grid-column,grid-row**๋ก ๊ฐ๋ณ ์์ดํ ์ ๋ฐฐ์น ์์น์ ์ฐจ์งํ๋ ํธ๋ ์๋ฅผ ์ ์ดํด์. - **
auto-fit/auto-fill**๊ณผminmax()์กฐํฉ์ ์์ดํ ๊ฐ์๊ฐ ๊ฐ๋ณ์ ์ธ ๋ฐ์ํ ๊ทธ๋ฆฌ๋์ ๋งค์ฐ ํจ๊ณผ์ ์ด์์. @media์ฟผ๋ฆฌ์ Grid ์์ฑ์ ์กฐํฉํ์ฌ ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ์ ์ฐํ๊ฒ ๋์ํ๋ ๋ฐ์ํ ๋ ์ด์์์ ๋ง๋ค ์ ์์ด์.
1๏ธโฃ ๋ค์ ๋จ๊ณ๋ก ๋์๊ฐ๊ธฐ
์ด ๊ธ์์ ๋ค๋ฃฌ ๋ด์ฉ๋ค์ ๋ฐํ์ผ๋ก ์ค์ ํ๋ก์ ํธ์ CSS Grid๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ ์ฉํด๋ณด์๋ ๊ฒ์ ์ถ์ฒํด์.
๋ค์ํ ๋ ์ด์์์ ์ง์ ๊ตฌํํด๋ณด๋ฉด์ ๊ฐ ์์ฑ์ ๋์ ๋ฐฉ์๊ณผ ์กฐํฉ์ ์ตํ๋ ๊ฒ์ด ์ค์ํ๋ต๋๋ค.
๋ํ, Flexbox์ Grid๋ ์๋ก ๋ณด์์ ์ธ ๊ด๊ณ์ ์์ผ๋ฏ๋ก, ๋ ๊ฐ์ง๋ฅผ ์ ์ ํ ์กฐํฉํ์ฌ ์ฌ์ฉํ๋ ์ฐ์ต๋ ํด๋ณด์๋ฉด ์ข์์.
์๋ฅผ ๋ค์ด, ์ ์ฒด ํ์ด์ง ๋ ์ด์์์ Grid๋ก ์ก๊ณ , ํน์ ์น์
๋ด์ ์์ดํ
์ ๋ ฌ์ Flexbox๋ฅผ ํ์ฉํ๋ ์์ผ๋ก์.
์ฌ๋ฌ๋ถ๋ CSS Grid ๋ง์คํฐ๊ฐ ๋์ด ๋์ฑ ๋ฉ์ง ์น ํ์ด์ง๋ฅผ ๋ง๋ค ์ ์์ ๊ฑฐ์์.
๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ์ง๋ฌธํด์ฃผ์ธ์. ํจ๊ป ์ฑ์ฅํด ๋๊ฐ์!
๐ฎ ์ฐธ๊ณ
์ฐ๊ด๋ ํฌ์คํธ
- ๋จ์ด: 1,541๊ฐ20๋ถ
[๐ค] Tailwind CSS v4 ์ถ์: ๊ฐ๋ฐ์์๊ฒ ์ฐพ์์ฌ ๋ณํ์ ์ต์ ํ ์ ๋ต
Tailwind CSS v4์ ์ฃผ์ ๋ณ๊ฒฝ์ฌํญ๊ณผ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ๊น์ด ์๊ฒ ๋ถ์ํ๊ณ , ์ค๋ฌด์์ ํจ์จ์ ์ผ๋ก ์ ์ฉํ๋ฉฐ ์ฑ๋ฅ์ ์ต์ ํํ๋ ์ ๋ต์ ๋ธ๋ฃจ๊ฐ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,563๊ฐ20๋ถ
[๐ค] Next.js Dockerfile ์ต์ ํ: ํ๋ก๋์ ๋ฐฐํฌ๋ฅผ ์ํ ์๋ฒฝ ๊ฐ์ด๋
Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ Docker ์ปจํ ์ด๋๋ก ํจ์จ์ ์ผ๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ๋ฉํฐ์คํ ์ด์ง ๋น๋, ์บ์ฑ ์ ๋ต, ๋ณด์ ์ค์ ๋ฑ ํ๋ก๋์ ํ๊ฒฝ์ ์ต์ ํ๋ Dockerfile ์์ฑ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํด ๋๋ ค์.
- ๋จ์ด: 1,716๊ฐ19๋ถ
[๐ค] TypeScript ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด ํ์ : ๋ฌธ์์ด ํ์ ์ ๋ง๋ฒ์ฌ๋ก ๋ณ์ ํ๊ธฐ
TypeScript์ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด ํ์ ์ ํ์ฉํ์ฌ ๋ณต์กํ ๋ฌธ์์ด ํจํด์ ์์ ํ๊ฒ ํ์ ์ถ๋ก ํ๊ณ , ๊ฐ๋ ฅํ ์ ํธ๋ฆฌํฐ ํ์ ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ค๋ฌด ์์ ์ ํจ๊ป ์์ธํ ์์๋ด์. ํ์ ์์ ์ฑ์ ํ ๋จ๊ณ ๋์ฌ ๊ฐ๋ฐ ๊ฒฝํ์ ๊ฐ์ ํด ๋ณด์ธ์.
- ๋จ์ด: 1,917๊ฐ23๋ถ
[๐ค] JavaScript WeakMap๊ณผ WeakSet: ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง์ ์ต์ ํ ์ ๋ต
JavaScript์์ WeakMap๊ณผ WeakSet์ ํ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ์์ธํ ์์๋ด์. ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์ ์๋ฆฌ์ ํจ๊ป ๊ฐ์ฒด ์ฐธ์กฐ ๊ด๋ฆฌ์ ์ค์์ฑ์ ์ดํดํ๊ณ , ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ์ ๋ต์ ๋ฐฐ์๋ด์.
- ๋จ์ด: 1,446๊ฐ17๋ถ
[๐ค] Next.js/React ํ๋ก์ ํธ๋ฅผ ์ํ ESLint & Prettier ์ค์ ์๋ฒฝ ๊ฐ์ด๋
๋ณต์กํ Next.js ๋ฐ React ํ๋ก์ ํธ์์ ์ผ๊ด๋ ์ฝ๋ ์คํ์ผ๊ณผ ํ์ง์ ์ ์งํ๋ ESLint์ Prettier ์ค์ ๋ฐฉ๋ฒ์ ์์ธํ ์๋ ค๋๋ ค์. ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ต์ ํ๋ ์ค์ ์ผ๋ก ๊ฐ๋ฐ ํจ์จ์ ๋์ฌ๋ณด์ธ์.
- ๋จ์ด: 2,006๊ฐ25๋ถ
[๐ค] JavaScript์ ํต์ฌ: ํ๋กํ ํ์ ์ฒด์ธ ์๋ฒฝ ์ดํด์ ํ์ฉ ์ ๋ต
JavaScript์ ์ฌ์ฅ๋ถ, ํ๋กํ ํ์ ์ฒด์ธ์ ๋์ ์๋ฆฌ๋ฅผ ๊น์ด ํ๊ณ ๋ค์ด ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ ์์์ ์๋ฒฝํ๊ฒ ์ดํดํ๊ณ ์ค๋ฌด์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์. ์ฑ๋ฅ ์ต์ ํ ํ๋ ํจ๊ป ๋ค๋ค์.
- ๋จ์ด: 2,087๊ฐ22๋ถ
[๐ค] React ์ปค์คํ ํ : ์ฌ์ฌ์ฉ์ฑ ๋์ด๋ ์ค๊ณ ์์น๊ณผ ํ ์คํธ ์ ๋ต
React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๊ทน๋ํํ๋ ์ปค์คํ ํ ์ค๊ณ ์์น, ์ค์ฉ์ ์ธ ํจํด, ๊ทธ๋ฆฌ๊ณ ๊ฒฌ๊ณ ํ ํ ์คํธ ์ ๋ต์ ์๋์ด ๊ฐ๋ฐ์์ ๊ด์ ์์ ์์ธํ ์ค๋ช ํด ๋๋ ค์.
- ๋จ์ด: 2,107๊ฐ23๋ถ
[๐ค] React useRef ํ ์ฌ์ธต ๋ถ์: DOM ๋์ด์ ์ค์ ํ์ฉ ์ ๋ต
React useRef ํ ์ ๊ธฐ๋ณธ ์๋ฆฌ๋ถํฐ DOM ์์ ์ง์ ์ ์ด, ์ปดํฌ๋ํธ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๋ค์ํ ์ค์ ํ์ฉ ์ ๋ต๊น์ง ์ฌ์ธต์ ์ผ๋ก ๋ค๋ค์. ์ด์ค๊ธ ๊ฐ๋ฐ์๋ฅผ ์ํ useRef ์๋ฒฝ ๊ฐ์ด๋.
- ๋จ์ด: 1,762๊ฐ19๋ถ
[๐ค] Next.js 14/15์์ ๋์ OG ์ด๋ฏธ์ง ์์ฑ: ImageResponse ์๋ฒฝ ๊ฐ์ด๋
Next.js App Router ํ๊ฒฝ์์ ImageResponse๋ฅผ ํ์ฉํ์ฌ ๋์ OG ์ด๋ฏธ์ง๋ฅผ ํจ์จ์ ์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. SEO์ ์์ ๊ณต์ ์ต์ ํ๋ฅผ ์ํ ์ค์ ๊ฐ์ด๋์ ๋๋ค.
- ๋จ์ด: 1,481๊ฐ18๋ถ
[๐ค] Git ๋ธ๋์น ์ ๋ต: Git Flow vs GitHub Flow, ์ค๋ฌด์์ ์ด๋ป๊ฒ ์ ํํ๊ณ ์ด์ํ ๊น์?
๊ฐ๋ฐํ์ ํจ์จ์ ์ธ ํ์ ์ ์ํ Git ๋ธ๋์น ์ ๋ต์ ๊ณ ๋ฏผํ๊ณ ๊ณ์ ๊ฐ์? Git Flow์ GitHub Flow์ ํต์ฌ ๊ฐ๋ ๋ถํฐ ์ฅ๋จ์ , ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ํ์ ๋ง๋ ์ ๋ต์ ์ ํํ๊ณ ์ด์ํ๋ ์ค์ง์ ์ธ ํ๊น์ง '๋ธ๋ฃจ'๊ฐ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,442๊ฐ16๋ถ
[๐ค] TypeScript ํ์ ๊ฐ๋: ๋ฐํ์ ํ์ ์์ ์ฑ์ ์ํ ํ์ ํจํด ์ ๋ณตํด์
TypeScript์์ ๋ฐํ์์ ๋ณ์์ ํ์ ์ ์์ ํ๊ฒ ์ขํ๋(Narrowing) ๋ฐฉ๋ฒ์ธ ํ์ ๊ฐ๋(Type Guard)์ ๋ํด ์์ธํ ์์๋ด์. `typeof`, `instanceof`, `in` ์ฐ์ฐ์๋ถํฐ ์ฌ์ฉ์ ์ ์ ํ์ ๊ฐ๋๊น์ง, ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ๊ฒฌ๊ณ ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ตํ๋ด์.
- ๋จ์ด: 2,542๊ฐ28๋ถ
[๐ค] React Query (TanStack Query) ์ฌํ: ๋ฐ์ดํฐ ํ์นญ, ์บ์ฑ, ๋๊ธฐํ ์ ๋ต์ผ๋ก ์น ์ฑ ์ฑ๋ฅ ๊ทน๋ํํด์
React Query (TanStack Query)๋ฅผ ํ์ฉํ์ฌ ๋ณต์กํ ์๋ฒ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ์ง๋ฅ์ ์ธ ์บ์ฑ๊ณผ ์๋ ๋๊ธฐํ ์ ๋ต์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ทน๋ํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ์ด์. useQuery, useMutation, useInfiniteQuery ๋ฑ ํต์ฌ ํ ๊ณผ ์ค์ ์ต์ ํ ํ์ ๋ฐฐ์๋ณด์ธ์.
- ๋จ์ด: 2,401๊ฐ26๋ถ
[๐ค] React `useTransition`๊ณผ `useDeferredValue`๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ๊ทน๋ํํ๋ ๋ฐฉ๋ฒ
React ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฌด๊ฑฐ์ด UI ์ ๋ฐ์ดํธ๋ก ์ธํ ๋ฒ๋ฒ ์์ ํด๊ฒฐํ๊ณ , `useTransition`๊ณผ `useDeferredValue` ํ ์ ํ์ฉํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํ๋ ์ค์ฉ์ ์ธ ์ ๋ต์ ๋ฐฐ์๋ณด์ธ์.
- ๋จ์ด: 1,917๊ฐ22๋ถ
[๐ค] React Suspense์ ErrorBoundary: ๊ฒฌ๊ณ ํ๊ณ ๋ถ๋๋ฌ์ด UI ๊ฒฝํ์ ์ํ ์ค์ ๊ฐ์ด๋
React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์ ๊ฒฝํ์ ํ์ ํ Suspense์ ErrorBoundary์ ๊ฐ๋ ฅํ ์กฐํฉ์ ๊น์ด ์๊ฒ ๋ค๋ค์. ๋ก๋ฉ ์ํ์ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ฐ์ํ๊ฒ ๊ด๋ฆฌํ์ฌ ๋์ฑ ๊ฒฌ๊ณ ํ๊ณ ๋ถ๋๋ฌ์ด UI๋ฅผ ๋ง๋๋ ์ค์ ํ๊ณผ ์ฝ๋ ์์๋ฅผ ํ์ธํด ๋ณด์ธ์.
- ๋จ์ด: 1,302๊ฐ16๋ถ
[๐ค] CSS Container Queries: ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๋ฐ์ํ ๋์์ธ์ ์๋ก์ด ์งํ
๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ํ๊ณ๋ฅผ ๋์ด, ์ปดํฌ๋ํธ ์์ฒด์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์คํ์ผ์ ์กฐ์ ํ๋ CSS Container Queries๋ฅผ ๊น์ด ์๊ฒ ์์๋ณด๊ณ ์ค๋ฌด ์ ์ฉ ๋ฐฉ๋ฒ์ ์๋ดํด ๋๋ ค์.
- ๋จ์ด: 1,681๊ฐ19๋ถ
[๐ค] Next.js 15 ๊ณ ๊ธ ๋ฐ์ดํฐ ์บ์ฑ ์ ๋ต: fetch์ revalidate ์ฌ์ธต ๋ถ์
Next.js 15์์ `fetch` API์ ๊ฐ๋ ฅํ ์บ์ฑ ๋ฉ์ปค๋์ฆ๊ณผ `revalidate` ์ต์ ์ ํ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ์ด์. ์ค๋ฌด ์์๋ฅผ ํตํด ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ์บ์ฑ ์ ๋ต์ ํจ๊ณผ์ ์ผ๋ก ์ ์ฉํ๋ ํ์ ์ ๊ณตํด์.
๋จ์ด: 1,320๊ฐ14๋ถ[๐ค] Next.js App Router: generateStaticParams๋ก ๋์ ๋ผ์ฐํ ๋น๋ ์ต์ ํํ๊ธฐ
Next.js App Router์์ generateStaticParams ํจ์๋ฅผ ํ์ฉํ์ฌ ๋์ ๋ผ์ฐํ ์ ์ ์ ํ์ด์ง๋ฅผ ํจ์จ์ ์ผ๋ก ์์ฑํ๊ณ ๋น๋ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ์์ธํ ์์๋ด์.
๋จ์ด: 1,891๊ฐ22๋ถ[๐ค] React ๋ ๋๋ง ์ต์ ํ: useMemo, useCallback, React.memo ์๋ฒฝ ๊ฐ์ด๋
์ด์ค๊ธ ๊ฐ๋ฐ์๋ฅผ ์ํ React ๋ ๋๋ง ์ต์ ํ ๊ฐ์ด๋. useMemo, useCallback, React.memo์ ์ ํํ ์ฌ์ฉ๋ฒ๊ณผ ์ค๋ฌด์์ ํํ ์ ์ง๋ฅด๋ ์ค์, ๊ทธ๋ฆฌ๊ณ ์ค์ ์ฑ๋ฅ ํฅ์ ์ ๋ต์ ๋ธ๋ฃจ๊ฐ ์๋ ค๋๋ ค์.
๋จ์ด: 2,145๊ฐ24๋ถ[๐ค] JavaScript Proxy์ Reflect ์ฌ์ธต ๋ถ์: ๋ฉํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ฝ๋ ๊ฐํํ๊ธฐ
JavaScript Proxy์ Reflect API๋ฅผ ํ์ฉํ ๋ฉํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ์ฌ์ธต ๋ถ์ํด์. ๊ฐ์ฒด ์ ๊ทผ ์ ์ด, ์ ํจ์ฑ ๊ฒ์ฌ, ๋ก๊น , ๋ฐ์ํ ์์คํ ๊ตฌํ ๋ฑ ์ค์ฉ์ ์ธ ํ์ฉ ์ฌ๋ก๋ฅผ ํตํด ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์์ ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
- ๋จ์ด: 2,029๊ฐ24๋ถ
[๐ค] React/Next.js ๋ฒ๋ค ์ต์ ํ: ์ฝ๋ ์คํ๋ฆฌํ ๊ณผ ๋ ์ด์ง ๋ก๋ฉ ์๋ฒฝ ๊ฐ์ด๋
React์ Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ๋ ์ฝ๋ ์คํ๋ฆฌํ ๊ณผ ๋ ์ด์ง ๋ก๋ฉ ๊ธฐ๋ฒ์ ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ์์ธํ ์์๋ด์. ์นํฉ ์ค์ ๋ถํฐ React.lazy, Next.js dynamic import๊น์ง ๋ค๋ค์.
- ๋จ์ด: 1,770๊ฐ20๋ถ
[๐ค] React์ `useOptimistic` ํ ์ผ๋ก ๋๊ด์ UI ์ ๋ฐ์ดํธ ๊ตฌํํ๊ธฐ: Server Actions์ ํจ๊ป
React 18/19์ `useOptimistic` ํ ์ ํ์ฉํ์ฌ Server Actions์ ์ฐ๋๋๋ ๋๊ด์ UI ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ค์ฉ์ ์ธ ์์์ ํจ๊ป ์์ธํ ์์๋ด์. ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ๋์ด๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํด์.
๋จ์ด: 1,561๊ฐ17๋ถ[๐ค] TypeScript const Type Parameters: ๋ฆฌํฐ๋ด ํ์ ์ถ๋ก ๊ฐํ์ ์ค์ฉ์ ์ธ ํ์ฉ๋ฒ
TypeScript 5.0์ ๋์ ๋ const Type Parameters๋ฅผ ํ์ฉํ์ฌ ์ ๋ค๋ฆญ ํจ์์ ๋ฆฌํฐ๋ด ํ์ ์ถ๋ก ์ ์ ๊ตํ๊ฒ ์ ์ดํ๊ณ , ๋์ฑ ๊ฒฌ๊ณ ํ ํ์ ์์คํ ์ ๊ตฌ์ถํ๋ ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. as const์์ ์ฐจ์ด์ ๊ณผ ์ค์ ์ฝ๋ ์์๋ฅผ ํตํด ์ด์ค๊ธ ๊ฐ๋ฐ์๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ค๋ช ํด ๋๋ ค์.
- ๋จ์ด: 2,028๊ฐ22๋ถ
[๐ค] Next.js/React ์ฑ CLS ์ต์ ํ: ์ํํธ ์๋ ์ฌ์ฉ์ ๊ฒฝํ ๋ง๋ค๊ธฐ
Next.js์ React ์ ํ๋ฆฌ์ผ์ด์ ์์ Cumulative Layout Shift(CLS) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ ์ค์ง์ ์ธ ์ ๋ต๊ณผ ์ฝ๋ ์์๋ฅผ ์์ธํ ์์๋ณด์ธ์. ์น ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ ์์์ธ CLS๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,740๊ฐ21๋ถ
[๐ค] Next.js SSR, SSG, ISR ๋ ๋๋ง ์ ๋ต: App Router์์ ์ต์ ์ ์ ํ์?
Next.js App Router์์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR), ์ ์ ์ฌ์ดํธ ์์ฑ(SSG), ์ฆ๋ถ ์ ์ ์ฌ์์ฑ(ISR) ๊ฐ ๋ ๋๋ง ์ ๋ต์ ๋์ ์๋ฆฌ, ์ฅ๋จ์ , ์ค์ ํ์ฉ ๋ฐ ์ต์ ํ ๋ฐฉ๋ฒ์ ๋น๊ต ๋ถ์ํด๋๋ ค์.
- ๋จ์ด: 1,478๊ฐ17๋ถ
[๐ค] React Context API์ Zustand: ์ ์ญ ์ํ ๊ด๋ฆฌ, ์ธ์ ๋ฌด์์ ์จ์ผ ํ ๊น์?
React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ณ ๋ฏผํ๊ณ ๊ณ์ ๊ฐ์? Context API์ ๊ฐ๋ฒผ์ด ์ธ๋ถ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Zustand๋ฅผ ๋น๊ต ๋ถ์ํ๊ณ , ์ค๋ฌด์์ ๊ฐ ๋๊ตฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ์ ๋ต์ ์ค์ ์ฝ๋ ์์์ ํจ๊ป ์์ธํ ์๋ ค๋๋ ค์.
- ๋จ์ด: 2,004๊ฐ24๋ถ
[๐ค] Turborepo๋ก Next.js ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์ถ: ํจ์จ์ ์ธ ๊ฐ๋ฐ ๋ฐ ์ต์ ํ ์ ๋ต
Turborepo๋ฅผ ํ์ฉํ์ฌ Next.js ํ๋ก์ ํธ๋ฅผ ๋ชจ๋ ธ๋ ํฌ๋ก ๊ตฌ์ฑํ๊ณ , ๊ณต์ ์ปดํฌ๋ํธ, ์ ํธ๋ฆฌํฐ, CI/CD ์ต์ ํ ๋ฐฉ์์ ์ค๋ฌด ์์์ ํจ๊ป ์์ธํ ์ค๋ช ํด ๋๋ ค์.
- ๋จ์ด: 2,338๊ฐ27๋ถ
[๐ค] React useEffect ํ , ์ด์ ํท๊ฐ๋ฆฌ์ง ๋ง์ธ์! (์์กด์ฑ ๋ฐฐ์ด, ํด๋ฆฐ์ ์๋ฒฝ ๊ฐ์ด๋)
React ๊ฐ๋ฐ์์ ํ์์ ์ธ useEffect ํ ์ ๋์ ์๋ฆฌ๋ถํฐ ์์กด์ฑ ๋ฐฐ์ด, ํด๋ฆฐ์ ํจ์ ํ์ฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์ ์์ฃผ ๊ฒช๋ ์ค์์ ์ต์ ํ ์ ๋ต๊น์ง, ์ด์ค๊ธ ๊ฐ๋ฐ์๋ฅผ ์ํ ์๋ฒฝ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํด์.
- ๋จ์ด: 3,284๊ฐ31๋ถ
[๐ค] Next.js Server Actions ์ค์ : ์๋ฌ ์ฒ๋ฆฌ, ์ ํจ์ฑ ๊ฒ์ฌ, ๋๊ด์ UI ์ ๋ฐ์ดํธ
Next.js Server Actions๋ฅผ ์ค๋ฌด์ ์ ์ฉํ ๋ ๋ง์ฃผํ๋ ์๋ฌ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋๊ด์ UI ์ ๋ฐ์ดํธ ๊ธฐ๋ฒ์ ์์ธํ ์ฝ๋ ์์์ ํจ๊ป ์์๋ณด์ธ์.
๋จ์ด: 1,983๊ฐ21๋ถ[๐ค] TypeScript ์ ํธ๋ฆฌํฐ ํ์ ์๋ฒฝ ๊ฐ์ด๋: ์ค์ ํ์ฉ ํจํด
TypeScript ์ ํธ๋ฆฌํฐ ํ์ ์ ํต์ฌ ๊ฐ๋ ๊ณผ ์ค์ ํ์ฉ๋ฒ์ ๊น์ด ์๊ฒ ๋ค๋ค์. Pick, Omit, Partial, Required ๋ฑ ์์ฃผ ์ฐ๋ ์ ํธ๋ฆฌํฐ ํ์ ์ผ๋ก ๋ณต์กํ ํ์ ์ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์. ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์์ ์ฑ์ ๋์ด๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํด์.
- ๋จ์ด: 1,712๊ฐ20๋ถ
[๐ค] Next.js App Router ๋ฏธ๋ค์จ์ด: ๊ฐ๋ ฅํ ์์ฒญ ์ฒ๋ฆฌ ์ ๋ต๊ณผ ์ค์ ์์
Next.js App Router ํ๊ฒฝ์์ ๋ฏธ๋ค์จ์ด๋ฅผ ํ์ฉํด ์ฌ์ฉ์ ์ธ์ฆ, ๋ฆฌ๋ค์ด๋ ์ , ๊ตญ์ ํ ๋ฑ์ ์์ฒญ ์ฒ๋ฆฌ ๋ก์ง์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ค์ ์์ ์ ํจ๊ป ์์ธํ ์์๋ณด์ธ์.
- ๋จ์ด: 1,630๊ฐ19๋ถ
[๐ค] ํ์ ์คํฌ๋ฆฝํธ ์ ๋ค๋ฆญ ์ฌํ: ์ค์ฉ์ ์ธ ํจํด๊ณผ ํํ ์คํด๋ค
ํ์ ์คํฌ๋ฆฝํธ ์ ๋ค๋ฆญ(Generics)์ ๊น์ด ์ดํดํ๊ณ , ์ค๋ฌด์์ ์์ฃผ ์ฌ์ฉ๋๋ ์ ๋ค๋ฆญ ํจํด๊ณผ ํํ ๊ฒช๋ ์คํด๋ค์ ์ค์ ์ฝ๋ ์์์ ํจ๊ป ์ฝ๊ณ ๋ช ํํ๊ฒ ์ค๋ช ํด ๋๋ ค์. ํ์ ์์ ์ฑ๊ณผ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
๋จ์ด: 1,860๊ฐ18๋ถ[๐ค] Next.js Route Handler: App Router์์ ์์ ํ๊ณ ํจ์จ์ ์ธ API ๊ตฌ์ถํ๊ธฐ (์ธ์ฆ, ์๋ฌ ์ฒ๋ฆฌ ํฌํจ)
Next.js App Router์ Route Handler๋ฅผ ์ฌ์ฉํ์ฌ API ์๋ํฌ์ธํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์์๋ด์. ์ธ์ฆ, ์๋ฌ ์ฒ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ์บ์ฑ ์ ๋ต์ ํฌํจํ ์ค์ฉ์ ์ธ ํ์ผ๋ก ์์ ํ๊ณ ํจ์จ์ ์ธ ์๋ฒ๋ฆฌ์ค ํจ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ตํ๋ด์.
- ๋จ์ด: 1,934๊ฐ22๋ถ
[๐ค] Next.js Image ์ปดํฌ๋ํธ ์ต์ ํ: Core Web Vitals ๊ฐ์ ๋ถํฐ ์ค์ ํ์ฉ๊น์ง
Next.js์ Image ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ์ฌ ์น ์ฑ๋ฅ ํต์ฌ ์งํ์ธ Core Web Vitals๋ฅผ ๊ฐ์ ํ๊ณ , ๋ค์ํ ์ต์ ํ ์ต์ ์ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ธ๋ฃจ๊ฐ ์์ธํ ์๋ ค๋๋ ค์.
- ๋จ์ด: 2,187๊ฐ25๋ถ
[๐ค] Next.js 14.1+์ ํ์ : Partial Prerendering (PPR) ์๋ฒฝ ๊ฐ์ด๋์ ์ค์ ์ต์ ํ ์ ๋ต
Next.js 14.1๋ถํฐ ๋์ ๋ Partial Prerendering (PPR)์ ํตํด ์ด๊ธฐ ๋ก๋ฉ ์๋๋ฅผ ๊ทน๋ํํ๊ณ ๋์ ์ฝํ ์ธ ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ ์๊ฒ ๋ค๋ฃจ์ด์. PPR์ ๋์ ์๋ฆฌ๋ถํฐ ์ค์ ํ๋ก์ ํธ ์ ์ฉ ์ ๋ต๊น์ง, ๊ฐ๋ฐ์๋ค์ด ๊ถ๊ธํดํ๋ ๋ชจ๋ ๊ฒ์ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,792๊ฐ19๋ถ
[๐ค] TypeScript ์กฐ๊ฑด๋ถ ํ์ ๊ณผ infer ํค์๋: ๋ณต์กํ ํ์ ๋ ์์ฝ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
TypeScript ๊ฐ๋ฐ์์ ๋ง์ฃผํ๋ ๋ณต์กํ ํ์ ์ถ๋ก ๋ฌธ์ , ์กฐ๊ฑด๋ถ ํ์ ๊ณผ infer ํค์๋๋ฅผ ํ์ฉํ๋ฉด ํจ์ฌ ์ฐ์ํ๊ณ ๊ฐ๋ ฅํ๊ฒ ํด๊ฒฐํ ์ ์์ด์. ์ค์ ์์ ์ ํจ๊ป ๊ทธ ํ์ฉ๋ฒ์ ์ฌ๋ ์๊ฒ ๋ค๋ค๋ด ๋๋ค.
- ๋จ์ด: 1,705๊ฐ21๋ถ
[๐ค] JavaScript ์ด๋ฒคํธ ๋ฃจํ(Event Loop) ์์ ์ ๋ณต: ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ฐํ์ ๋์ ์๋ฆฌ
JavaScript์ ํต์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ธ ์ด๋ฒคํธ ๋ฃจํ์ ๋์ ์๋ฆฌ๋ฅผ ์ฌ๋ ์๊ฒ ํํค์ณ ๋ด์. ์ฝ ์คํ, ํ์คํฌ ํ, ๋ง์ดํฌ๋กํ์คํฌ ํ์์ ์ํธ์์ฉ์ ์ดํดํ๊ณ , ์ค๋ฌด์์ ๋ง์ฃผ์น๋ ๋น๋๊ธฐ ์ฝ๋์ ๋์์ ๋ช ํํ ์์ธกํ๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ ค์.
- ๋จ์ด: 1,964๊ฐ23๋ถ
[๐ค] Next.js Server & Client Components, ์ค์ ์์ ํ๋ช ํ๊ฒ ์ ํํ๋ ๊ฐ์ด๋
Next.js App Router์์ Server Components์ Client Components ์ค ์ด๋ค ๊ฒ์ ์ฌ์ฉํด์ผ ํ ์ง ๊ณ ๋ฏผ์ด์ ๊ฐ์? ์ด ๊ธ์์ ๋ ์ปดํฌ๋ํธ์ ํต์ฌ ์ฐจ์ด์ , ์ฌ์ฉ ์์ , ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์ค์ ์ ๋ต์ ๋ธ๋ฃจ๊ฐ ์๋ ค๋๋ฆด๊ฒ์.
- ๋จ์ด: 1,879๊ฐ21๋ถ
[๐ค] TypeScript satisfies ์ฐ์ฐ์: ํ์ ์ถ๋ก ๊ณผ ์์ ์ฑ์ ๋์์ ์ก๋ ๋น๋ฒ
TypeScript์ `satisfies` ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ํ์ ์ถ๋ก ์ ์ ์ฐ์ฑ์ ์ ์งํ๋ฉด์๋ ์๊ฒฉํ ํ์ ์์ ์ฑ์ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ค์ฉ์ ์ธ ์์๋ฅผ ํตํด ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ๋ ธํ์ฐ๋ฅผ ๊ณต์ ํฉ๋๋ค.
- ๋จ์ด: 1,211๊ฐ15๋ถ
[๐ค] React 19 ์๋ก์ด ๊ธฐ๋ฅ: use ํ , Actions, ๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ๋ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
React 19์ ํต์ฌ ๋ณ๊ฒฝ ์ฌํญ์ธ use ํ , ์๋ฒ ์ก์ , ๊ทธ๋ฆฌ๊ณ React ์ปดํ์ผ๋ฌ์ ๋์ ๋ฐฐ๊ฒฝ๊ณผ ์ค์ ํ์ฉ ์์๋ฅผ ์ด์ค๊ธ ๊ฐ๋ฐ์ ๋๋์ด์ ๋ง์ถฐ ์์ธํ ์ค๋ช ํฉ๋๋ค. ์ต์ React ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ๊ณผ ๊ฐ๋ฐ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
- ๋จ์ด: 1,524๊ฐ16๋ถ
[๐ค] Next.js App Router ์บ์ฑ ์ ๋ต: ๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ (revalidatePath, revalidateTag) ์๋ฒฝ ๊ฐ์ด๋
Next.js 14 App Router์์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์บ์ฑ ์ ๋ต๊ณผ revalidatePath, revalidateTag๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ ๋ฐฉ๋ฒ์ ์ค๋ฌด ์์์ ํจ๊ป ์์ธํ ์์๋ณด๊ณ ์น ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.