Project๐Ÿ› ๏ธโš™๏ธ 6

Next js Vanilla Extract CSS ์„ค์น˜ํ•˜๊ธฐ (next.js 14)

zero-runtime css-in-ts์ธ vanilla-extract๋Š” ๋Ÿฐํƒ€์ž„์— ์‹คํ–‰๋˜๋Š” css-in-js ๋ฐฉ์‹( styled-components, emotion )๊ณผ ๋‹ฌ๋ฆฌ ๋นŒ๋“œํƒ€์ž„์— ์‹คํ–‰๋˜์–ด Next.js์˜ SSR์—์„œ Hydration์„ ๊ฑฐ์น˜๊ธฐ ์ „์—๋„ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.TailwindCSS ์—ญ์‹œ ๋นŒ๋“œ ํƒ€์ž„์— ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€ ์•Š์•„ ์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ํ”„๋กœ์ ํŠธ์— vanilla-extract๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. 1. vanilla-extract ์„ค์น˜// npm npm install @vanilla-extract/cssnpm install --save-dev @vanilla-extract/next-plugin// pnpmpnpm add @vanilla-extract/..

ํ”„๋ก ํŠธ์—”๋“œ JWT ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ํƒ€์ด๋จธ ๊ตฌํ˜„ (React JS + React Query)

ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๊ฒฝ์šฐ, ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ์ค‘ ์•„๋ž˜์™€ ๊ฐ™์ด reissue api๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ์˜ค๋ฅ˜ ์ƒํ™ฉ์„ ๋งˆ์ฃผํ•˜์˜€๋‹ค.   ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๊ธฐ์กด ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.1. axios์˜ interceptors๋ฅผ ํ†ตํ•˜์—ฌ ํ† ํฐ ๋งŒ๋ฃŒ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค.2. accessToken์„ ํ—ค๋”์—, refreshToken์„ body์— ๋„ฃ์–ด reissue api๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.    a. ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ๊ฒฝ์šฐ, ์žฌ๋ฐœ๊ธ‰๋œ ํ† ํฐ์„ localStorage์— ์ €์žฅํ•œ๋‹ค.    b. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•˜๋ผ๋Š” ๋ชจ๋‹ฌ์„ ํ‘œ์‹œํ•˜๋ฉฐ, ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ํ•œ๋‹ค.   ๋ฌธ์ œ์›์ธ ํŒŒ์•…๋„คํŠธ์›Œํฌ ํƒญ์— ๋“ค์–ด๊ฐ€ ์š”์ฒญ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ดค๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ ํ† ํฐ์ด ํ•„์š”ํ•œ API์ธ user/ticket ์š”์ฒญ์—์„œ ์—๋Ÿฌ๊ฐ€..

SW ์บก์Šคํ†ค ํ”„๋กœ์ ํŠธ <๋‹จํ†ต> ํ”„๋ก ํŠธ์—”๋“œ ํšŒ๊ณ 

