๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ „์ฒด ๊ธ€

(72)
[spotify-api] VINYLIFY : ์Šคํฌํ‹ฐํŒŒ์ด apiํ™œ์šฉํ•œ ๊ฒ€์ƒ‰ + ์žฌ์ƒ ํ”„๋กœ์ ํŠธ(n)๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ react-infinite-scroll๊ณผ useInfiniteQuery๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ํ•˜๊ธฐ ๐Ÿ˜… ๋“œ๋””์–ด 2๋‹ฌ(?) ์ •๋„ ๊ธด ๊ธฐ๊ฐ„ ๋™์•ˆ ์ง„ํ–‰ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„์งœ ๋์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋А๋‚Œ! ๐Ÿฅณ ์ •๋ฆฌํ•ด์„œ ํ•œ๋ฒˆ์— ์˜ฌ๋ฆฌ๋ ค๋‹ค๊ฐ€ ์ถ•ํ•˜ ๊ธฐ๋…(?)์œผ๋กœ ์˜ค๋Š˜ ๋”ฐ๋ˆํ•˜๊ฒŒ ๋๋‚ธ react-infinite-scroll+ useInfiniteQuery๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„์— ๋Œ€ํ•ด ๊ธฐ๋กํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.โš ๏ธ ํ”„๋กœ์ ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค ๋ฒ„์ ผ- "@tanstack/react-query": "^5.37.1"- "react": "^18.2.0",- "react-infinite-scroll-component": "^6.1.0"๐Ÿ‘‰ ๊นƒํ—ˆ๋ธŒ์—์„œ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ ๊ตฌ๊ฒฝํ•˜๋Ÿฌ ๊ฐ€๊ธฐ์ฒซ ์‹œ๋„์›๋ž˜๋Š” ์ข€ ๋ณต์žกํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„์„ ํ–ˆ์—ˆ๋‹ค."react-intersection-observer" ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด ๋ฆฌ์ŠคํŠธ ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ์— ref๋ฅผ ์ง€์ •ํ•˜๊ณ ,์ด ref๊ฐ€ ๋ทฐํฌํŠธ์—..
๋””์ž์ธ ์‹œ์Šคํ…œ 101 : ๋””์ž์ธ ์‹œ์Šคํ…œ์ด๋ž€? ๐Ÿค” ๋ชจ๋…ธ๋ ˆํฌ ํ”„๋กœ์ ํŠธ ์„ธํŒ…์„ ํ•˜๋ฉด์„œ ๊ณ ๋ฏผํ•ด๋ด์•ผ ํ•  ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ธ ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌ์ถ•ํ•˜๊ธฐ!๋ณธ๊ฒฉ์ ์œผ๋กœ ๋„์ž…ํ•˜๊ธฐ ์ „์— "๋””์ž์ธ ์‹œ์Šคํ…œ์ด ๋ญ”์ง€, ์™œ ํ•„์š”ํ•œ ์ง€, ๋„์ž…์ด ํ•„์š”ํ•œ ์ง€"์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ž.๋””์ž์ธ ์‹œ์Šคํ…œ์ด๋ž€At its core, a design system is a set of building blocks and standards that help keep the look and feel of products and experiences consistent.  ๋””์ž์ธ ์‹œ์Šคํ…œ์ด๋ž€ ํ”„๋กœ๋•ํŠธ๊ณผ ๊ฒฝํ—˜์ด ์ฃผ๋Š” ๋ชจ์Šต๊ณผ ๋А๋‚Œ์ด ์ผ์ •ํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ์ค€๊ณผ ๊ธฐ๋ณธ ์œ ๋‹›์˜ ๋ชจ์Œ์ด๋‹ค.๋ณต์žกํ•œ ๋””์ง€ํ„ธ ํ”„๋กœ๋•ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ํŒ€์„ ์œ„ํ•ด ํ†ต์ผ๋œ ์–ธ์–ด์™€ ๊ตฌ์กฐํ™”๋œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฒญ์‚ฌ์ง„ ์—ญํ• ์„ ํ•œ๋‹ค. ์•„์ด์ฝ˜๊ณผ ์ƒ‰๊น”์€ ์œ ์ €์—๊ฒŒ ํŠน์ •ํ•œ..
[turboRepo scss] Cannot find module './mybutton.module.scss' or its corresponding type declarations.ts(2307) ๐Ÿ•ต๏ธ ์ด์Šˆscss๋กœ ๋ฒ„ํŠผ ๋งŒ๋“ค์–ด๋ณด๊ธฐ ์ค‘..๋‹ค์Œ๊ณผ ๊ฐ™์€ ts ๊ฒฝ๊ณ ๊ฐ€ ๋–ด๋‹ค. ๋ฌธ์ œ๋Š” ts์™€ tsx ํ™•์žฅ์ž๋กœ ๋๋‚ด์•ผ๋งŒ ๋ชจ๋“ˆ๋กœ ์ธ์‹ํ•ด์„œ scss ํ™•์žฅ์ž์˜ ํŒŒ์ผ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ ๊ฑฐ์˜€๋‹ค. ๐Ÿ“ ํ•ด๊ฒฐ1. tsconfig.ts ์™€ ๊ฐ™์€ ์ตœ์ƒ๋‹จ ๊ฒฝ๋กœ์— typings ํด๋”๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ž.2. typings/ ํด๋” ๋‚ด์— declarations.d.ts ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๋‹ค์Œ์˜ ์ฝ”๋“œ ์ž‘์„ฑ.declare module "*.scss" { const content: Record; export default content;} 3. tsconfig.ts ์— typings ํด๋” ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ{ "extends": "@repo/typescript-config/react-library.json", "compilerOptions": { ..
โš›๏ธ ๊ฐ€์ƒ๋”๊ณผ ๋ฆฌ์•กํŠธ ํŒŒ์ด๋ฒ„ ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ์˜ค๋Š˜ ๋‹ค๋ฃฐ ๋‚ด์šฉ- ๊ฐ€์ƒ๋”์ด๋ž€? (feat.  DOM์ด๋ž€? ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •)- ๊ฐ€์ƒ๋” ๋งŒ๋“œ๋Š” ๊ณผ์ • (feat. react fiber, ํŒŒ์ด๋ฒ„ ํŠธ๋ฆฌ์™€ ๋”๋ธ” ๋ฒ„ํผ๋ง)- ๋ฆฌ์•กํŠธ ํŒŒ์ด๋ฒ„์˜ ์ฃผ์š”ํ•œ ์†์„ฑ๋“คDOM ์ด๋ž€? ๊ฐ€์ƒ๋”(virtual DOM)์ด ๋ญ˜๊นŒ? virtual + DOM์ด๋ผ๋Š” ๊ฒƒ์ธ๋ฐ, DOM์ด ๋ญ”์ง€ ์•Œ๋ฉด ์™€๋‹ฟ์„ ๊ฒƒ ๊ฐ™๋‹ค.DOM์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์˜ ๋‚ด์šฉ์„ ๊ทธ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํŠธ๋ฆฌ ๋ชจ์–‘์œผ๋กœ ๊ตฌ์„ฑํ•ด ๋†“์€ ๊ฒƒ์ด๋‹ค.DOM์ƒ์„ฑ ๊ณผ์ •์—๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •์— ํฌํ•จ๋˜๋Š”๋ฐ, ์ด ๊ณผ์ •๋„ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด์ž.DOM์€ ์›นํŽ˜์ด์ง€์˜ ์ฝ˜ํ…์ธ ์™€ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์›นํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 0. ๋ธŒ๋ผ์šฐ์ €๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ฃผ์†Œ๋ฅผ ๋ฐฉ๋ฌธํ•ด H..
ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ( ft. ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์˜ ๊ณผ๊ฑฐ, ํ† ์Šค์˜ ์„ ํƒ, ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜) ๐Ÿค” turborepo๋กœ ๋ชจ๋…ธ๋ ˆํฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ์„ค์น˜๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋“ค ์ค‘ ์–ด๋–ค ๊ฑธ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜? ์ด๋“ค์˜ ์ฐจ์ด์™€ ์„ ํƒ ๊ธฐ์ค€์€ ๋ญ˜๊นŒ?๐Ÿ€ ๋•Œ๋งˆ์นจ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์— ๋Œ€ํ•ด ํ•œ๋ฒˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€ ๋ณด๋ ค๋‹ค๊ฐ€ ํ† ์Šค์— ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์˜ ๊ณผ๊ฑฐ, ํ† ์Šค์˜ ์„ ํƒ, ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜๋ž€ ์ข‹์€ ๊ธ€์ด ์˜ฌ๋ผ์™€์„œ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ์‚ดํŽด๋ณผ ๋‚ด์šฉ- ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ ๋ฌด์—‡์ธ์ง€- ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ ๋™์ž‘ํ•˜๋Š” 3๊ฐ€์ง€ ๋‹จ๊ณ„- npm vs pnpm vs Yarn PnP- ํ† ์Šค์˜ Pick ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ž€?๋ชจ๋“ˆ์‹œ์Šคํ…œ (ESM & CJS)์— ๋Œ€ํ•ด์„œ ๋‹ค๋ค˜๋“ฏ์ด JS/TS์—์„œ๋Š” require ํ˜น์€ import๋กœ ์™ธ๋ถ€์˜ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.์—ฌ๊ธฐ์„œ ์™ธ๋ถ€์˜ ๋ชจ๋“ˆ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฐธ์กฐํ•˜๋„๋ก ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋ฐ”๋กœ๋ฐ”๋กœ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋‹ค...
ํ† ์Šคใ…ฃSLASH 23 - ํผ๋„ : ์Ÿ์•„์ง€๋Š” ํŽ˜์ด์ง€ ํ•œ ๋ฐฉ์— ๊ด€๋ฆฌํ•˜๊ธฐ (TOSH | SLASH 23 - Funnel Pattern : Organizing an overflow of pages at once) โš ๏ธ ์ €์ž‘๊ถŒ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด ์ž๋ฃŒ ๋ฐ ์˜ˆ์‹œ๊ฐ€ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” Reactโš›๏ธ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.๐Ÿซจ ํ†ต์‹ ์‚ฌ ๊ฐ€์ž…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธด ํผ๊ณผ ์•ฝ์ •์ด ํฌํ•จ๋œ ํŽ˜์ด์ง€๋ฅผ ๋งˆ์ฃผ์น˜๊ฒŒ ๋  ๋•Œ๊ฐ€ ์žˆ๋‹ค.์ด๋ ‡๊ฒŒ ๋งŽ์€ ํŽ˜์ด์ง€๋“ค์„ ๋„˜๋‚˜๋“œ๋Š” ํ๋ฆ„์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ญ˜๊นŒ?์ด๋ฒˆ๊ธ€์—์„œ๋Š” ํ† ์Šค SLASH23์—์„œ ๋‹ค๋ฃฌ ํผ๋„์„ ํ†ตํ•œ ๋ถ„๊ธฐ์™€ ์ƒํƒœ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ž.์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ๋Œ€ํ‘œ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ํŒจํ„ด๋“ค1. ์ƒ์  ๋ชฉ๋ก ํŽ˜์ด์ง€ -> ์ƒ์„ธ ํŽ˜์ด์ง€ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๋ธ”๋กœ๊ทธ๋‚˜ ๋‰ด์Šค, To-do ๋ฆฌ์ŠคํŠธ๋„ ์ด ์œ ํ˜•์— ํ•ด๋‹น๋œ๋‹ค. 2. ๋‹จ์ผ ํŽ˜์ด์ง€ ํŽ˜์ด์ง€ ์ด๋™ ์—†์ด ํ•œ ํ™”๋ฉด ๋‚ด์—์„œ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ง€๋„๋‚˜ ๋ฉ”์‹ ์ € ์•ฑ์ด ์ด ์œ ํ˜•์— ํ•ด๋‹น๋œ๋‹ค. 3. ์„ค๋ฌธ์กฐ์‚ฌ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋“ค์„ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์ˆ˜์ง‘ -> ๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋กœ ์ด๋ฃจ..
๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๐Ÿ—ฃ๏ธ import๊ณผ require์˜ ์ฐจ์ด๋ฅผ ์•Œ๊ณ  ๊ณ„์‹œ๋‚˜์š”?  ๐Ÿค” ๋…ธ๋“œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” require ๋งŽ์ด ๋ณธ ๊ฑฐ ๊ฐ™๊ณ , react์—์„œ  import ๋งŽ์ด ์ผ๋˜ ๊ฑฐ ๊ฐ™์€๋ฐ? import๊ณผ require์— ๋Œ€ํ•ด ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค.์˜ค๋Š˜์€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ๋ฌด์—‡์ด๊ณ , ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ํŠน์ง•๊ณผ ์žฅ๋‹จ์ ์„ ์‚ดํŽด๋ณด์ž.JS ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด๋ž€?์˜ˆ์ „ ์›น์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ด๋‹นํ•˜๊ณ  ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์€ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ ์ •๋„์˜€๋‹ค.ํ•˜์ง€๋งŒ ์ ์ฐจ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์—ญํ• ์ด ๊ฑฐ๋Œ€ํ•ด์ง€๊ณ , ๊ธฐ๋Šฅ๋“ค์„ ๋งŒ๋“ค๋ฉด์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฉฐ dependency๋ฉฐ ๊ด€๋ฆฌํ•  ๊ฒƒ๋„ ๋น„๋ก€(์ •๋น„๋ก€๋Š” ์•„๋‹ ์ˆ˜๋„?)ํ•ด์„œ ๋ฐฉ๋Œ€ํ•ด์กŒ๋‹ค.๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ ์ด๋ ‡๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด ์Šค์ฝ”ํ”„ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ์•ˆ์œผ๋กœ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.J..
โš›๏ธ Error boundary ๐Ÿ˜ฑ ์•ฑ ๊ฐœ๋ฐœ ๋„์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋จธ๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ์ €์—๊ฒŒ ๋ณด์—ฌ์ค„ ํ™”๋ฉด๋„ ์ƒˆํ•˜์–—๊ฒŒ ๋ณ€ํ•  ๊ฑฐ ๊ฐ™๋‹ค.๐Ÿค” ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ์„๊นŒ?๋ฆฌ์•กํŠธ์˜ Error boundary (legacy)๊ฐœ๋ฐœ ๋ฌธ์„œ์— ์˜ํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฆฌ์•กํŠธ๋Š” ๋ Œ๋”๋ง ๋„์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด UI๋ฅผ ํ™”๋ฉด์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น UI๋ฅผ Error boundary๋กœ ๊ฐ์‹ธ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, Error boundary๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚˜์„œ ์ œ๊ฑฐ๋œ UI๋Œ€์‹ ์— ํ™”๋ฉด์— fallback UI๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŠน์ˆ˜ํ•œ ์ปดํฌ๋„ŒํŠธ๋‹ค. Error boundary๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” static getDerivedStateFromError๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.static getDerivedStateFromError๋ฅผ ์ œ๊ณตํ•ด์•ผ ์—๋Ÿฌ..