diff --git a/01_Archive/2026-05-03/Aspect-Oriented Programming (AOP).md b/01_Archive/2026-05-03/Aspect-Oriented Programming (AOP).md new file mode 100644 index 00000000..0e505e11 --- /dev/null +++ b/01_Archive/2026-05-03/Aspect-Oriented Programming (AOP).md @@ -0,0 +1,61 @@ +# [[Aspect-Oriented Programming (AOP)]] + +## ๐Ÿ“Œ Brief ์‹œ Summary +Aspect-Oriented Programming(AOP)์€ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ ๋‚ด ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์— ๊ฑธ์ณ ๊ณตํ†ต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” **ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-Cutting Concerns)๋ฅผ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•๋ก **์ด๋‹ค [1]. ์ฃผ๋กœ ๋กœ๊น…, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ํŠธ๋žœ์žญ์…˜, ๋ณด์•ˆ ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ํ•„์ˆ˜์ ์ด์ง€๋งŒ ๋„๋ฉ”์ธ ๋กœ์ง ์ž์ฒด๋Š” ์•„๋‹Œ ๊ธฐ๋Šฅ๋“ค์„ ์บก์Аํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [2], [3]. ์ด๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ์˜ ์ค‘๋ณต(Scattering)์„ ๋ง‰๊ณ  ์‹œ์Šคํ…œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค [4], [5]. + +## ๐Ÿ“– Core Content +* **๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ (Core vs Cross-Cutting):** + ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์€ ์ผ์ฐจ์  ์š”๊ตฌ์‚ฌํ•ญ์ธ ํ•ต์‹ฌ ๊ด€์‹ฌ์‚ฌ(Core Concerns, ์˜ˆ: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)์™€ ์ด์ฐจ์  ์š”๊ตฌ์‚ฌํ•ญ์ธ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-Cutting Concerns)๋กœ ๋‚˜๋‰œ๋‹ค [2]. AOP๋Š” ์ด ์ค‘ ๋กœ๊น…, ๋ณด์•ˆ, ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ณ„์ธต(ํ”„๋ ˆ์  ํ…Œ์ด์…˜, ๋น„์ฆˆ๋‹ˆ์Šค, ๋ฐ์ดํ„ฐ ๋“ฑ)์— ๊ฑธ์ณ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋“ฑ์žฅํ•˜๋Š” ๋กœ์ง์„ ์ถ”์ถœํ•ด ๋‚ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค [6], [7], [2], [8], [9]. +* **์ฝ”๋“œ ์‚ฐ์žฌ(Scattering)์™€ ์–ฝํž˜(Tangling) ๋ฐฉ์ง€:** + AOP๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ˆ˜๋ฐฑ, ์ˆ˜์ฒœ ๊ฐœ์˜ ํด๋ž˜์Šค์— `try-catch` ๋ธ”๋ก์ด๋‚˜ ๋กœ๊น… ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฐ์žฌํ•˜๊ฒŒ ๋œ๋‹ค [8], [10]. AOP๋Š” ์ด๋Ÿฌํ•œ ๋กœ์ง์„ ํ•˜๋‚˜์˜ '๊ด€์ (Aspect)'์œผ๋กœ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ์˜ ์˜ค์—ผ์„ ๋ง‰๊ณ  ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๊ณผ DRY(Don't Repeat Yourself) ์›์น™์„ ์ค€์ˆ˜ํ•˜๋„๋ก ๋•๋Š”๋‹ค [4], [11], [12]. +* **ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ์‹ค์ „ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด:** + * **Spring Boot (Java):** AOP๋Š” ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ์—์„œ ์ž‘๋™ํ•˜๋ฉฐ, ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋“ฑ ๋ชจ๋“  Spring ๋นˆ(Bean) ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ๋‹ค [5]. `@Aspect` ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ `@Before`, `@After`, `@Around` ๋“ฑ์˜ Advice๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ„ฐ์น˜ํ•˜์ง€ ์•Š๊ณ  ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์‹ค์ „ ํŒจํ„ด์ด๋‹ค [5], [13], [14]. + * **C# / .NET:** C#์€ AOP๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ˆ˜์ค€์—์„œ ์™„์ „ํ•˜๊ฒŒ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค [1]. ๋”ฐ๋ผ์„œ ์†์„ฑ(Attributes)์„ ์ •์˜ํ•˜๊ณ  `Castle.DynamicProxy`์™€ ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๊ฐ€๋กœ์ฑ„๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ„์ ‘์ ์ธ AOP๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค [1]. + +## โš–๏ธ Trade-offs & Caveats +* **์ฝ”๋“œ์˜ ๋งˆ๋ฒ• ๊ฐ™์€ ๋™์ž‘(Magical Behavior)๊ณผ ๋””๋ฒ„๊น… ๋‚œ์ด๋„:** + AOP์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ์ฝ”๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•„๋„ ์€์—ฐ์ค‘์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ง์˜ ํ๋ฆ„์ด ๋„ˆ๋ฌด "๋งˆ๋ฒ•์ฒ˜๋Ÿผ" ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค [15], [16]. ์ด๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน์ • ๋™์ž‘์ด ์–ด๋””์„œ ์œ ๋ฐœ๋˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฉฐ, ์˜๋„์น˜ ์•Š์€ ๊ณณ์—์„œ ๋กœ์ง์ด ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋””๋ฒ„๊น… ์ถ”์ ์ด ๋งค์šฐ ๊นŒ๋‹ค๋กœ์›Œ์ง„๋‹ค [15], [16]. +* **์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ (Performance Cost):** + C# ๋“ฑ์—์„œ `Castle.DynamicProxy`์™€ ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” AOP ์ ‘๊ทผ๋ฒ•์€ ๊ฐ ๋ฉ”์„œ๋“œ๋‚˜ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๋Ÿฐํƒ€์ž„ ํ”„๋ก์‹œ ๋ž˜ํผ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ๋น„์šฉ(Runtime cost)์ด ๋ฐœ์ƒํ•œ๋‹ค [17]. +* **์„ธ๋ฐ€ํ•œ ์ปจํ…์ŠคํŠธ ์ œ์–ด์˜ ํ•œ๊ณ„:** + ํŠน์ • ์ƒํ™ฉ์˜ ์„ธ๋ถ€์ ์ธ ๋งฅ๋ฝ(์˜ˆ: ํ•จ์ˆ˜ ๋‚ด ํŠน์ • ์ง€์—ญ ๋ณ€์ˆ˜์˜ ์ƒํƒœ ํฌ๋งทํŒ…)์ด ํ•„์š”ํ•œ ๋กœ๊น…์˜ ๊ฒฝ์šฐ, AOP ์™ธ๋ถ€ ๋ž˜ํผ์—์„œ ๊ทธ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ค์›Œ ๊ธฐ์กด ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฝ”๋“œ ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค [18]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +* **[[Cross-Cutting Concerns]]** (ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ) + * ์—ฐ๊ฒฐ ์ด์œ : AOP๊ฐ€ ๊ธฐ์ˆ ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๋Œ€์ƒ์ด ๋ฐ”๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [6], [1]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋กœ๊น…, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ์บ์‹ฑ, ๋ณด์•ˆ ์ •์ฑ… ๋“ฑ์ด ์™œ ๋น„์ฆˆ๋‹ˆ์Šค ํ•ต์‹ฌ ๋กœ์ง๊ณผ ๋ถ„๋ฆฌ๋˜์–ด ๊ด€๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๊ทธ ์•„ํ‚คํ…์ฒ˜์  ๋‹น์œ„์„ฑ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [7], [3]. +* **[[Separation of Concerns]]** (๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ) + * ์—ฐ๊ฒฐ ์ด์œ : ํ•ต์‹ฌ ๋„๋ฉ”์ธ ๊ทœ์น™๊ณผ ์‹œ์Šคํ…œ ์ธํ”„๋ผ ๋กœ์ง์„ ๋ฌผ๋ฆฌ์ /๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์˜ ๋Œ€์›์น™์œผ๋กœ, AOP ํƒ„์ƒ์˜ ์ฒ ํ•™์  ๊ธฐ๋ฐ˜์ด๋‹ค [7], [19]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์™ธ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋กœ๋ถ€ํ„ฐ ์–ด๋–ป๊ฒŒ ๊ณ ๋ฆฝ์‹œํ‚ค๋Š”์ง€ ๊ทธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [7], [20]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +* **[[Filters]] & [[Interceptors]]** + * ์—ฐ๊ฒฐ ์ด์œ : Spring Boot์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ AOP์™€ ํ•จ๊ป˜ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ ์ปดํฌ๋„ŒํŠธ๋“ค์ด๋‹ค [19], [21], [16]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: AOP(์ž„์˜์˜ ๋นˆ ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ), Filter(์„œ๋ธ”๋ฆฟ ๋ ˆ๋ฒจ), Interceptor(์›น ์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ๋ฒจ)๊ฐ€ ๊ฐ๊ฐ ์–ด๋А ๊ณ„์ธต์—์„œ ์–ด๋–ค ์—ญํ• (์˜ˆ: CORS, ๋ณด์•ˆ, ์„ธ๋ถ€ ๋กœ๊น… ๋“ฑ)์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ์ง€ ๋น„๊ต ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค [13], [22]. + +### Deeper Research Questions +* Spring Boot ์‹œ์Šคํ…œ์—์„œ ๋กœ๊น…์ด๋‚˜ ๋ณด์•ˆ ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ์„œ๋ธ”๋ฆฟ ๊ณ„์ธต์˜ Filter, MVC ๊ณ„์ธต์˜ Interceptor, ์„œ๋น„์Šค ๊ณ„์ธต์˜ AOP ์ค‘ ์–ด๋А ๊ฒƒ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ตœ์ ์˜ ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋ณด์žฅํ•˜๋Š”๊ฐ€? [13], [22] +* C# ๋ฐ .NET ํ™˜๊ฒฝ์—์„œ ๋Ÿฐํƒ€์ž„ ํ”„๋ก์‹œ ์ƒ์„ฑ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ์ปดํŒŒ์ผ ํƒ€์ž„(Compile-Time) ์œ„๋น™์„ ํ†ตํ•œ AOP ๊ตฌํ˜„ ๋ฐฉ์‹์—๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ๋Š”๊ฐ€? [17] +* AOP์˜ '๋งˆ๋ฒ• ๊ฐ™์€(magical)' ๋น„๋ช…์‹œ์  ์‹คํ–‰ ํ๋ฆ„์œผ๋กœ ์ธํ•œ ๋””๋ฒ„๊น… ์ถ”์ ์˜ ์–ด๋ ค์›€์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ๋Š” ์–ด๋– ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์•ˆ์ „์žฅ์น˜๋‚˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜๋Š”๊ฐ€? [15], [16] +* ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜(Clean Architecture)๋‚˜ ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜(Hexagonal Architecture) ํŒจํ„ด ๋‚ด์—์„œ AOP๋ฅผ ์ ์šฉํ•  ๋•Œ, ํ•ต์‹ฌ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์นจ๋ฒ”ํ•˜์ง€ ์•Š๊ณ  ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๋ ˆ์ด์–ด์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [7], [19] +* ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋‚˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์—์„œ AOP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์— ๊ฑธ์นœ ๋ถ„์‚ฐ ์ถ”์ (Distributed Tracing) ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์˜ ์ผ๊ด€์„ฑ์„ ์–ด๋–ป๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [23], [24], [25] + +### Practical Application Contexts +* **Implementation:** Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Service)์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๊ฑฐ๋‚˜ ๋กœ๊น…์„ ๋‚จ๊ธธ ๋•Œ, ์ฝ”๋“œ ๋‚ด๋ถ€์— `System.out.println` ๋“ฑ์„ ์‚ฐ์žฌ์‹œํ‚ค์ง€ ์•Š๊ณ  `@Aspect`์™€ `@Around` ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜์—ฌ ๊น”๋”ํ•˜๊ฒŒ ์บก์Аํ™”ํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค [10], [5], [13]. +* **System Design:** ์‹œ์Šคํ…œ ์ „๋ฐ˜์— ๊ฑธ์นœ ๋ณด์•ˆ ๊ฒ€์‚ฌ, ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ, ๊ธ€๋กœ๋ฒŒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ •์ฑ…์„ ์„ค๊ณ„ํ•  ๋•Œ, ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ํ•ด๋‹น ์ฑ…์ž„์„ ์ œ๊ฑฐํ•˜๊ณ  AOP ๊ณ„์ธต์ด๋‚˜ ์ค‘์•™ ์ง‘์ค‘ํ™”๋œ ํŒŒ์ดํ”„๋ผ์ธ ํ–‰๋™(Pipeline Behaviors)์œผ๋กœ ์ถ”์ƒํ™”ํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•œ๋‹ค [19], [26], [8], [27]. +* **Operation / Maintenance:** ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋ณด์•ˆ ์ธ๊ฐ€(Authorization) ์ •์ฑ…์„ ๋Œ€๋Œ€์ ์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋•Œ, ์ˆ˜์ฒœ ๊ฐœ์˜ ํŒŒ์ผ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹  ๋‹จ์ผ Aspect ์ •์˜๋ถ€๋งŒ ์ˆ˜์ •ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค [10], [4]. +* **Learning Path:** ์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ๋Šฅ์˜ ๋ถ„๋ฅ˜(Core vs Cross-Cutting) ์ดํ•ด โž” ์˜์กด์„ฑ ์ฃผ์ž…(DI)์˜ ํ•„์š”์„ฑ ํŒŒ์•… โž” Filter/Interceptor ๋“ฑ ๊ธฐ์กด ๊ณ„์ธต์  ํŒจํ„ด ํ•™์Šต โž” ์ตœ์ข…์ ์œผ๋กœ AOP์˜ ํ•ต์‹ฌ ์š”์†Œ(Aspect, Pointcut, Advice)๋ฅผ ์ ์šฉํ•˜๋Š” ๋‹จ๊ณ„์  ํ•™์Šต ๋ชจ๋ธ์„ ๊ฑฐ์นœ๋‹ค [2], [13]. +* **My Project Relevance:** ํ˜„๋Œ€ ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ ์•„ํ‚คํ…์ฒ˜์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ธํ”„๋ผ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์œตํ•ฉ ์—†์ด ๊ฒฉ๋ฆฌํ•˜๋Š” ํ•„์ˆ˜ ์ „๋žต์œผ๋กœ ๋‹ค๋ค„์ง€์ง€๋งŒ, ๋™์‹œ์— '๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical Debt)'๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๋””๋ฒ„๊น… ๋ณต์žก์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ๋ฐฉ์–ด์ ์œผ๋กœ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ํŒจํ„ด์ด๋‹ค [16], [28]. + +### Adjacent Topics +* **[[Dependency Injection (DI)]]** + * ํ™•์žฅ ๋ฐฉํ–ฅ: AOP๊ฐ€ ์ธํ„ฐ์…‰ํ„ฐ๋‚˜ ๊ด€์ (Aspect)์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณณ๊ณณ์˜ ๊ฐ์ฒด์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ œ์–ด์˜ ์—ญ์ „(IoC) ๋ฐ ์˜์กด์„ฑ ์ฃผ์ž… ์ปจํ…Œ์ด๋„ˆ์˜ ์ง€์›์ด ํ•„์ˆ˜์ ์ด๋ฏ€๋กœ, IoC/DI ์ปจํ…Œ์ด๋„ˆ์˜ ์ž‘๋™ ์›๋ฆฌ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค [29], [30]. +* **[[Hexagonal Architecture]]** + * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋„๋ฉ”์ธ ๋กœ์ง์„ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ UI ์ธํ”„๋ผ๋กœ๋ถ€ํ„ฐ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ณดํ˜ธํ•œ๋‹ค๋Š” ์ฒ ํ•™์ด AOP์˜ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ์™€ ์ผ๋งฅ์ƒํ†ตํ•˜๋ฏ€๋กœ, ํฌํŠธ์™€ ์–ด๋Œ‘ํ„ฐ(Ports and Adapters) ํŒจํ„ด์—์„œ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜๋Š”์ง€๋กœ ๊ฐœ๋…์„ ํ™•์žฅํ•œ๋‹ค [20], [31]. + +--- +*Last updated: 2026-05-03* \ No newline at end of file diff --git a/01_Archive/2026-05-03/Clean Architecture.md b/01_Archive/2026-05-03/Clean Architecture.md new file mode 100644 index 00000000..36816406 --- /dev/null +++ b/01_Archive/2026-05-03/Clean Architecture.md @@ -0,0 +1,63 @@ +# [[Clean Architecture]] + +## ๐Ÿ“Œ Brief Summary +Clean Architecture๋Š” ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๊ฑธ์ณ ์žˆ๋Š” ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์›์น™์ž…๋‹ˆ๋‹ค [1]. ์ด ์•„ํ‚คํ…์ฒ˜๋Š” ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ์™€ ๋ชจ๋“ˆํ™”๋ฅผ ๊ฐ•์กฐํ•˜๋ฉฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ๋‹ค๋ฅธ ์š”์†Œ๋“ค๋กœ ์ธํ•ด ์–ด์ง€๋Ÿฝํ˜€์ง€์ง€ ์•Š๊ณ  ๊น”๋”ํ•˜๋ฉฐ ์ ์‘ ๊ฐ€๋Šฅํ•˜๋„๋ก ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ๋กœ๊น…, ์บ์‹ฑ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ์˜ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜(Infrastructure) ๊ณ„์ธต์— ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [3]. + +## ๐Ÿ“– Core Content + +* **๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ์™€ ๋ชจ๋“ˆํ™”์˜ ์ค‘์‹ฌ ์—ญํ• ** + Clean Architecture์—์„œ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(๋กœ๊น…, ์ธ์ฆ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ์บ์‹ฑ ๋“ฑ)๋Š” ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ณ„๊ฐœ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 4]. ์ด๋Ÿฌํ•œ ๋ถ„๋ฆฌ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ(tight coupling)์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ๋ง‰์•„์ค๋‹ˆ๋‹ค [4]. Clean Architecture์˜ ์›์น™์— ๋”ฐ๋ผ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด, ์•„ํ‚คํ…์ฒ˜ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +* **์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต(Infrastructure Layer)์—์„œ์˜ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ ๊ตฌํ˜„** + ์ด์ƒ์ ์œผ๋กœ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋Š” ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต์— ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3]. ํ”„๋ ˆ์ž„์›Œํฌ์— ๋”ฐ๋ผ ASP.NET Core ๋ฏธ๋“ค์›จ์–ด๋‚˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ, MediatR ํŒŒ์ดํ”„๋ผ์ธ ๋™์ž‘(Pipeline behaviors) ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 5]. + +* **์ฃผ์š” ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ์˜ ์‹ค์ „ ๋ถ„๋ฆฌ ์ „๋žต** + * **๋กœ๊น…(Logging):** ํŒŒ์ดํ”„๋ผ์ธ ๋™์ž‘ ๋‚ด์— ๋กœ๊น… ๋กœ์ง์„ ์บก์Аํ™”ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌ๋œ ๊ณ ์œ ํ•œ ๊ด€์‹ฌ์‚ฌ๋กœ ์ทจ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5]. ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…(Structured logging)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ณด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋ฉด์„œ๋„ ํ•ต์‹ฌ ๋กœ์ง์„ ์–ด์ง€๋Ÿฝํžˆ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. + * **์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(Validation):** ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” ์‹œ์Šคํ…œ์— ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐฉ์–ด์„ ์œผ๋กœ, ํ•ต์‹ฌ ์ฒ˜๋ฆฌ ๋กœ์ง์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์š”์ฒญ์„ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. ๋ฐ์ดํ„ฐ ํ˜•์‹ ๋“ฑ์„ ํ™•์ธํ•˜๋Š” '์ž…๋ ฅ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ'์™€ ๋„๋ฉ”์ธ ํŠน์ • ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” '๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ'๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ณ„ํ•˜์—ฌ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7, 8]. + * **์บ์‹ฑ(Caching):** ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ž์ฃผ ์“ฐ์ด๋ฉฐ, ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์—์„œ Cache Aside ํŒจํ„ด ๋“ฑ์„ ๊ตฌํ˜„ํ•ด ์š”์ฒญ ์ฒ˜๋ฆฌ ์ „ ์บ์‹œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [8, 9]. + +## โš–๏ธ Trade-offs & Caveats +Clean Architecture ์„ค๊ณ„ ์ž์ฒด์˜ ๊ทผ๋ณธ์ ์ธ ๋‹จ์ ์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜์  ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€(Trade-off)์— ๋Œ€ํ•ด์„œ๋Š” **์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.** + +๋‹ค๋งŒ, Clean Architecture ์›์น™์— ๋”ฐ๋ผ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ตœ์ ํ™”ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์  ์ œ์•ฝ๊ณผ ๊ณ ๋ ค ์‚ฌํ•ญ์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค: +* **๋กœ๊น…์˜ ์ ์ •์„ฑ ๋ฌธ์ œ:** ํšจ๊ณผ์ ์ธ ๋กœ๊น…์„ ์œ„ํ•ด ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์บก์Аํ™”ํ•˜๋”๋ผ๋„, ์„ธ๋ถ„ํ™”(granularity)์™€ ๋ช…ํ™•์„ฑ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”์ง€ ๋ชปํ•˜๋ฉด ๋กœ๊ทธ๊ฐ€ ์œ ์šฉํ•œ ๋„๊ตฌ๊ฐ€ ์•„๋‹Œ ๋‹จ์ˆœํ•œ ์†Œ์Œ(noise)์œผ๋กœ ์ „๋ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6]. +* **์บ์‹ฑ ์„ค๊ณ„์˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€:** ์บ์‹ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋†’์œผ๋ฉด์„œ๋„ ์ถฉ๋ถ„ํžˆ ์•ˆ์ •์ ์ธ(stable) ๋ฐ์ดํ„ฐ๋งŒ์„ ์‹ ์ค‘ํžˆ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [9]. ๋˜ํ•œ, ์ ์ ˆํ•œ ์บ์‹œ ๋ฌดํšจํ™”(Invalidation) ์‹œ์  ๊ฒฐ์ •๊ณผ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋ฐ ํฌ๊ธฐ ๋“ฑ์˜ ์บ์‹œ ์„ค์ •(Configuration)์„ ์™„๋ฒฝํžˆ ํ†ต์ œํ•ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ถ€๋‹ด์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [9]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด / ์„ค๊ณ„ ์‚ฌ์ƒ] +- [[Hexagonal Architecture]] + - ์—ฐ๊ฒฐ ์ด์œ : Clean Architecture์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์™ธ๋ถ€ ์ข…์†์„ฑ(DB, UI ๋“ฑ)์œผ๋กœ๋ถ€ํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์„ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜์ง€ ์•Š๊ณ  ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌ ๋ฐ ๋ชจ๋“ˆํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ž…๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ค‘์‹ฌ์— ๋‘๊ณ  ์™ธ๋ถ€์™€์˜ ์ธํ„ฐํŽ˜์ด์Šค(ํฌํŠธ์™€ ์–ด๋Œ‘ํ„ฐ)๋ฅผ ํ†ตํ•ด ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ์™€ ์™ธ๋ถ€ ๊ธฐ์ˆ ์„ ๊ฒฉ๋ฆฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 10]. + +- [[Cross-Cutting Concerns]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋กœ๊น…, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ์บ์‹ฑ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ ์—ฌ๋Ÿฌ ๊ณ„์ธต์— ๊ฑธ์ณ ๋‚˜ํƒ€๋‚˜๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ๋“ค๋กœ, Clean Architecture๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๋–ผ์–ด๋‚ด์–ด ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ฃผ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค [1, 3, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์™œ ์ด ๊ด€์‹ฌ์‚ฌ๋“ค์ด ์ค‘์•™์ง‘์ค‘ํ™”๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์น˜ํ•  ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ ์ค‘๋ณต๊ณผ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ†ต์ฐฐ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. + +#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] +- [[Modular Monolith]] + - ์—ฐ๊ฒฐ ์ด์œ : Clean Architecture ์›์น™๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ๋•Œ ์ž์ฃผ ์–ธ๊ธ‰๋˜๋Š” ์‹ค์ „ ์‹œ์Šคํ…œ ๊ตฌํ˜„ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค [11, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฌผ๋ฆฌ์ ์ธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ์ „, ๋‹จ์ผ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด์—์„œ Clean Architecture์˜ ๋ชจ๋“ˆํ™”์™€ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ ์›์น™์„ ์–ด๋–ป๊ฒŒ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ์ˆ˜์ค€์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12]. + +### Deeper Research Questions +- Clean Architecture ๋‚ด์—์„œ ๋„๋ฉ”์ธ ๊ทœ์น™์„ ๊ฒ€์ฆํ•˜๋Š” '๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ'์™€ ๋‹จ์ˆœํ•œ '์ž…๋ ฅ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ'๋ฅผ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต์˜ ํŒŒ์ดํ”„๋ผ์ธ (์˜ˆ: MediatR ํŒŒ์ดํ”„๋ผ์ธ)์„ ํ†ตํ•ด ์บ์‹ฑ๊ณผ ๋กœ๊น…์„ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Clean Architecture, Hexagonal Architecture(Ports and Adapters), Onion Architecture ๋“ฑ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋“ค ๊ฐ„์˜ ๋ฏธ์„ธํ•œ ๊ตฌ์กฐ์  ์ฐจ์ด์ ๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ(Spring Boot, NestJS ๋“ฑ)๋ณ„ ์ตœ์ ํ•ฉ์„ฑ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์ˆœ์ˆ˜์„ฑ์„ ์ง€ํ‚ค๋ฉด์„œ ์บ์‹œ ๋ฌดํšจํ™”(Cache Invalidation)์™€ ๊ฐ™์€ ์ธํ”„๋ผ์  ์ œ์–ด ๋กœ์ง์„ ๋„๋ฉ”์ธ๊ณผ ๋ถ„๋ฆฌํ•ด ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์˜ ์˜์กด์„ฑ ์ฃผ์ž…(DI) ์›์น™์ด ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ์—์„œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ ์ „ํ™˜ํ•  ๋•Œ ์–ด๋–ค ์ด์ ๊ณผ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง€๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** .NET ์—์ฝ”์‹œ์Šคํ…œ์˜ MediatR `IPipelineBehavior` ๋‚˜ ASP.NET Core ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊น…, ์บ์‹œ(Cache Aside), ์ž…๋ ฅ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ธํ”„๋ผ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 5, 9]. +- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์ดˆ๊ธฐ ์„ค๊ณ„ ๋‹จ๊ณ„๋ถ€ํ„ฐ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ•œ ๊ณณ์— ์ง‘์ค‘์‹œํ‚ค๋„๋ก ์„ค๊ณ„ํ•จ์œผ๋กœ์จ, ๊ฐ ๊ธฐ๋Šฅ(Feature) ๋ชจ๋“ˆ์˜ ํ•ต์‹ฌ ๋„๋ฉ”์ธ ๊ทœ์น™์ด ์˜ค์—ผ๋˜์ง€ ์•Š๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 4]. +- **Operation / Maintenance:** ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…๊ณผ ์ฒด๊ณ„์ ์ธ ์˜ˆ์™ธ ํŒŒ์ดํ”„๋ผ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ ์šด์˜ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ ์ด์ƒ์„ ๋น ๋ฅด๊ฒŒ ์ถ”์ ํ•˜๊ณ , ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ์œ ์ž…์„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ง„์ž… ์ „์— ์ฐจ๋‹จํ•˜์—ฌ ์šด์˜ ๋ณต์›๋ ฅ์„ ๋†’์ž…๋‹ˆ๋‹ค [6, 8]. +- **Learning Path:** ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ ์ดํ•ด -> ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ ํŒŒ์ดํ”„๋ผ์ธ ํŒจํ„ด ํ•™์Šต -> Clean Architecture์™€ Hexagonal Architecture ์ฒ ํ•™ ์ดํ•ด -> Modular Monolith ๋ฐ Domain-Driven Design ์„ค๊ณ„ ๋ฐฉ์‹ ์ˆ˜๋ฆฝ ์ˆœ์œผ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [2, 3, 11, 12]. +- **My Project Relevance:** ํ˜„์žฌ ์ ์šฉ ์ค‘์ธ ์›น ํ”„๋ ˆ์ž„์›Œํฌ(์˜ˆ: NestJS์˜ ํŒŒ์ดํ”„/๊ฐ€๋“œ, Spring Boot์˜ AOP/์ธํ„ฐ์…‰ํ„ฐ)์—์„œ ํ•ต์‹ฌ ๋กœ์ง ์™ธ์˜ ๊ธฐ๋Šฅ๋“ค์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ์ ๊ฒ€ํ•˜๊ณ , ์ด๋ฅผ Clean Architecture์˜ ๊ด€์ ์—์„œ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต์œผ๋กœ ์žฌ๋ฐฐ์น˜ํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 13]. + +### Adjacent Topics +- [[Domain-Driven Design]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Clean Architecture๊ฐ€ ๊ตฌ์กฐ์  ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ผˆ๋Œ€๋ฅผ ์žก๋Š”๋‹ค๋ฉด, DDD๋Š” ๊ทธ ๋‚ด๋ถ€์˜ 'ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง'์„ ์–ด๋–ป๊ฒŒ ๋ชจ๋ธ๋งํ•˜๊ณ  ๊ตฌ์ฒดํ™”ํ• ์ง€์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋ก ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ด ๋‘˜์˜ ๊ฒฐํ•ฉ ์‹œ๋„ˆ์ง€๋ฅผ ํƒ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 11]. + +--- +*Last updated: 2026-05-03* \ No newline at end of file diff --git a/01_Archive/2026-05-03/Client Components.md b/01_Archive/2026-05-03/Client Components.md new file mode 100644 index 00000000..dfd755bb --- /dev/null +++ b/01_Archive/2026-05-03/Client Components.md @@ -0,0 +1,59 @@ +# [[Client Components]] + +## ๐Ÿ“Œ Brief ์‹ Summary +ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ(Client Components)๋Š” React Server Components (RSC) ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ ์ƒํƒœ(State), ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle), ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์ „์šฉ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „ํ†ต์ ์ธ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1-3]. ํŒŒ์ผ ์ƒ๋‹จ์— `'use client'` ์ง€์‹œ์–ด(directive)๋ฅผ ์„ ์–ธํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๋ฉฐ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ๋‹ฌ๋ฆฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์— ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•˜์ด๋“œ๋ ˆ์ด์…˜(Hydration) ๊ณผ์ •์„ ๊ฑฐ์ณ ์ƒํ˜ธ์ž‘์šฉ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3-5]. + +## ๐Ÿ“– Core Content +* **์ •์˜ ๋ฐ ์‹คํ–‰ ํ™˜๊ฒฝ** + ๋ช…์นญ๊ณผ ๋‹ฌ๋ฆฌ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ๋งŒ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ดˆ๊ธฐ์—๋Š” ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋œ ํ›„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค์‹œ ๋ Œ๋”๋ง(ํ•˜์ด๋“œ๋ ˆ์ด์…˜)๋˜๋Š” ํŠน์ง•์„ ๊ฐ–์Šต๋‹ˆ๋‹ค [2, 6, 7]. ์ด๋Š” ๊ณผ๊ฑฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ 'ํ‘œ์ค€(standard)' React ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ช…์นญ์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. + +* **์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„ ๋ฐ ์ง๋ ฌํ™”(Serialization)** + ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋˜๋Š” Prop์€ ๋ฐ˜๋“œ์‹œ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ(serializable) ๊ฐ’(์˜ˆ: ๋ฌธ์ž์—ด, ์ˆซ์ž, ๊ฐ์ฒด, ๋ฐฐ์—ด, React ์š”์†Œ ๋“ฑ)์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8]. ํ•จ์ˆ˜๋Š” ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ํ”„๋กœํผํ‹ฐ ํ˜•ํƒœ์˜ ํ•จ์ˆ˜ ์ „๋‹ฌ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [8]. ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ฝ”๋“œ๋Š” ๋ฒˆ๋“ค์— ๋‚จ์•„ ์žˆ์œผ๋ฉฐ, ๋ Œ๋”๋ง ์‹œ RSC ํŽ˜์ด๋กœ๋“œ(Payload)์—๋Š” ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“ˆ ์ฐธ์กฐ(module ID, `react.client.reference`)์™€ ์ง๋ ฌํ™”๋œ Prop๋งŒ์ด ํฌํ•จ๋˜์–ด ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค [9, 10]. + +* **์ปดํฌ๋„ŒํŠธ ์ค‘์ฒฉ ๋ฐ ๊ตฌ์กฐํ™” (Interleaving)** + ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€์—์„œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง์ ‘ ์ž„ํฌํŠธ(Import)ํ•˜์—ฌ ๋ Œ๋”๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž„ํฌํŠธํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์•”์‹œ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [11, 12]. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ€๋ชจ ์˜์—ญ์—์„œ ์ƒ์„ฑํ•œ ๋’ค ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์˜ `children`๊ณผ ๊ฐ™์€ Prop ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•˜๋Š” ์ค‘์ฒฉ(Interleaving) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13-15]. Prop์€ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ด ๊ตฌ์กฐ๋ฅผ ๋ฌธ์ œ์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. + +## โš–๏ธ Trade-offs & Caveats +* **์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€:** ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์ง€ ์•Š์•„ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ์ฃผ์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋„ˆ๋ฌด ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค [3, 16]. +* **ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ๊ฐ„๊ทน(Hydration Gap):** ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋ฒ„์—์„œ HTML ํ˜•ํƒœ๋กœ ๋จผ์ € ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์—ฐ๊ฒฐ(ํ•˜์ด๋“œ๋ ˆ์ด์…˜)ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ฒ„ํŠผ ๋“ฑ UI๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์กฐ์ž‘์— ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋Š” ๊ฐ„๊ทน์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [17, 18]. +* **๊ด€์Šต์  ์ ์šฉ์˜ ํ•จ์ • (Vibe Coding Trap):** ํŠœํ† ๋ฆฌ์–ผ์„ ๋”ฐ๋ผ ํ•˜๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ ์—๋Ÿฌ๋ฅผ ํ”ผํ•  ๋ชฉ์ ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๊ณณ๊นŒ์ง€ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ `'use client'`๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ์•ˆํ‹ฐ ํŒจํ„ด์ž…๋‹ˆ๋‹ค [19, 20]. ์ด๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ์žฅ์ (๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฐ์†Œ)์„ ๋ฌดํšจํ™”ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์•„ํ‚คํ…์ฒ˜์  ๋ณต์žก์„ฑ๋งŒ ๊ฐ€์ค‘์‹œํ‚ค๋ฏ€๋กœ, ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์ด๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋Šฅ์ด ๋ช…ํ™•ํžˆ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[React Server Components]] + - ์—ฐ๊ฒฐ ์ด์œ : ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” React Server Components (RSC) ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ˜์ชฝ์ด๋ฉฐ, ์ด ๋‘˜์€ ์„œ๋กœ ํ˜‘๋ ฅํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„์˜ ๋ Œ๋”๋ง ๊ฒฝ๊ณ„๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค [2, 3, 21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™” ์›๋ฆฌ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ์ „์ฒด์ ์ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์•„ํ‚คํ…์ฒ˜. +- [[Hydration]] + - ์—ฐ๊ฒฐ ์ด์œ : ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋„๋‹ฌํ•˜์—ฌ ๋งˆ์นจ๋‚ด ์ƒํ˜ธ์ž‘์šฉ์„ฑ์„ ํš๋“ํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์ž…๋‹ˆ๋‹ค [17, 22]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: SSR(Server-Side Rendering) ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ธฐ์กด HTML DOM ๋…ธ๋“œ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ถ€์ฐฉํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ๋งค์ปค๋‹ˆ์ฆ˜ [18, 22]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[use client]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ•ด๋‹น ํŒŒ์ผ๊ณผ ๊ทธ ํŒŒ์ผ์ด ์ž„ํฌํŠธํ•˜๋Š” ๋ชจ๋“  ์ข…์†์„ฑ์ด ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•จ์„ React์™€ ๋ฒˆ๋“ค๋Ÿฌ์— ๋ช…์‹œํ•˜๋Š” ์ง€์‹œ์–ด(Directive)์ž…๋‹ˆ๋‹ค [3-5]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ 'ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„(Client Boundary)'๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๊ณ  ํŒŒ์ผ ๋‹จ์œ„๋กœ ์ „ํŒŒ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ตฌ์กฐ์  ์›๋ฆฌ [12, 23]. + +### Deeper Research Questions +- ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ React 18์˜ 'Selective Hydration'์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š”๊ฐ€? +- ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์˜ `children` prop์œผ๋กœ ์ „๋‹ฌํ•  ๋•Œ, ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ(State)๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋ฉด ๋‚ด๋ถ€์˜ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๊ฒฐ๊ณผ๋ฌผ์€ ์–ด๋–ป๊ฒŒ ์œ ์ง€๋˜๋Š”๊ฐ€? +- ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ํ™•์žฅ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ ํŠธ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ๊ฐ€? +- React-Query๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ๋‹จ ๊ณ„์ธต(Providers)์— ์ ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํ™œ์šฉ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ฒˆ๋“ค์˜ ํฌ๊ธฐ๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋„๊ตฌ์™€ ์ง€ํ‘œ(Metrics)๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React๋กœ ๋ฒ„ํŠผ, ํผ(Form), ํ† ๊ธ€(Toggle)๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž์˜ ์ง์ ‘์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์ƒํƒœ(`useState`), ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ(`useEffect`)๊ฐ€ ํ•„์š”ํ•œ UI ์กฐ๊ฐ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ƒ๋‹จ์— `'use client'`๋ฅผ ์„ ์–ธํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค [1, 5]. +- **System Design:** ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ์ „์ฒด ๋ ˆ์ด์•„์›ƒ๊ณผ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๊ณ„์ธต์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑํ•˜๊ณ , ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ง๋‹จ์˜ ๋ฆฌํ”„ ๋…ธ๋“œ(Leaf Node)๋‚˜ ํŠน์ • ์ƒํ˜ธ์ž‘์šฉ ์˜์—ญ๋งŒ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ๋Š”(Boundary) ์บก์Аํ™” ์ „๋žต์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [13, 24]. +- **Operation / Maintenance:** ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๊ณผ์ •์—์„œ ์ •์ ์ธ ํ…์ŠคํŠธ๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ง€์ •๋˜์ง€ ์•Š์•˜๋Š”์ง€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฒ€์ˆ˜ํ•˜์—ฌ, ๋ถˆํ•„์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „์†ก๊ณผ ์„ฑ๋Šฅ ํ•˜๋ฝ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [19, 20]. +- **Learning Path:** ์ „ํ†ต์ ์ธ React์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋จผ์ € ํ•™์Šตํ•œ ํ›„, SSR๊ณผ Hydration์˜ ํ•œ๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ณ , React 19 ๋ฐ Next.js ์•ฑ ๋ผ์šฐํ„ฐ๋ฅผ ํ†ตํ•ด RSC ๋ฐ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ์›๋ฆฌ๋ฅผ ์ตํž™๋‹ˆ๋‹ค. +- **My Project Relevance:** ์ฐจ์„ธ๋Œ€ ์›น ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ, ์œ ์ € ์ธํ„ฐ๋ž™์…˜์ด ์žฆ์€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ/์ฑ„ํŒ… ๊ธฐ๋Šฅ์€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ณ , ์ œํ’ˆ ๋ชฉ๋ก ๋“ฑ์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์ถ•ํ•˜์—ฌ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Server Actions]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ ๋“ฑ)์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœํ•˜๋Š” ์ตœ์‹  ํŒจํ„ด์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25-27]. +- [[Suspense]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„์ง ๋กœ๋”ฉ ์ค‘์ด๊ฑฐ๋‚˜ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์ง„ํ–‰ ์ค‘์ผ ๋•Œ, ์‚ฌ์šฉ์ž์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ๋”ฉ ์Šค์ผˆ๋ ˆํ†ค(UI) ๊ตฌํ˜„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [28-30]. + +--- +*Last updated: 2026-05-03* \ No newline at end of file diff --git a/01_Archive/2026-05-03/Composables.md b/01_Archive/2026-05-03/Composables.md new file mode 100644 index 00000000..0d53e40c --- /dev/null +++ b/01_Archive/2026-05-03/Composables.md @@ -0,0 +1,58 @@ +# [[Composables]] + +## ๐Ÿ“Œ Brief Summary +Composables๋Š” Vue 3์˜ Composition API ํ™˜๊ฒฝ์—์„œ ์ƒํƒœ ์ €์žฅ ๋กœ์ง(stateful logic)์„ ์บก์Аํ™”ํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ํ•จ์ˆ˜ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. [1, 2] ๊ธฐ์กด Vue์˜ Mixin์ด ๊ฐ€์ง€๋˜ ์ด๋ฆ„ ์ถฉ๋Œ๊ณผ ์•”์‹œ์  ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ทฐ ๋ ˆ์ด์–ด์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” '๊ธฐ๋Šฅ์  ์ฝ”์–ด(functional core)' ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. [3, 4] React์˜ ์ปค์Šคํ…€ ํ›…(Custom Hooks)๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ, ํ˜ธ์ถœ ์ˆœ์„œ๋‚˜ ์กฐ๊ฑด๋ถ€ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ œ์•ฝ์ด ์ ์–ด ๋”์šฑ ์œ ์—ฐํ•˜๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [5] + +## ๐Ÿ“– Core Content +* **๋…ผ๋ฆฌ์˜ ์บก์Аํ™”์™€ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™**: Composables๋Š” ํŠน์ • ๊ธฐ๋Šฅ์ด๋‚˜ ๋‹จ์ผ ์ฑ…์ž„(single responsibility)์— ์ดˆ์ ์„ ๋งž์ถฐ ์„ค๊ณ„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋กœ์ง์„ ์˜ˆ๋กœ ๋“ค๋ฉด, ์ฃผ์š” ์ƒํƒœ(๋ฐ์ดํ„ฐ)์™€ ํ•จ๊ป˜ ๋กœ๋”ฉ ์ƒํƒœ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๋ณด์กฐ ์ƒํƒœ, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ๋‚ด์— ํ†ตํ•ฉํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. [1, 6] +* **์ƒ์†์„ ๋„˜์–ด์„  ํ•ฉ์„ฑ(Composition over Inheritance)**: ๊ณผ๊ฑฐ ๊ฐ์ฒด์ง€ํ–ฅ์  ์ ‘๊ทผ์ด๋‚˜ Mixin์„ ํ†ตํ•œ ์ฝ”๋“œ ๊ณต์œ ๋Š” ์†์„ฑ ์ถฉ๋Œ๊ณผ ์ถœ์ฒ˜๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ•œ ๋ฐ์ดํ„ฐ ๋ฌธ์ œ๋ฅผ ๋‚ณ์•˜์Šต๋‹ˆ๋‹ค. Composables๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋œ ๋ฐ˜์‘ํ˜• ์ฐธ์กฐ(refs)์™€ ํ•จ์ˆ˜๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ์˜์กด์„ฑ ๊ด€๊ณ„๊ฐ€ ํˆฌ๋ช…ํ•˜๊ณ  ์•ˆ์ „ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜์˜ ๋…ผ๋ฆฌ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. [3, 4] +* **์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„์™€ ๊ฒฐํ•ฉ**: ๋” ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ž‘์€ Composable ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ค‘์ฒฉ(nesting)ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [7] ์ด๋ ‡๊ฒŒ ์ถ”์ถœ๋œ Composables๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋ณต์žกํ•œ ์ธ์ฆ ํ๋ฆ„์ด๋‚˜ ํผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋“ฑ์˜ ์ธํ„ฐ๋ž™์…˜ ๋กœ์ง์„ ์ปดํฌ๋„ŒํŠธ ๋ฐ–์œผ๋กœ ๋นผ๋‚ด์–ด UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [4, 8] +* **ํŒ€ ํ˜‘์—… ๋ฐ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ๊ทน๋Œ€ํ™”**: ๊ฐ Composable์€ `useAuth`, `useCounter`์™€ ๊ฐ™์ด ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด๋Š” ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. [5, 9] ๋˜ํ•œ UI DOM ์š”์†Œ ์ „์ฒด๋ฅผ ๋งˆ์šดํŠธํ•  ํ•„์š” ์—†์ด, ๋ฐ˜์‘ํ˜• ์ƒํƒœ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋‹ด๊ธด Composable ํ•จ์ˆ˜๋งŒ ๊ฐœ๋ณ„์ ์œผ๋กœ ์œ ๋‹› ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์–ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ์˜ค์—ผ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๊ฒฌ๊ณ ํ•จ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [4, 5, 10] + +## โš–๏ธ Trade-offs & Caveats +* **์œ ์—ฐ์„ฑ์œผ๋กœ ์ธํ•œ ์ฝ”๋“œ ํŒŒํŽธํ™” ์œ„ํ—˜**: Composition API์™€ Composables๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋†’์€ ์œ ์—ฐ์„ฑ์€ ์˜คํžˆ๋ ค ์–‘๋‚ ์˜ ๊ฒ€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ์ถ”์ถœํ•˜๊ณ  ๋ช…๋ช…ํ• ์ง€์— ๋Œ€ํ•ด ํŒ€ ๋‚ด์˜ ๋ช…ํ™•ํ•œ ์ฝ”๋”ฉ ํ‘œ์ค€(naming conventions, ํŒŒ์ผ ๊ตฌ์กฐ ๋“ฑ)์ด ํ™•๋ฆฝ๋˜์ง€ ์•Š์œผ๋ฉด, ์ผ๊ด€์„ฑ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ์–‘์‚ฐ๋˜์–ด ์žฅ๊ธฐ์ ์ธ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [5, 9, 11] +* **๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ **: ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ Vue์— ์ฒ˜์Œ ์ž…๋ฌธํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ง๊ด€์ ์ด๊ณ  ์„ ์–ธ์ ์ธ Options API์— ๋น„ํ•ด, ์ƒํƒœ์™€ ๋ฐ˜์‘์„ฑ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์กฐ๋ฆฝํ•ด์•ผ ํ•˜๋Š” Composables ํŒจํ„ด์ด ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. [12-14] +* **๋ฐ˜์‘์„ฑ(Reactivity) ์†์‹ค ์ฃผ์˜**: ์›์‹œ ๊ฐ’๊ณผ ๊ฐ์ฒด์˜ ๋ฐ˜์‘์„ฑ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹(`ref` vs `reactive`)์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น(destructuring)์„ ์˜ค์šฉํ•  ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ์™€์˜ ๋ฐ˜์‘์„ฑ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋Š” ํ”ํ•œ ํ•จ์ •(pitfall)์— ๋น ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [15] + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Composition API]] + - ์—ฐ๊ฒฐ ์ด์œ : Composables๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ Vue 3์˜ ํ•ต์‹ฌ API์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋…ผ๋ฆฌ๋ฅผ ์ปดํฌ๋„ŒํŠธ ์˜ต์…˜(data, methods ๋“ฑ)์ด ์•„๋‹Œ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ฌถ์–ด๋‚ด๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๋ฐ˜์‘์„ฑ ๊ธฐ์ดˆ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [16, 17] +- [[Custom Hooks]] + - ์—ฐ๊ฒฐ ์ด์œ : React ์ง„์˜์—์„œ ์ƒํƒœ ๊ธฐ๋ฐ˜ ๋กœ์ง์„ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š”, Composables์™€ ์ง์ ‘์ ์œผ๋กœ ๋Œ€์‘๋˜๋Š” ์„ค๊ณ„ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•จ์ˆ˜ ํ•ฉ์„ฑ์„ ํ†ตํ•œ ๋กœ์ง ์žฌ์‚ฌ์šฉ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ดํ•ดํ•˜๊ณ , ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„์˜ ํ˜ธ์ถœ ์ œ์•ฝ(Hook์˜ ๊ทœ์น™ ๋“ฑ) ์ฐจ์ด๋ฅผ ์‹ฌ์ธต์ ์œผ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [5, 18] + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Mixins]] + - ์—ฐ๊ฒฐ ์ด์œ : Vue 2์—์„œ ๋„๋ฆฌ ์“ฐ์ด๋˜ ๋กœ์ง ์žฌ์‚ฌ์šฉ ํŒจํ„ด์ด์ž, Composables๊ฐ€ ๊ทน๋ณตํ•˜๊ณ ์ž ํ•œ ํ•ต์‹ฌ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ด๋ฆ„ ์ถฉ๋Œ(Naming collision)๊ณผ ์•”์‹œ์  ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜ ๋ฌธ์ œ ๋“ฑ ๊ตฌํ˜• ํŒจํ„ด์˜ ํ•œ๊ณ„๋ฅผ ์ธ์ง€ํ•จ์œผ๋กœ์จ Composables ๋„์ž…์˜ ๋‹น์œ„์„ฑ์„ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [3, 4] +- [[Smart vs Dumb Components]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ ˆ์ž„์›Œํฌ ์ „๋ฐ˜์˜ UI ์„ค๊ณ„ ํŒจํ„ด์œผ๋กœ, Composables์™€ ์‹œ๋„ˆ์ง€๋ฅผ ๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐํ™” ์ „๋žต์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ(Smart)๋ฅผ Composables๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ์˜ค์ง ๋ Œ๋”๋ง์—๋งŒ ์ง‘์ค‘ํ•˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ”„๋ฆฌ์  ํ…Œ์ด์…”๋„ ์ปดํฌ๋„ŒํŠธ(Dumb)๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [19] + +### Deeper Research Questions +- Vue 3์˜ Composables๋Š” React์˜ Custom Hooks์™€ ๋น„๊ตํ•˜์—ฌ, ๋ผ์ดํ”„์‚ฌ์ดํด ์ฒ˜๋ฆฌ ๋ฐ ๋ฐ˜์‘์„ฑ ์ถ”์ (Dependency Tracking) ๋ฉ”์ปค๋‹ˆ์ฆ˜์—์„œ ์–ด๋– ํ•œ ๊ทผ๋ณธ์  ์ฐจ์ด์™€ ์ด์ ์„ ๊ฐ€์ง€๋Š”๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค์ˆ˜์˜ Composables์™€ ์ค‘์•™ ์ง‘์ค‘์‹ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Pinia ๋“ฑ)๋ฅผ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์—์„œ ์–ด๋–ป๊ฒŒ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๊ณ  ์กฐํ™”๋กญ๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ํ™˜๊ฒฝ์—์„œ Composables๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๊ต์ฐจ ์š”์ฒญ ์ƒํƒœ ์˜ค์—ผ(Cross-Request State Pollution) ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ์ง€์นจ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์—ฌ๋Ÿฌ ๊ฐœ์˜ Composables๋ฅผ ๊นŠ๊ฒŒ ์ค‘์ฒฉ(Nesting)ํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ณต์žก์„ฑ์ด๋‚˜ ์„ฑ๋Šฅ ํ•œ๊ณ„๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋ฒ” ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- Composables๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ถ€์ˆ˜ ํšจ๊ณผ(Side effects)๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด Vue 3.5์—์„œ ๋„์ž…๋œ `onWatcherCleanup`๊ณผ ๊ฐ™์€ API๋ฅผ ์‹ค๋ฌด์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ๊ฒƒ์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๊ธฐ๋Šฅ, ๋‹ค๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ ์ง„ํ–‰ ์ƒํƒœ ์ถ”์ , API ๋ฐ์ดํ„ฐ ํŽ˜์นญ(๋กœ๋”ฉ, ์—๋Ÿฌ, ์‘๋‹ต ์ƒํƒœ ํ†ตํ•ฉ)๊ณผ ๊ฐ™์ด ๋ณต์žกํ•œ UI ์ƒํ˜ธ์ž‘์šฉ ๋ฐ ์ƒํƒœ ๋ณ€ํ™” ๋กœ์ง์„ ๊ฐœ๋ณ„ ํ•จ์ˆ˜๋กœ ์บก์Аํ™”ํ•˜์—ฌ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. [7, 8] +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ์ง์ด ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์— ๋ถ„์‚ฐ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ , '๊ธฐ๋Šฅ์  ์ฝ”์–ด' ์—ญํ• ์„ ํ•˜๋Š” ๋…๋ฆฝ๋œ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•จ์œผ๋กœ์จ ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ๋‚˜ ๋ชจ๋…ธ๋ ˆํฌ ์•„ํ‚คํ…์ฒ˜ ํ™•์žฅ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. [4, 20] +- **Operation / Maintenance:** ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ ํŒจ์น˜๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํƒ์ƒ‰ํ•  ํ•„์š” ์—†์ด ํ•ด๋‹น ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ๋‹จ์ผ Composable๋งŒ ์ˆ˜์ •ํ•˜์—ฌ ์ฆ‰๊ฐ์ ์ธ ์ „์—ญ ์—…๋ฐ์ดํŠธ ํšจ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. [5, 21] +- **Learning Path:** Vue์˜ ๊ธฐ๋ณธ Reactivity(`ref`, `reactive`, `computed` ๋“ฑ)๋ฅผ ์ดํ•ดํ•œ ํ›„, ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”๋ฅผ ์œ„ํ•ด ํ•™์Šตํ•ด์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ํŒจํ„ด์ด๋ฉฐ, ์ดํ›„ ๋Œ€๊ทœ๋ชจ ์ƒํƒœ ๊ด€๋ฆฌ(Pinia)๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•œ ์ง•๊ฒ€๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. [2, 22] +- **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , UI ํ‘œํ˜„ ๊ณ„์ธต๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ณ„์ธต์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ ํŒ€ ๋‹จ์œ„ ํ˜‘์—… ์‹œ ์ถฉ๋Œ ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰๊ฐ์ ์œผ๋กœ ๋„์ž…ํ•ด์•ผ ํ•  ํŒจํ„ด์ž…๋‹ˆ๋‹ค. [23, 24] + +### Adjacent Topics +- [[Pinia]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Composables๋ฅผ ํ†ตํ•ด ๊ฐœ๋ณ„ ์ƒํƒœ ๋กœ์ง์„ ์บก์Аํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ๊ณต์œ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ๋ฅผ ํƒ€์ž… ์•ˆ์ „ํ•˜๊ณ  ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [25, 26] +- [[TypeScript Generics]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋”์šฑ ๊ณ ๋„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด, Composables๊ฐ€ ๋‹ค๋ฃจ๋Š” ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ๋™์ ์œผ๋กœ ์ถ”๋ก ํ•˜๊ณ  ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๋„ค๋ฆญ์„ ์ ‘๋ชฉํ•˜๋Š” ๊ณ ๊ธ‰ ํƒ€์ž… ์„ค๊ณ„ ๊ธฐ๋ฒ•์„ ์—ฐ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [27-29] + +--- +*Last updated: 2026-05-03* \ No newline at end of file diff --git a/01_Archive/2026-05-03/Composition API.md b/01_Archive/2026-05-03/Composition API.md new file mode 100644 index 00000000..04c6db25 --- /dev/null +++ b/01_Archive/2026-05-03/Composition API.md @@ -0,0 +1,61 @@ +# [[Composition API]] + +## ๐Ÿ“Œ Brief Summary +Vue 3 Composition API๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์˜ต์…˜(`data`, `methods`, `computed` ๋“ฑ)์ด ์•„๋‹Œ '๋…ผ๋ฆฌ์  ๊ด€์‹ฌ์‚ฌ(Logical concerns)'๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์กฐ์งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด๋‹ค [1]. ๋ฐ˜์‘ํ˜• ์›์‹œ ํƒ€์ž…(`ref`, `reactive`)๊ณผ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒํƒœ์™€ ๋กœ์ง์„ ์บก์Аํ™”ํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“ ๋‹ค [1]. ๊ธฐ์กด์˜ Options API์— ๋น„ํ•ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ํ™•์žฅ์„ฑ, ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ, ๊ทธ๋ฆฌ๊ณ  TypeScript์™€์˜ ๋›ฐ์–ด๋‚œ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค [2-4]. + +## ๐Ÿ“– Core Content +* **๋ฐ˜์‘ํ˜• ์ƒํƒœ ๊ด€๋ฆฌ (Reactive State Management)**: `ref()`์™€ `reactive()` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ˜์‘ํ˜• ์ƒํƒœ๋ฅผ ์„ ์–ธํ•œ๋‹ค. `ref()`๋Š” ์›์‹œ ๊ฐ’๊ณผ ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋ฉฐ `.value` ์†์„ฑ์„ ํ†ตํ•ด ์ ‘๊ทผํ•˜๊ณ , `reactive()`๋Š” ์ฃผ๋กœ ๋ณต์žกํ•œ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ๋‹ค [5, 6]. ๋‚ด์žฌ๋œ ํ•œ๊ณ„๋กœ ์ธํ•ด ์œ ์—ฐ์„ฑ์„ ๊ฐ–์ถ˜ `ref()`๋ฅผ ๋ฐ˜์‘ํ˜• ์ƒํƒœ ์„ ์–ธ์˜ ์ฃผ์š” API๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข…์ข… ๊ถŒ์žฅ๋œ๋‹ค [6]. +* **์ปดํฌ์ €๋ธ” (Composables)**: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ๊ธฐ๋ฐ˜ ๋กœ์ง์„ ์บก์Аํ™”ํ•œ ํ•จ์ˆ˜๋กœ, Composition API ์žฌ์‚ฌ์šฉ์„ฑ์˜ ์ดˆ์„์ด๋‹ค [7, 8]. ๊ณผ๊ฑฐ Vue 2์˜ Mixins ํŒจํ„ด์ด ์ดˆ๋ž˜ํ•˜๋˜ ๋„ค์ด๋ฐ ์ถฉ๋Œ์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ•ด์ง€๋Š” ๋ฌธ์ œ๋ฅผ '์ƒ์† ๋Œ€์‹  ํ•ฉ์„ฑ(Composition over Inheritance)'์ด๋ผ๋Š” ์ ‘๊ทผ๋ฒ•์„ ํ†ตํ•ด ํˆฌ๋ช…ํ•˜๊ณ  ํƒ€์ž… ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•œ๋‹ค [9]. +* **๋…ผ๋ฆฌ์  ๊ด€์‹ฌ์‚ฌ ๊ทธ๋ฃนํ™”**: ๊ธฐ์กด Options API์—์„œ๋Š” ๋‹จ์ผ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋กœ์ง์ด `data`, `methods`, `computed` ๊ณณ๊ณณ์— ํฉ์–ด์ ธ ์žˆ์—ˆ์œผ๋‚˜, Composition API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ด€๋ จ๋œ ๋ชจ๋“  ๋กœ์ง์„ ํ•œ ๊ณณ์— ๋ฐ€์ง‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด ๊ฐ€๋…์„ฑ๊ณผ ์ถ”์ ์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค [10, 11]. +* **`