์•ˆ๋…•ํ•˜์„ธ์š”.์ด๋ฒˆ์— ์†Œํ”„ํŠธ์›จ์–ดํ•™๊ณผ 4-1ํ•™๊ธฐ ์บก์Šคํ†ค ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์น˜๋ฉฐ ํšŒ๊ณ ๋ก์„ ๋‚จ๊ธฐ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.์ด ๊ธ€์„ ํ†ตํ•˜์—ฌ ๋ฟŒ๋“ฏํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ ์•„์‰ฌ์› ๋˜ ํ”„๋กœ์ ํŠธ๋ฅผ ํšŒ๊ณ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์†Œ๊ฐœ๋‹จํ†ต์€ ํ•™์šฐ๋“ค์˜ ํ•™์ƒํšŒ ํ–‰์‚ฌ ์ฐธ์—ฌ๋ฅผ ์ฆ์ง„ํ•˜๊ณ , ํ•™์ƒํšŒ์˜ ํผ ๊ฐ€๊ณต ์—…๋ฌด๋ฅผ ๊ฐ„ํŽธํ™”ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.ํ•™์ƒํšŒ๋Š” ๋‹จํ†ต์„ ํ†ตํ•˜์—ฌ ํ•™์ƒํšŒ ํ–‰์‚ฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ™๋ณดํ•˜๊ณ , ํ•™์šฐ๋Š” ํ–‰์‚ฌ ์ฐธ์—ฌ ์ •๋ณด, ์ง„ํ–‰ ์ƒํ™ฉ, ํ–‰์‚ฌ ์ผ์ • ๋“ฑ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋‹จํ†ต์€ ํ•™์šฐ๋“ค์ด ํ–‰์‚ฌ ํผ์„ ์ œ์ถœํ•  ๋•Œ ๋ฒˆ๊ฑฐ๋กœ์› ๋˜ ์žฌํ•™ ์ธ์ฆ ์ •๋ณด (๋‹จ๊ตญ๋Œ€ํ•™๊ต ์›น์ •๋ณด ํ™”๋ฉด ์บก์ณ, ์ „๊ณต๊ณผ ํ•™๋ฒˆ ์ž…๋ ฅ ๋“ฑ) ๊ธฐ์ž… ์ ˆ์ฐจ๋ฅผ ํšŒ์›๊ฐ€์ž…์‹œ ๋‹จ ํ•œ ๋ฒˆ์˜ ํ•™๊ต ์ด๋ฉ”์ผ ์ธ์ฆ์œผ๋กœ ๋Œ€์ฒดํ•˜๊ณ , ํผ ์‘๋‹ต ๋ฆฌ์ŠคํŠธ๋ฅผ ์—‘์…€๋กœ ์ถ”์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•˜์—ฌ ํ•™์ƒํšŒ์˜ ์—…๋ฌด ์ ˆ์ฐจ๋ฅผ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค!์ด ํ”„๋กœ์ ํŠธ๋Š” ํ•™์ƒํšŒ์˜ ๋„์›€..

[React/TypeScript] Input์˜ event.target.value์„ string์ด ์•„๋‹Œ ํŠน์ • ํƒ€์ž…์œผ๋กœ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”. ์บก์Šคํ†ค ํ”„๋กœ์ ํŠธ ์ค‘ ๊ฒฝํ—˜ํ•œ Trouble Shooting์„ ๊ณต์œ ํ•ด๋ณด๊ณ ์ž ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๋‹ค๋“ค ๊ตฌ๊ธ€ ํผ, ๋„ค์ด๋ฒ„ ํผ๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ๋งŽ์ด ์ด์šฉํ•ด๋ณด์…จ์„๊นŒ์š”?ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์บก์Šคํ†ค ํ”„๋กœ์ ํŠธ์—์„œ ํ•™์ƒ๋“ค์—๊ฒŒ ํ–‰์‚ฌ ์ฐธ์—ฌ ์‹ ์ฒญ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ํผ (์„ค๋ฌธ) ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด, ํผ ์ƒ์„ฑ ํŽ˜์ด์ง€๋ฅผ ์ง์ ‘ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ์š”.ํผ ์ƒ์„ฑ ํŽ˜์ด์ง€์—์„œ๋Š” ๋งŽ์€ ์ด๋ฒคํŠธ๋“ค(์ถ”๊ฐ€, ์‚ญ์ œ, ์ˆ˜์ • ๋“ฑ)์ด ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ, ์ด์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ Input ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ค˜์•ผ ํ•ด์„œ ์‹ ๊ฒฝ ์“ธ ๋ถ€๋ถ„์ด ๋งŽ์€ ํŽ˜์ด์ง€๋ผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊นŒ์ง€ ์ด์šฉํ•œ๋‹ค๋ฉด Type Guard๊นŒ์ง€ ์‹ ๊ฒฝ์จ์ค˜์•ผ ํ•˜๋Š”๋ฐ์š”๐Ÿฅฒ    ํผ ์ƒ์„ฑ ํŽ˜์ด์ง€์—์„œ๋Š” useState๋กœ ๊ด€๋ฆฌ๋˜๋Š” questionList๋ฅผ ๋งตํ•‘ํ•˜์—ฌ ์งˆ๋ฌธ ๋ฐ•์Šค ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ Œ๋”๋งํ•ฉ..

