๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป
article thumbnail
[Next.js] vanilla-extract๋กœ ๋‹คํฌ๋ชจ๋“œ(dark mode) ๊ตฌํ˜„ํ•˜๊ธฐ (feat.next-themes)

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ Next.js 14๋ฒ„์ „ app router ํ”„๋กœ์ ํŠธ์˜ styled-comoponents์—์„œ vanilla-extarct๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•จ์— ์žˆ์–ด์„œ ๋‹คํฌ๋ชจ๋“œ ๊ธฐ๋Šฅ๋„ ๊ฐ™์ด ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ next-themes๋ฅผ ํ™œ์šฉํ•ด ๋ดค๋Š” ๋ฐ ์‚ฌ์šฉ ๊ฒฝํ—˜์ด ๋งค์šฐ ์ข‹์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, app router์—์„œ vanilla-extract๋กœ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ๊ตฌํ˜„ํ•จ์— ์žˆ์–ด์„œ ์ฐธ๊ณ ์ž๋ฃŒ๊ฐ€ ๋งŽ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธ€์„ ์ž‘์„ฑํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ Next.js app router์—์„œ vanilla-extract + next-themes๋ฅผ ํ™œ์šฉํ•œ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ํ•œ๋ฒˆ ๊ตฌํ˜„ํ•ด ๋ด…์‹œ๋‹ค. ๐Ÿง next-themes ์†Œ๊ฐœ https://github.com/pacocoursey/next-them..

article thumbnail
[Next.js] styled-components์—์„œ vanilla-extract๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ง„ํ–‰ (app router)

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์—์„œ Next.js 14๋ฒ„์ „์˜ ์•ฑ ๋ผ์šฐํ„ฐ์—์„œ styled-components๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— Next.js 11๋ฒ„์ „์—์„œ 14๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋‚จ์•„์žˆ๋˜ ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ๋ผ์šฐํ„ฐ์—์„œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํ™œ์šฉ ํ•ด๋ณด๊ณ ์ž ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๋จผ์ € ์™œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ–ˆ๊ณ , ์™œ vanilla-extract๋ฅผ ์„ ํƒํ–ˆ๋Š”์ง€ ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•ด ๋ณผ๊ฒŒ์š”. ๐Ÿ” ์•ฑ ๋ผ์šฐํ„ฐ(app router)์—์„œ styled-components์˜ ๋ฌธ์ œ์  styled-components๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, styled-components๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด 'use client'๋ฅผ ๋ช…์‹œํ•จ์œผ๋กœ์จ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ•์ œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด..

article thumbnail
[Next.js] Turbopack์—์„œ SVG ๊ด€๋ จ Element type is invalid: expected a string ์—๋Ÿฌ ํ•ด๊ฒฐ

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ Next.js 13 ๋ฒ„์ „ ์ดํ›„์—๋Š” Rust ์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋œ Turbopack์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Next 14 ๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•˜๊ณ  Turbopack์œผ๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋งž์ดํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ ๋ฐœ์ƒ โ— Turbopack์œผ๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์‹คํ–‰ํ•˜์ž ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๊ฒ€์ƒ‰ํ•ด ๋ณด๋‹ˆ "์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„์ด ์ž˜๋ชป๋˜์—ˆ๊ฑฐ๋‚˜, import ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป ์ž…๋ ฅ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค"๋Š” ์„ค๋ช…์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ import ๋œ ๋ถ€๋ถ„์„ ์ž˜ ํ™•์ธํ•ด ๋ณด๋ผ๋Š” ์กฐ์–ธ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ œ ์ฝ”๋“œ์—์„œ๋Š” import๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •ํ•  ๋ถ€๋ถ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด ๋ณธ ๊ฒฐ๊ณผ 'DarkModeBtn' ์ปดํฌ๋„Œ..

article thumbnail
[Next.js] v13 ์ดํ›„ app router์—์„œ ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ ๊ตฌํ˜„(feat.TypeScript)

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ ์ตœ๊ทผ Next.14 ๋ฒ„์ „ app router๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๊ณผ ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜๋ฅผ ๋งž์ดํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ ํฌ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ํฌ์ŠคํŒ…์—์„œ 1๋ฒˆ ~ 1-3๋ฒˆ๊นŒ์ง€๋Š” ๋ฐฉ๋ฒ•์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์„œ ํ”Œ๋žซํผ ๋“ฑ๋ก๊นŒ์ง€ ํ•˜๊ณ  ์ฝ์–ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. app router์—์„œ๋Š” _document.tsx์™€ _app.tsx๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ์ด์ „์— ํ•ด๋‹น ํŒŒ์ผ์—์„œ ์ž‘์„ฑ๋˜์—ˆ๋˜ ์ฝ”๋“œ๋Š” layout.tsx์—์„œ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ ์นด์นด์˜ค ๋””๋ฒจ๋กœํผ์—์„œ ํ”Œ๋žซํผ ๋“ฑ๋ก์„ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด ์ด์ œ ํ”„๋กœ์ ํŠธ๋กœ ๋Œ์•„์™€์„œ ์ ์šฉ์„ ํ•ด๋ด…์‹œ๋‹ค. ๋จผ์ € KakaoScript.tsx ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์œ„์น˜๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์ƒ์„ฑํ•˜์‹œ๋ฉด ๋ฉ..

