# [[Legacy React Codebase Modernization]] ## ๐Ÿ“Œ Brief Summary ๋ ˆ๊ฑฐ์‹œ ๋ฆฌ์•กํŠธ ์ฝ”๋“œ๋ฒ ์ด์Šค ํ˜„๋Œ€ํ™”(Legacy React Codebase Modernization)๋Š” ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ ๋‚ก์€ ์ฝ”๋“œ๋ฅผ ์ตœ์‹  ๋ฆฌ์•กํŠธ ํ‘œ์ค€๊ณผ ์•„ํ‚คํ…์ฒ˜๋กœ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์•ˆ์ „ํ•œ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ์‹œ์ž‘์œผ๋กœ, ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ํ•จ์ˆ˜ํ˜• ์ „ํ™˜, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript) ๋„์ž…, ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์ตœ์ ํ™”๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ์œ„ํ—˜์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ปค์Šคํ…€ ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋“ฑ ์ ์ง„์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration) ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. [1-3] ## ๐Ÿ“– Core Content * **ํ…Œ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ (Test-Driven Approach)**: ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๊ธฐ ์ „์— ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ์œ ๋‹› ํ…Œ์ŠคํŠธ(Unit Test)๋‚˜ UI ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์ค‘ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๋ง๊ฐ€์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋„๋ก ๋•๋Š” ๋ฐฉ์–ด์„  ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [2, 4, 5]. * **์ตœ์‹  ๋ฆฌ์•กํŠธ ํŒจํ„ด ์ ์šฉ**: ๊ณผ๊ฑฐ์˜ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…(Hooks)์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜์ด๋ผ๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript)๋ฅผ ๋„์ž…ํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ `useEffect` ์‚ฌ์šฉ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ตœ์‹  ๋ฆฌ์•กํŠธ ๋ฐ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3]. * **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ๋ถ„๋ฆฌ ๋ฐ ํ˜„๋Œ€ํ™”**: ์ „์—ญ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๋ฌด๊ฑฐ์šด Redux ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด TanStack Query (React Query)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [3]. ๋‚จ์€ ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ปฌ/์ „์—ญ ์ƒํƒœ๋Š” Context API๋‚˜ Zustand๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค [3]. * **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Incremental Migration)**: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜ํ•˜๋ฏ€๋กœ, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ƒํƒœ ์Šคํ† ์–ด๋‚˜ ๋ชจ๋“ˆ์”ฉ ์ „ํ™˜ํ•˜๋Š” ์ ์ง„์  ๋ฐฉ์‹์ด ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ์œ„ํ•ด ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์œผ๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌํŒฉํ„ฐ๋ง์˜ ์ฃผ์š” ๋‹จ์œ„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค [6, 7]. * **์ฝ”๋“œ ํ’ˆ์งˆ ๋„๊ตฌ์˜ ๋„์ž… ๋ฐ ํ‘œ์ค€ํ™”**: ์ผ๊ด€์„ฑ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ESLint์™€ ๊ฐ™์€ ์ •์  ๋ถ„์„ ๋„๊ตฌ(์˜ˆ: `eslint-plugin-react`, `eslint-plugin-react-hooks`)๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8]. ์ด์™€ ํ•จ๊ป˜ ์ผ๊ด€์„ฑ ์—†์ด ์ž‘์„ฑ๋œ CSS ๊ทœ์น™(์™ธ๋ถ€ CSS, ์ปดํฌ๋„ŒํŠธ CSS ๋“ฑ)์„ ๋‹จ์ผํ•œ ํ‘œ์ค€ ๋ฐฉ์‹์œผ๋กœ ํ†ต์ผํ•˜์—ฌ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [9-11]. ## โš–๏ธ Trade-offs & Caveats * **์ ์ง„์  ๊ฐœ์„  vs ์ „๋ฉด ์žฌ์ž‘์„ฑ (Incremental Refactoring vs. Full Rewrite)**: ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ๊ทœ๋ชจ๊ฐ€ ์ž‘๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„์ „ํžˆ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. ๊ทธ๋Ÿฌ๋‚˜ ๊ทœ๋ชจ๊ฐ€ ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์™„์ „ํ•œ ์žฌ์ž‘์„ฑ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ˆ„๋ฝ ๋ฐ ์‹ฌ๊ฐํ•œ ์œ„ํ—˜์„ ์ˆ˜๋ฐ˜ํ•˜๋ฏ€๋กœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๊ณผ ๋ณ‘ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ง„์  ๊ฐœ์„ ์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1]. * **TypeScript ๋„์ž…์˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€**: ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด TypeScript๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋˜์ง€๋งŒ, ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ธ์ง€์  ์˜ค๋ฒ„ํ—ค๋“œ์™€ ๋ณต์žก์„ฑ์˜ ์ƒˆ๋กœ์šด ์ธต์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์ฒด ์ ์šฉ๋ณด๋‹ค๋Š” ํŒŒ์ผ ๋‹จ์œ„๋กœ ์ ์ฐจ์ ์œผ๋กœ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•œ ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12]. * **์ƒํƒœ ๊ด€๋ฆฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ**: Context API์—์„œ Zustand๋กœ์˜ ์ „ํ™˜์€ ๋น„๊ต์  ์ˆ˜์›”ํ•˜์ง€๋งŒ, ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•ด Zustand์—์„œ Redux๋กœ ๋„˜์–ด๊ฐ€๊ฑฐ๋‚˜, ๋ฐ˜๋Œ€๋กœ Redux์—์„œ Zustand๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์€ ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์˜ ์•„ํ‚คํ…์ฒ˜์— ๊นŠ๊ฒŒ ๊ด€์—ฌํ•˜๋ฏ€๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๋งค์šฐ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฑฐ๋‚˜(Painful) ์œ„ํ—˜(Risky)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] - [[Incremental Migration]] - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด์ž ์ฒ ํ•™์ž…๋‹ˆ๋‹ค. [1] - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ๋ง๊ฐ€๋œจ๋ฆฌ์ง€ ์•Š๊ณ , ๋‹จ์ผ ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ์Šคํ† ์–ด ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉฐ ์•ˆ์ „ํ•˜๊ฒŒ ํ˜„๋Œ€ํ™”ํ•˜๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[Single Responsibility Principle (SRP)]] - ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๋Š” ๋ณตํ•ฉ์ ์ธ ์ฑ…์ž„(์ƒํƒœ ๊ด€๋ฆฌ, ๋ Œ๋”๋ง, ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋“ฑ)์„ ์ชผ๊ฐœ๋Š” ํ•ต์‹ฌ ์ฒ™๋„์ž…๋‹ˆ๋‹ค. [14] - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณต์žกํ•˜๊ณ  ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™œ ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ›…์œผ๋กœ ๋‚˜๋ˆ„์–ด์•ผ ํ•˜๋Š”์ง€ ๊ทธ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] - [[Unit Testing]] - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ„ฐ๋ง ์ž‘์—… ์ „์— ๊ธฐ์กด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. [2, 5] - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์•ˆ์ „ํ•œ ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ , ์ฝ”๋“œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜์—ฌ ํšŒ๊ท€ ๋ฒ„๊ทธ(Regression)๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[TanStack Query]] - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด์˜ ๋น„ํšจ์œจ์ ์ธ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ(์˜ˆ: Redux)์—์„œ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋œ์–ด๋‚ด์–ด ๊ตฌ์กฐ๋ฅผ ์ตœ์‹ ํ™”ํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. [3, 15] - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ API ์ƒํƒœ๋ฅผ ์ฒ ์ €ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์ปดํฌ๋„ŒํŠธ ๋ฐ ๋กœ์ง์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๋ฐฉ์‹์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[ESLint]] - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ๋ฆฌ์•กํŠธ์˜ ๊ถŒ์žฅ ์‚ฌํ•ญ(Hooks ๊ทœ์น™ ๋“ฑ)์„ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•˜์—ฌ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. [8, 16] - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋™ํ™”๋œ ์ •์  ๋ถ„์„์„ ํ†ตํ•ด ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ํ˜„๋Œ€ํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๊ด€๋ฆฌํ•˜๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### Deeper Research Questions - ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…(Hooks)์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๋ถ€์ž‘์šฉ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•œ ๋””์ž์ธ ํŒจํ„ด๊ณผ ์ ์ง„์  ์ ์šฉ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? - ๊ธฐ์กด์˜ ๋ณต์žกํ•œ Context API ๋˜๋Š” Redux ์ƒํƒœ๋ฅผ ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query)์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ(Zustand ๋“ฑ)๋กœ ๋ถ„ํ• ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€์žฅ ํ”ํ•œ ์ถฉ๋Œ ํฌ์ธํŠธ์™€ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? - ๋Œ€๊ทœ๋ชจ JavaScript ๊ธฐ๋ฐ˜ React ํ”„๋กœ์ ํŠธ์— TypeScript๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•  ๋•Œ, ํŒŒ์ผ ๊ฐ„ ์˜์กด์„ฑ์— ๋”ฐ๋ฅธ ํƒ€์ž… ์˜ค๋ฅ˜ ํญํฌ(Type Error Cascade) ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ์–ต์ œํ•  ๊ฒƒ์ธ๊ฐ€? - ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Testing) ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๋งค์šฐ ๋‚ฎ๊ฑฐ๋‚˜ ์ „๋ฌดํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ, ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํŒŒ์•…ํ•˜๊ณ  ์ตœ์šฐ์„ ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ธฐ์ค€์€ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? - ๋น„๋Œ€ํ•œ ๋‹จ์ผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•  ๋•Œ, 'KISS'์™€ 'DRY' ์›์น™ ๊ฐ„์˜ ์ถฉ๋Œ(์ง€๋‚˜์นœ ์ถ”์ƒํ™”๋กœ ์ธํ•œ ๋ณต์žก๋„ ์ฆ๊ฐ€)์„ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ฐ€์ด๋“œ๋ผ์ธ์€ ๋ฌด์—‡์ธ๊ฐ€? ### Practical Application Contexts - **Implementation:** ๋น„๋Œ€ํ•ด์ง„ ๊ธฐ์กด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„์„ํ•˜์—ฌ UI ํŒŒํŠธ์™€ ๋กœ์ง ํŒŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ `useEffect`๋ฅผ ๊ฑท์–ด๋‚ธ ๋’ค `useMemo`, `useCallback`๊ณผ ์ปค์Šคํ…€ ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ๋ณ„๋กœ ์žฌ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. [3, 6] - **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋„๋ฉ”์ธ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ ๊ธฐํšํ•ฉ๋‹ˆ๋‹ค. UI ํ† ๊ธ€์ด๋‚˜ ํ…Œ๋งˆ ๊ฐ™์€ ๋‹จ์ˆœ ์ƒํƒœ๋Š” Context API๋ฅผ, ๋‹ค์ด๋‚˜๋ฏนํ•œ ์ƒํƒœ๋Š” Zustand๋ฅผ, API ์‘๋‹ต ๋ฐ์ดํ„ฐ๋Š” TanStack Query๋กœ ๋ถ„์‚ฐ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. [3, 17, 18] - **Operation / Maintenance:** ESLint(eslint-plugin-react ๋“ฑ)๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์— ๊ตฌ์ถ•ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ธฐ์กด ์Šคํƒ€์ผ์ด ์•„๋‹Œ ์ƒˆ๋กœ์šด React Hooks์˜ ๊ทœ์น™์„ ๊ฐ•์ œ์ ์œผ๋กœ ์ค€์ˆ˜ํ•˜๋„๋ก ์šด์˜ํ•ฉ๋‹ˆ๋‹ค. [8] - **Learning Path:** ๋ฆฌ์•กํŠธ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ ํ•™์Šต ํ›„ -> ์†Œํ˜• ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๋ฐฉ๋ฒ• -> TypeScript ์ ์šฉ๋ฒ• -> ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ฐจ์ด๋กœ ํ™•์žฅํ•ด ๋‚˜๊ฐ€๋Š” ์ˆœ์„œ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. [2, 3, 12] - **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ณ  ์žˆ๋Š” ๋ณต์žกํ•œ ๊ธฐ์กด React ์‹œ์Šคํ…œ์˜ ๊ฐœํŽธ ์ž‘์—…์—์„œ 'ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํ™•๋ณด -> TS ๋„์ž… -> ์ƒํƒœ ๋„๊ตฌ ๋ถ„๋ฆฌ -> ์ปค์Šคํ…€ ํ›… ์ถ”์ƒํ™”' ์ˆœ์˜ ์•ˆ์ •์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋กœ๋“œ๋งต์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### Adjacent Topics - [[Feature-Sliced Design]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํด๋” ๋ฐ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋Šฅ(Feature)๊ณผ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ, ๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„์˜ ์ง€์† ๊ฐ€๋Šฅํ•œ ํด๋” ๊ตฌ์กฐ ์•„ํ‚คํ…์ฒ˜๋กœ ํ™•์žฅ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[React Compiler]] - ํ™•์žฅ ๋ฐฉํ–ฅ: React 19์˜ ๋“ฑ์žฅ๊ณผ ํ•จ๊ป˜, ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์— ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑ๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo`)์„ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ํˆด๋ง์ด ์–ด๋–ป๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ฑ๋Šฅ ๊ด€์ ์—์„œ ํƒ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --- *Last updated: 2026-04-30*