[Project/ReactTS] Chart.js๋กœ ์›ํ˜• ์ฐจํŠธ(Doughnut Chart) ๊ตฌํ˜„

์•„๋ž˜์™€ ๋™์ผํ•˜๊ฒŒ ์›ํ˜• ์ฐจํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค. Setting npm install chartjs npm install --save chart.js react-chartjs-2 chartjs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•œ๋‹ค ๊ธฐ๋ณธ์ ์ธ DoughnutChart ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ ์ผ๋‹จ ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฐจํŠธ๋ฅผ ๊ทธ๋ ค๋ดค๋‹ค. ์ฐจํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” 'data' props๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค. ์ฐจํŠธ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” string ๋ฐฐ์—ด 'labels'์™€ number ๋ฐฐ์—ด 'data'์ด๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋Š” ['๊ฐ€','๋‚˜','๋‹ค','๋ผ','๋งˆ'] ์™€ [1,2,3,4,5] ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜์˜€๋‹ค. DoughnutChart.tsx import { Chart as ChartJS, ArcElement, Tooltip} from 'chart.j..

[Project/ReactTS] ์žฌ์‚ฌ์šฉ๋˜๋Š” ๊ฒŒ์‹œํŒ ๋ ˆ์ด์•„์›ƒ ๋‚ด ์ปจํ…์ธ ๋ฅผ ํŽ˜์ด์ง€๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚ด๊ธฐโš’๏ธ

๋ฆฌ๋‰ด์–ผ๋  ์ดํ•™์ƒํšŒ ์‚ฌ์ดํŠธ๋Š” ํšŒ์น™, ๊ณต์ง€, ์ฒญ์› ํŽ˜์ด์ง€ ๋“ฑ์˜ ๊ฒŒ์‹œํŒ ๊ธ€ ๋ชฉ๋ก์„ ๊ฐ™์€ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ Infinite Scrollํ•˜์—ฌ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด ํŽ˜์ด์ง€๋“ค์€ ๋ ˆ์ด์•„์›ƒ์€ ๊ฐ™์•„๋„ ๋ชฉ๋ก์„ ๊ตฌ์„ฑํ•˜๋Š” ์ปจํ…์ธ ๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.์˜ˆ์ „ ๊ฐ™์•˜์œผ๋ฉด ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด ๋ ˆ์ด์•„์›ƒ์˜ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐํ•˜์—ฌ ๋ช‡๋ช‡ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜์˜€๊ฒ ์ง€๋งŒ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Atomic Pattern์„ ๋„์ž…ํ•˜๊ธฐ๋กœ ํ•˜์—ฌ ๊ฐœ์„ ํ•ด๋ณด๊ธฐ๋กœ ํ•˜์˜€๋‹ค!๋˜ํ•œ ์ด์ „ ์ดํ•™์ƒํšŒ ์‚ฌ์ดํŠธ์—์„œ๋Š” ํŽ˜์ด์ง€๋งˆ๋‹ค ์ค‘๋ณต๋˜๋Š” ํ•จ์ˆ˜๋“ค(axios(),useState()...)์ด ๋งŽ์•„ ์ˆ˜์ •์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ํŽ˜์ด์ง€๋ณ„๋งˆ๋‹ค ๋ชจ๋‘ ๋ฐ”๊ฟ”์•ผ ํ–ˆ๋˜ ๊ฒŒ ๋ถˆํŽธํ•ด์„œ ์ด ์ ์„ ๊ผญ ๊ณ ์น˜๊ณ  ์‹ถ์—ˆ๋‹ค.๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” ๋งˆ์Œ ๋จน๊ณ  ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ธฐ์กด ๋ ˆ์ด์•„์›ƒ..