article thumbnail
[Next.js] ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ 11์—์„œ 14๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •

๐Ÿ“–๋“ค์–ด๊ฐ€๋ฉฐ ์•ฝ 2๋…„ ์ „ Next.js(SSG) + TypeScript๋กœ ์ œ์ž‘ํ•œ ๋กค MBTI ํ”„๋กœ์ ํŠธ๋ฅผ 14 ๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•œ ๊ณผ์ • ๋ฐ ํ›„๊ธฐ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ ค ํ•œ๋‹ค. ํ•ด๋‹น ๊ธ€์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š” ๊ฐ€์— ๋Œ€ํ•œ ๊ธ€์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ œ๋ชฉ ๊ทธ๋Œ€๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•˜๋Š” ๊ณผ์ •์„ ๊ธฐ๋กํ•˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์™œ ํ•ด์•ผ ํ–ˆ๋Š”๊ฐ€? ์‚ฌ์‹ค ์„œ๋น„์Šค ์ž์ฒด๋กœ๋Š” ๋ฌธ์ œ์—†์ด ์ž˜ ๋Œ์•„๊ฐ€๊ณ  ์žˆ์—ˆ๋‹ค. ๋Œ€์‹ ์— Next.js๋กœ ์ง์ ‘ A - Z๊นŒ์ง€ ํ•ด๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ๋กค MBTI ํ”„๋กœ์ ํŠธ๋ฐ–์— ์—†์—ˆ๋‹ค. Next.js๊ฐ€ 11๋ฒ„์ „์— ๋น„ํ•ด 14 ๋ฒ„์ „๊นŒ์ง€(ํŠนํžˆ 13 ๋ฒ„์ „์—์„œ) ๋งŽ์€ ๋ถ€๋ถ„์ด ๋ณ€๊ฒฝ์ด ๋˜๊ณ , ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ง์ ‘ ๋ถ€๋”ชํžˆ๋ฉฐ ๊นจ๋‹ฌ์œผ๋ฉฐ ํ•™์Šตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง€์‹์„ ํก์ˆ˜ํ•˜๋Š” ๋‚˜์˜ ์„ฑํ–ฅ์ธ ์ด์œ ์™€ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋ฉด์„œ ๊ธฐ์กด ์ฝ”๋“œ์™€๋Š” ..

article thumbnail
[Next.js] ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (feat. TS)

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ ์ด ํฌ์ŠคํŒ…์€ Next.js 11 ๋ฒ„์ „(page router) ํ™˜๊ฒฝ์—์„œ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. 13๋ฒ„์ „ ์ดํ›„ app router ํ™˜๊ฒฝ์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด ํฌ์ŠคํŒ…์—์„œ 1 ~ 1-3๊นŒ์ง€๋งŒ ๋ณด์‹œ๊ณ  ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. Next.js + Typescript ํ™˜๊ฒฝ์—์„œ ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ์ค‘ ์นด์นด์˜คํ†ก์œผ๋กœ ๊ณต์œ ํ•˜๊ธฐ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ด์„œ ๊ตฌํ˜„์„ ํ–ˆ์—ˆ๋Š”๋ฐ, ๋ช‡๋ช‡ ์˜ค๋ฅ˜๋„ ๋งˆ์ฃผ์น˜๊ณ  ๋”ฐ๋กœ ์ •๋ฆฌ๋ฅผ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋กํ•˜๊ธฐ ์ผ๋‹จ ์ฒซ ๋ฒˆ์งธ๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ์— ์•ž์„œ์„œ Kakao Developers์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. 1-1 ๋กœ๊ทธ์ธ ์‚ฌ์ดํŠธ์— ์ ‘์† ํ•ด์ฃผ์‹œ๊ณ  ์ฒซ ํ™”๋ฉด์—์„œ ๋กœ๊ทธ์ธ์„ ํ•ด์ฃผ์‹œ๊ณ  '๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜'์„ ํด๋ฆญํ•ด์ฃผ์„ธ์š”. 1-2 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถ”๊ฐ€ํ•˜๊ธฐ ๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์• ..