# [[Legacy Codebase Refactoring]] ## ๐Ÿ“Œ Brief Summary Legacy Codebase Refactoring(๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ„ฐ๋ง)์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋…ธํ›„ํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ๋ฅผ ๋™์ž‘ ๋ณ€ํ™” ์—†์ด ์ ์ง„์ ์œผ๋กœ ๊ฐœ์„ ํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค [1]. ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋ฉฐ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1]. React ์ƒํƒœ๊ณ„์—์„œ๋Š” ์ฃผ๋กœ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ(Hooks)๋กœ ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜, ๋…ธํ›„ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ตœ์‹  ๋„๊ตฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ฉฐ, ์ฝ”๋“œ๋ฒ ์ด์Šค์— ํ…Œ์ŠคํŠธ ๋ฐ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค [1-3]. ## ๐Ÿ“– Core Content * **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต (Incremental Migration):** ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์„ ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ์žฌ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜์„ฑ์ด ํฝ๋‹ˆ๋‹ค [1]. ๋”ฐ๋ผ์„œ "์žฌ์ž‘์„ฑํ•˜์ง€ ๋ง๊ณ  ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋ผ(refactor, do not rewrite)"๋Š” ์ฒ ํ•™์„ ๋ฐ”ํƒ•์œผ๋กœ, ๊ธฐ์กด์˜ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๊ณ„์†ํ•˜๋ฉด์„œ ์ƒํƒœ ๊ด€๋ฆฌ ์Šคํ† ์–ด๋‚˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ•˜๋‚˜์”ฉ ์ ์ง„์ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ „๋žต์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [1]. * **ํ…Œ์ŠคํŠธ ์ฃผ๋„ ์ ‘๊ทผ ๋ฐ ๋™์ž‘ ๋ณด์žฅ:** ๋ฆฌํŒฉํ„ฐ๋ง์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋‚˜ UI ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4, 5]. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ธฐ์กด ์ฝ”๋“œ์˜ ์—ญํ• ์„ ์ดํ•ดํ•˜๊ฒŒ ๋„์™€์ฃผ๋ฉฐ, ๋ฆฌํŒฉํ„ฐ๋ง ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ํŒŒ์†(regression)์„ ์ฆ‰์‹œ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค [4, 6]. * **React ํŠนํ™” ๋ฆฌํŒฉํ„ฐ๋ง ์ฒดํฌ๋ฆฌ์ŠคํŠธ:** * **์ปดํฌ๋„ŒํŠธ ๋ฐ ๋กœ์ง ์ „ํ™˜:** ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…(Hooks)์œผ๋กœ ๊ต์ฒดํ•˜๊ณ , TypeScript๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [2, 7]. * **์ƒํƒœ ๊ด€๋ฆฌ ํ˜„๋Œ€ํ™”:** ๋ถˆํ•„์š”ํ•œ `useEffect`๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋ณต์žกํ•œ ์ „์—ญ ์Šคํ† ์–ด๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ์ƒํƒœ๋Š” Tanstack Query๋กœ, ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ๋Š” Context๋‚˜ Zustand๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [2]. * **์‚ฌ์šฉ์ž ์ •์˜ ํ›… ๋‹จ์œ„์˜ ์ถ”์ถœ:** ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ํ˜ผ์žฌ๋œ ๋กœ์ง์„ ์‚ฌ์šฉ์ž ์ •์˜ ํ›…(Custom Hooks)์œผ๋กœ ๋ถ„๋ฆฌํ•ด ๋ชจ๋“ˆํ™”์™€ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [1, 8]. * **์ตœ์ ํ™” ๋„๊ตฌ ์ •๋ฆฌ:** React 19์™€ ๊ฐ™์€ ์ตœ์‹  ๋ฒ„์ „์„ ํ™œ์šฉํ•  ๊ฒฝ์šฐ, ์ฝ”๋“œ๋ฅผ ์–ด์ง€๋Ÿฝํžˆ๋Š” ๋ถˆํ•„์š”ํ•œ `useMemo`๋‚˜ `useCallback` ๋“ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9]. * **๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ„์„ ๋ฐ ์ฝ”๋“œ ํ’ˆ์งˆ ํ‘œ์ค€ํ™”:** ๋ฆฌํŒฉํ„ฐ๋ง ์ „ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ „์—ญ UI ์Šคํ† ์–ด์˜ ์—ญํ• ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ณ , ์ „์—ญ ๋ ˆ๋ฒจ์—์„œ ๋กœ์ปฌ ๋ ˆ๋ฒจ๋กœ ๋ถ„์„์„ ์ขํ˜€ ๋‚˜๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 10]. ๋”๋ถˆ์–ด CSS ์Šคํƒ€์ผ ๋ฐฉ์‹์„ ํ•œ ๊ฐ€์ง€๋กœ ํ†ต์ผํ•˜๊ณ  [11, 12], ESLint(eslint-plugin-react ๋“ฑ)๋ฅผ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ๊ฐ•์ œํ•จ์œผ๋กœ์จ ์ฝ”๋“œ ์Šค๋ฉœ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3]. ## โš–๏ธ Trade-offs & Caveats * **์ „์ฒด ์žฌ์ž‘์„ฑ(Rewrite) vs ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜:** ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋งค์šฐ ์ž‘์„ ๊ฒฝ์šฐ ์™„์ „ํžˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅด๊ณ  ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ „์ฒด ์žฌ์ž‘์„ฑ์ด ๋ง‰๋Œ€ํ•œ ์ž์›๊ณผ ์œ„ํ—˜์„ ์ˆ˜๋ฐ˜ํ•˜๋ฏ€๋กœ, ๊ธฐ๋Šฅ ๋ฐฐํฌ๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๋Š” ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์„ ํƒํ•ด์•ผ๋งŒ ํ•˜๋Š” ์ œ์•ฝ์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [1]. * **TypeScript ๋„์ž…์— ๋”ฐ๋ฅธ ์ธ์ง€์  ์˜ค๋ฒ„ํ—ค๋“œ:** ๋ฆฌํŒฉํ„ฐ๋ง ์‹œ TypeScript ๋„์ž…์€ ์žฅ๊ธฐ์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ค„์—ฌ์ฃผ์ง€๋งŒ, ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•œ ํŒ€์›์—๊ฒŒ๋Š” ์ƒˆ๋กœ์šด ๋ณต์žก์„ฑ ๋ ˆ์ด์–ด๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒํ™ฉ์— ๋งž์ถฐ ๋‹จ์ผ ํŒŒ์ผ์”ฉ ์ ์ง„์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํƒ€ํ˜‘(Trade-off)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [7]. * **์‚ฌ์ „ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์˜ ๋น„์šฉ:** ๊ธฐ์กด ์ฝ”๋“œ์˜ ํšŒ๊ท€(Regression)๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋˜์ง€๋งŒ, ์–ฝํ˜€์žˆ๋Š” ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์— ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์€ ์ดˆ๊ธฐ ๋ฆฌํŒฉํ„ฐ๋ง ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4-6]. * **๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์˜ ๋ฆฌํŒฉํ„ฐ๋ง ํ•œ๊ณ„:** ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ๊ฐ€ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ๊ธฐ์ˆ ์  ์œ ํ˜•(์ปดํฌ๋„ŒํŠธ, ํ›… ๋“ฑ) ๋‹จ์œ„์˜ ํด๋”๋กœ ๋‚˜๋‰œ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜(Layered Architecture)๋ฅผ ๋”ฐ๋ฅผ ๊ฒฝ์šฐ, ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ๋ฆฌํŒฉํ„ฐ๋งํ•  ๋•Œ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ํŒŒ์ผ์ด ํฉ์–ด์ ธ ์žˆ์–ด ์ถ”์  ๋ฐ ์ˆ˜์ •์ด ๊ทน๋„๋กœ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] * [[Feature-Sliced Design]] * ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์˜์กด์„ฑ์„ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ œํ•œํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋กœ ์žฌํŽธํ•˜๋Š” ํ˜„๋Œ€์  ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [14-16]. * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฆฌํŒฉํ„ฐ๋ง ์ค‘ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ๋ฅผ ๊ธฐ๋Šฅ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. * [[Custom Hooks]] * ์—ฐ๊ฒฐ ์ด์œ : React ๋ฆฌํŒฉํ„ฐ๋ง์˜ ํ•ต์‹ฌ ๋‹จ์œ„(Primary unit)๋กœ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ UI์™€ ๋ถ„๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [1, 17]. * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `useFetch`๋‚˜ `useForm`์ฒ˜๋Ÿผ ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ ์† ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17]. #### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] * [[TypeScript]] * ์—ฐ๊ฒฐ ์ด์œ : ๋…ธํ›„ํ™”๋œ JavaScript ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ํ˜„๋Œ€ํ™”ํ•  ๋•Œ ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ถŒ์žฅ๋˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [2, 7]. * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฆฌํŒฉํ„ฐ๋ง ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณ€ํ™”๋‚˜ Props ์ „๋‹ฌ ์˜ค๋ฅ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * [[ESLint]] * ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ„ฐ๋ง ์‹œ ํŒ€์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ์ฝ”๋“œ ์Šค๋ฉœ ๋ฐ ์•ˆํ‹ฐ ํŒจํ„ด์„ ์ž๋™์œผ๋กœ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์ •์  ๋ถ„์„ ๋ฐ ์ปจ๋ฒค์…˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [3, 18]. * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `eslint-plugin-react-hooks` ๋“ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™๊ณผ React ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์–ด๋–ป๊ฒŒ ์ž๋™ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 18]. ### Deeper Research Questions * ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ(์˜ˆ: `componentDidUpdate`, `componentDidMount`)๋ฅผ `useEffect`๋ฅผ ํฌํ•จํ•œ ํ›…(Hooks) ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋งํ•  ๋•Œ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ฒŒ ๋ถ€์ž‘์šฉ(Side-effect)์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? * ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ „๋ฌดํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์€ ๋Œ€๊ทœ๋ชจ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์—์„œ, ๊ฐ€์žฅ ๋จผ์ € ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ํšจ์œจ์ ์ธ ์ตœ์†Œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ „๋žต(์˜ˆ: UI ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ vs ๊ธฐ๋Šฅ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ)์€ ๋ฌด์—‡์ธ๊ฐ€? * Context API๋กœ ๋ฌด๊ฒ๊ฒŒ ๊ด€๋ฆฌ๋˜์–ด ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ „์—ญ ์ƒํƒœ๋ฅผ Zustand๋‚˜ TanStack Query๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์ „ํ™˜ ๊ณผ์ • ์ค‘ ์ƒํƒœ์˜ ๋™๊ธฐํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? * ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์— API ํ†ต์‹ , ์ƒํƒœ ๋ณ€๊ฒฝ, DOM ๋ Œ๋”๋ง ๋กœ์ง์ด ํ˜ผ์žฌ๋œ ์ƒํƒœ์—์„œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ค€์ˆ˜ํ•˜๋„๋ก ๋กœ์ง์„ ์ชผ๊ฐค ๋•Œ, ์˜ฌ๋ฐ”๋ฅธ ์ถ”์ƒํ™” ๊ธฐ์ค€์€ ์–ด๋–ป๊ฒŒ ์„ธ์šฐ๋Š”๊ฐ€? * ์ „์ฒด ์•ฑ์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  React ๋ฒ„์ „์„ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ํด๋” ๊ตฌ์กฐ(Feature-Sliced Design ๋“ฑ)๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด, ๊ธฐ์กด ์ฝ”๋“œ์™€ ์ƒˆ๋กœ์šด ์ฝ”๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ•œ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๋ณ‘์กด์‹œํ‚ค๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? ### Practical Application Contexts * **Implementation:** ๊ธฐ์กด์— ๋ฐฉ์น˜๋œ `useState`์™€ `useEffect`๋ฅผ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋กœ์ง์„ Tanstack Query๋กœ ๋ถ„๋ฆฌ ๋ฐ ์ด๊ด€ํ•˜๊ณ , ์ธ๋ผ์ธ ์Šคํƒ€์ผ๋ง์ด๋‚˜ ์ค‘๊ตฌ๋‚œ๋ฐฉ์ธ CSS๋ฅผ ํŠน์ • ํŒจํ„ด ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๋Š” ์‹ค์ œ์ ์ธ ์ฝ”๋“œ ์ •๋ฆฌ ์ž‘์—…. * **System Design:** Redux์— ์˜์กดํ•˜๋˜ ๋ฐฉ๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ '์„œ๋ฒ„ ์ƒํƒœ(๋ฐ์ดํ„ฐ ํ†ต์‹ )'์™€ 'ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ(UI ํ† ๊ธ€ ๋“ฑ)'๋กœ ์„ค๊ณ„์ ์œผ๋กœ ๋ถ„๋ฆฌํ•จ. * **Operation / Maintenance:** ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ Store๋‚˜ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ ์ง„์ ์œผ๋กœ ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•ด๊ฐ€๋Š” Git ๊ธฐ๋ฐ˜์˜ ๋ฌด์ค‘๋‹จ ๋ฆฌํŒฉํ„ฐ๋ง ํŒŒ์ดํ”„๋ผ์ธ. * **Learning Path:** ๋ ˆ๊ฑฐ์‹œ React์˜ ๋‹จ์  ๋ถ„์„ -> UI ๋ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ „๋žต ์ˆ˜๋ฆฝ -> Custom Hooks ์ž‘์„ฑ ๋ฐ SOLID ์›์น™ ํ•™์Šต -> ์ƒํƒœ ๊ด€๋ฆฌ ํ˜„๋Œ€ํ™” -> ํด๋”/์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์ˆœ์œผ๋กœ ์ ์ง„์ ์ธ ์‹ฌํ™” ํ•™์Šต. * **My Project Relevance:** ์˜ค๋ž˜์ „์— ๊ฐœ๋ฐœ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๊ทน๋„๋กœ ๋–จ์–ด์ง€๋Š” ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ด์–ด๋ฐ›์•„ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋ฅผ ํ”ฝ์Šคํ•ด์•ผ ํ•  ๋•Œ, ์ฝ”๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด์ฒดํ•˜๊ณ  ๋ชจ๋“ˆํ™”ํ•˜๋Š” ์ง€์นจ์œผ๋กœ ํ™œ์šฉ. ### Adjacent Topics * [[SOLID Principles]] * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ„ฐ๋ง ๊ณผ์ •์—์„œ ๊ฐ ์ปดํฌ๋„ŒํŠธ์™€ ๋ชจ๋“ˆ์ด '๋‹จ์ผ ์ฑ…์ž„(SRP)'์ด๋‚˜ '์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ(ISP)' ์›์น™์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ์˜์กด์„ฑ์„ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์‹ฌํ™” ์ดํ•ด. * [[State Management]] * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ„ฐ๋ง ์‹œ Redux, Context API, Zustand, TanStack Query ๋“ฑ ๊ฐ๊ฐ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์„ฑ๋Šฅ ํŠน์ง•(๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ ํ•ด๊ฒฐ ๋“ฑ)์„ ๋น„๊ต ๋ถ„์„ํ•˜์—ฌ ์ตœ์ ์˜ ๊ธฐ์ˆ  ์Šคํƒ์„ ์„ ์ •ํ•˜๋Š” ๊ณผ์ • ํƒ๊ตฌ. --- *Last updated: 2026-04-30*