# [[React Frontend Architecture|React Frontend Architecture]] ## ๐Ÿ“Œ Brief Summary React ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋ผˆ๋Œ€์ด์ž ์กฐ์งํ™” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [1, 2]. ๊ธฐ์กด์˜ ๊ธฐ์ˆ ์  ํŒŒ์ผ ๋‹จ์œ„ ๋ถ„๋ฆฌ์—์„œ ๋ฒ—์–ด๋‚˜, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ(Feature-Based)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [3-5]. ์ด๋ฅผ ํ†ตํ•ด ๋ฌด๋ถ„๋ณ„ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ UI ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๊ณ  ๋ช…ํ™•ํ•œ ์ƒํƒœ ์†Œ์œ ๊ถŒ์„ ํ™•๋ฆฝํ•˜๋ฉฐ, ํŒ€๊ณผ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [6-8]. ## ๐Ÿ“– Core Content * **ํด๋” ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆํ™”์˜ ์ง„ํ™”**: ๊ณผ๊ฑฐ์—๋Š” ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ํŒŒ์ผ ์œ ํ˜•๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ–ˆ์œผ๋‚˜, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋…ผ๋ฆฌ์  ๊ธฐ๋Šฅ์ด ํŒŒํŽธํ™”๋˜์–ด ํƒ์ƒ‰๊ณผ ํ™•์žฅ์ด ์–ด๋ ค์› ๋‹ค [4, 9]. 2025๋…„ ๊ธฐ์ค€ ํ”„๋ก ํŠธ์—”๋“œ ์—…๊ณ„ ํ‘œ์ค€์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฌถ๋Š” '๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-Based)' ๊ตฌ์กฐ๋กœ ์ „ํ™˜๋˜์—ˆ๋‹ค [5, 10]. ํŠน์ • ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋กœ์ง ๋“ฑ์„ ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ์— ์บก์Аํ™”ํ•จ์œผ๋กœ์จ ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค [11, 12]. * **๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„ (Feature-Sliced Design, FSD)**: FSD๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)์™€ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฒฐํ•ฉํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์ „์šฉ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [3, 13]. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ `app`, `pages`, `widgets`, `features`, `entities`, `shared`์˜ ๊ณ„์ธต(Layer)์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์—„๊ฒฉํ•œ '๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ' ๊ทœ์น™์„ ๊ฐ•์ œํ•œ๋‹ค [11, 14, 15]. ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts` ํ˜•ํƒœ์˜ 'Public API'๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€์— ๊ธฐ๋Šฅ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์บก์Аํ™”ํ•œ๋‹ค [16-18]. * **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์˜ ์„ธ๋ถ„ํ™”**: ๋‹จ์ผ ๋ชจ๋†€๋ฆฌ์‹ ์Šคํ† ์–ด(์˜ˆ: ๋Œ€๊ทœ๋ชจ Redux)์— ์˜์กดํ•˜๋˜ ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋„๋ก ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํŒŒํŽธํ™”๋˜์—ˆ๋‹ค [19, 20]. ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ์ธ '์„œ๋ฒ„ ์ƒํƒœ'๋Š” TanStack Query(React Query)๋ฅผ ์ด์šฉํ•ด ์บ์‹ฑ ๋ฐ ๋„คํŠธ์›Œํฌ ๋กœ์ง์„ ๊ฒฉ๋ฆฌํ•˜๊ณ , ํ…Œ๋งˆ๋‚˜ ์„ค์ • ๋“ฑ ์ •์ ์ธ '์ „์—ญ ์ƒํƒœ'๋Š” Context API๋กœ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ์ƒํƒœ๋Š” Zustand๋‚˜ Jotai ๋“ฑ ์„ ํƒ์  ๋ Œ๋”๋ง์„ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค [20-24]. * **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์˜ ์ ์šฉ (SOLID & Clean Code)**: React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์—๋„ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ ์šฉํ•˜์—ฌ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปค์ง€๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ๋ Œ๋”๋ง ๋“ฑ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ฑ…์ž„์„ ๊ฐ€์ง„ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค [25, 26]. ์ค‘๋ณต์„ ํ”ผํ•˜๋Š” DRY ์›์น™์„ ํ†ตํ•ด ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜๋ฉด์„œ๋„, ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” KISS ์›์น™๊ณผ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๊ณผ๋„ํ•œ ์ตœ์ ํ™”๋ฅผ ํ”ผํ•˜๋Š” YAGNI ์›์น™ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค [27, 28]. * **๋ช…๋ช… ๊ทœ์น™๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ**: ํด๋”์™€ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ OS ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `kebab-case`๋ฅผ, React ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋ฅผ, ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” `camelCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณดํŽธ์ ์ธ ์ปจ๋ฒค์…˜์ด๋‹ค [29-33]. ์ด๋Ÿฌํ•œ ๊ทœ์น™๊ณผ ์•„ํ‚คํ…์ฒ˜ ์˜์กด์„ฑ ๊ฒฝ๊ณ„๋Š” ESLint๋‚˜ Prettier, Husky์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ๋นŒ๋“œ ํƒ€์ž„ ๋ฐ ์ปค๋ฐ‹ ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ๊ฐ•์ œ(Linting)๋œ๋‹ค [30, 34]. ## โš–๏ธ Trade-offs & Caveats * **FSD ๋ฐ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆํ™”์˜ ๋ณต์žก์„ฑ ์˜ค๋ฒ„ํ—ค๋“œ**: Feature-Sliced Design์€ ๊ตฌ์กฐ์  ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ "๋ฌด์—‡์ด ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ(Feature)์ธ๊ฐ€?"๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ธฐ ๋งค์šฐ ๊นŒ๋‹ค๋กญ๋‹ค๋Š” ๊ทผ๋ณธ์  ์–ด๋ ค์›€์ด ์žˆ๋‹ค [35]. ์ธ์ฆ(Auth)๊ณผ ๊ฐ™์€ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concern)๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์— ๊ฑธ์ณ ์žˆ์–ด ์ ์ ˆํ•œ ๊ณ„์ธต์„ ์ฐพ๊ธฐ ๋ชจํ˜ธํ•˜๋ฉฐ [35, 36], ์—„๊ฒฉํ•œ ๋ถ„ํ•  ๊ทœ์น™์„ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•˜๋ฉด ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•œ ํด๋” ๊ตฌ์กฐ์™€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ธํ•œ ๊ฐœ๋ฐœ ์†๋„ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค [12, 37]. ๋˜ํ•œ, ๊ทœ์น™์„ ์ œ๋Œ€๋กœ ์ˆ™์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ 'Shared' ๊ณ„์ธต์— ์Ÿ์•„๋ถ€์–ด ์ตœ์•…์˜ ํŒŒ๊ธ‰ ํšจ๊ณผ๋ฅผ ๋‚ณ๋Š” ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋  ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค [38, 39]. * **์ถ”์ƒํ™”(DRY)์™€ ๋‹จ์ˆœํ•จ(KISS)์˜ ์ƒ์ถฉ**: DRY ์›์น™์— ์ง‘์ฐฉํ•˜์—ฌ ์ฝ”๋“œ ์ค‘๋ณต์„ ๋ฌด์กฐ๊ฑด ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์ˆ˜๋งŽ์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ๋ถ„๊ธฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฑฐ๋Œ€ํ•˜๊ณ  ๋ณต์žกํ•œ ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ๋‹ค [27]. ์ด๋Ÿฌํ•œ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๋ฐ˜๋ณต๋ณด๋‹ค ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋–จ์–ด๋œจ๋ ค KISS ์›์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๋ฅผ ๋‚ณ์œผ๋ฏ€๋กœ, ๋ช…ํ™•ํ•œ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€๋Š” ์ถ”์ƒํ™”๋ฅผ ๋ฏธ๋ฃจ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [27, 40, 41]. * **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ์„ ํƒ์— ๋”ฐ๋ฅธ ๋ถ€์ž‘์šฉ**: React ๋‚ด์žฅ Context API๋Š” ์™ธ๋ถ€ ์˜์กด์„ฑ ์—†์ด ์ƒํƒœ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒํƒœ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ•์ œ๋กœ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ์ œ์•ฝ์ด ์žˆ๋‹ค [42, 43]. ๋ฐ˜๋Œ€๋กœ Redux๋Š” ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ์™€ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ํˆด์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ์˜ ํญ๋ฐœ์  ์ฆ๊ฐ€๋ฅผ ๋™๋ฐ˜ํ•˜์—ฌ ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ณผ๋„ํ•œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [44, 45]. * **์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์˜ ์ˆจ์€ ๋น„์šฉ**: `React.memo`, `useMemo`, `useCallback`์€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์•„์ฃผ์ง€๋งŒ ๊ทธ ์ž์ฒด๊ฐ€ ๊ณต์งœ๋Š” ์•„๋‹ˆ๋‹ค [46]. ์ด์ „ Props๋‚˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ์–•์€ ๋น„๊ต(Shallow compare)ํ•˜๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ์ถ”๊ฐ€๋œ๋‹ค [46]. ๋งŒ์•ฝ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งค์šฐ ์‹ผ ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๊ฐ’(์ธ๋ผ์ธ ํ•จ์ˆ˜, ๊ฐ์ฒด)์„ ์ง€์†์ ์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ์ฐจ๋‹จ์— ์‹คํŒจํ•œ๋‹ค๋ฉด, ์ตœ์ ํ™” ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์˜คํžˆ๋ ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ๋А๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค [46, 47]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋””์ž์ธ ํŒจํ„ด] - [[Feature-Sliced Design|Feature-Sliced Design]] - ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“ˆํ™” ๋ฐ ๊ณ„์ธตํ™”๋ฅผ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ [3, 13]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• , ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™ ์ ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  Public API๋ฅผ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์บก์Аํ™” ์›๋ฆฌ [14, 16, 17]. - [[SOLID Principles|SOLID Principles]] - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌ์กฐ๋ฅผ ์งœ๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ OOP๋ฅผ ๋„˜์–ด React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›์น™์ด๊ธฐ ๋•Œ๋ฌธ [17, 48]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ด์šฉํ•œ ๋น„๋Œ€ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌํŒฉํ† ๋ง ๋ฐฉ์‹ ๋ฐ ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ํ™œ์šฉํ•œ UI ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition) ์ „๋žต [25, 49]. #### [์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ตœ์ ํ™” ์ „๋žต] - [[แ„‰แ…กแ†ผแ„แ…ข แ„€แ…ชแ†ซแ„…แ…ต(State Management)|State Management]] - ์—ฐ๊ฒฐ ์ด์œ : ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ(์„œ๋ฒ„ ๋ฐ์ดํ„ฐ, ๋กœ์ปฌ ์ƒํƒœ, ์ „์—ญ UI ์ƒํƒœ)์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ฑ…์ž„๊ณผ ์ €์žฅ์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํ•ต์‹ฌ ๋ถ„์•ผ์ด๊ธฐ ๋•Œ๋ฌธ [20, 50]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ๋ŒํŒŒํ•˜๊ธฐ ์œ„ํ•œ Zustand/Jotai์˜ Selector ํŒจํ„ด ์ž‘๋™ ์›๋ฆฌ ๋ฐ TanStack Query๋ฅผ ํ™œ์šฉํ•œ ์„œ๋ฒ„ ์ƒํƒœ ๊ฒฉ๋ฆฌ ๊ธฐ๋ฒ• [21, 43, 51]. - [[Performance Optimization|Performance Optimization]] - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•˜๋Š” ์„ฑ๋Šฅ ์ง€ํ‘œ(Web Vitals) ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ [52, 53]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ๋ฐ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ํ†ตํ•œ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ํ›…์˜ ํ™œ์šฉ๋ฒ• [54-56]. ### Deeper Research Questions - Feature-Sliced Design(FSD)์—์„œ ์ธ์ฆ(Auth)์ด๋‚˜ ๋ถ„์„(Analytics) ๊ฐ™์€ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ๊ฒฐํ•ฉ๋„๋ฅผ ๋†’์ด์ง€ ์•Š๊ณ  ์ฃผ์ž…/๊ณต์œ ํ•˜๋Š” ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? - React Compiler๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์„ฑ๊ณต์ ์œผ๋กœ ๋„์ž…๋˜์–ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง(`useMemo`, `useCallback`)์ด ๋Œ€๊ฑฐ ์‚ญ์ œ๋  ๋•Œ, ํ”„๋ก ํŠธ์—”๋“œ ํด๋” ๊ตฌ์กฐ์™€ ์ฝ”๋“œ ์‘์ง‘๋„์— ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ตฌ์กฐ์  ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - ์„œ๋ฒ„ ์ƒํƒœ(Server State) ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํด๋ผ์ด์–ธํŠธ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ(Client State) ๋„๊ตฌ๋ฅผ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌํ•œ ์•„ํ‚คํ…์ฒ˜์—์„œ, ๋‘ ์ƒํƒœ๊ฐ€ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๋™๊ธฐํ™”๋˜๊ฑฐ๋‚˜ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? - ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ Micro-Frontends ์•„ํ‚คํ…์ฒ˜์™€ Feature-Sliced Design์€ ์–ด๋–ป๊ฒŒ ํ˜ธํ™˜๋˜๋ฉฐ, ๊ฐ ๋…๋ฆฝ ์„œ๋น„์Šค ๊ฐ„์˜ ์ค‘๋ณต ์ฝ”๋“œ(Shared ๋ ˆ์ด์–ด) ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - ๋ณต์žก๋„ ๋†’์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• React ์ปดํฌ๋„ŒํŠธ์— ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)์„ ์ ์šฉํ•  ๋•Œ, ์ปจํ…์ŠคํŠธ(Context API)๋‚˜ ํ”„๋กญ ๋“œ๋ฆด๋ง(Prop Drilling)์„ ํ”ผํ•˜๋ฉด์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„๋Œ€์ ์ธ ์ œ์–ด ์—ญ์ „(IoC) ๊ตฌํ˜„ ํŒจํ„ด์€ ๋ฌด์—‡์ด ์žˆ๋Š”๊ฐ€? ### Practical Application Contexts - **Implementation:** ๊ธฐ์ˆ ์  ํŒŒ์ผ ์œ ํ˜•(์ปดํฌ๋„ŒํŠธ, ํ›…) ์ค‘์‹ฌ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜, `src/features/` ๋‚ด์— ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์˜ˆ: ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์œ ์ € ํ”„๋กœํ•„)์— ์—ฐ๊ด€๋œ UI, API ํ†ต์‹ , ๋กœ์ปฌ ํ›…์„ ์บก์Аํ™”ํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค [5, 11, 57]. - **System Design:** ๋ชจ๋†€๋ฆฌ์‹ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด ์„ค๊ณ„ ์ง€์–‘. API ์บ์‹ฑ ๋ฐ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query๋ฅผ ์‚ฌ์šฉํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฒฝ๊ณ„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๋‹คํฌ ๋ชจ๋“œ ๊ฐ™์€ ์•ฑ ์„ค์ •์€ Context API๋กœ, ์‹ค์‹œ๊ฐ„ UI ์ƒํƒœ ๋ณ€๊ฒฝ์€ Zustand ๋“ฑ์œผ๋กœ ์ชผ๊ฐœ์–ด ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ตœ์ ํ™”ํ•œ๋‹ค [20, 21, 24]. - **Operation / Maintenance:** ๋Ÿฐํƒ€์ž„ ํฌ๋ž˜์‹œ์— ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•ฑ์˜ ์ตœ์ƒ๋‹จ๋ฟ ์•„๋‹ˆ๋ผ ๋ถˆ์•ˆ์ •ํ•œ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์ด๋‚˜ ๊ฐœ๋ณ„ ๋ผ์šฐํŠธ ๋‹จ์œ„์— ๊ฐ์‹ธ, ํŠน์ • ๋ชจ๋“ˆ์˜ ์—๋Ÿฌ๊ฐ€ ์•ฑ ์ „์ฒด์˜ "ํ™”์ดํŠธ ์Šคํฌ๋ฆฐ" ์žฅ์• ๋กœ ๋ฒˆ์ง€๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [58-60]. - **Learning Path:** React ๊ธฐ์ดˆ ๋ฌธ๋ฒ• ๋ฐ ๋ Œ๋”๋ง ์›๋ฆฌ ํŒŒ์•… -> ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ๊ณผ SRP ์›์น™(SOLID) ํ•™์Šต -> ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ ๋ฐ FSD ์ ์šฉ ๋ฐฉ์‹ ์ดํ•ด -> ๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ๋ Œ๋”๋ง ๋ฆฌํŒฉํ† ๋ง ์Šคํ‚ฌ ํ–ฅ์ƒ์˜ ํ๋ฆ„์œผ๋กœ ์—ญ๋Ÿ‰์„ ๋ฐœ์ „์‹œํ‚จ๋‹ค [6, 17, 25]. - **My Project Relevance:** ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ `components/` ํด๋”์— ์ˆ˜์‹ญ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐฉ์น˜๋˜์–ด ์žˆ๊ฑฐ๋‚˜, `useCallback` ๋“ฑ์ด ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ, ์ด๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ ํด๋”๋กœ ์žฌ๋ฐฐ์น˜ํ•˜๊ณ  ํ”„๋กœํŒŒ์ผ๋Ÿฌ(Profiler)๋ฅผ ํ†ตํ•ด ์‹ค์ œ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ธก์ •ํ•œ ๋’ค ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฆฌํŒฉํ† ๋ง์— ์ง๊ฒฐ๋œ๋‹ค [12, 61, 62]. ### Adjacent Topics - [[แ„†แ…กแ„‹แ…ตแ„แ…ณแ„…แ…ฉ แ„‘แ…ณแ„…แ…ฉแ†ซแ„แ…ณแ„‹แ…ฆแ†ซแ„ƒแ…ณ (Micro Frontends)|Micro-Frontends]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ React SPA ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€๊ณผ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜๋กœ ์กฐ์œจํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ธํ”„๋ผ ํ™•์žฅ ๊ด€์ ์œผ๋กœ ์—ฐ๊ฒฐ [3, 63]. - Observability and Monitoring - ํ™•์žฅ ๋ฐฉํ–ฅ: ์„ค๊ณ„ํ•œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์–ด๋””์„œ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š”์ง€ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋กœ๊น…, ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง(Web Vitals), ๊ทธ๋ฆฌ๊ณ  Sentry๋ฅผ ํ™œ์šฉํ•œ ์„ธ์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ [64-66]. --- *Last updated: 2026-04-30*