# [[Layered Architecture]] ## ๐Ÿ“Œ Brief Summary Layered Architecture(๋˜๋Š” N-Tier Architecture)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐ์ดํ„ฐ ๊ณ„์ธต(Data Layer), ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต(Business Layer), ํ‘œํ˜„/UI ๊ณ„์ธต(Presentation/UI Layer) ๋“ฑ ๋ช…ํ™•ํ•œ ์—ญํ• ๊ณผ ์ฑ…์ž„์— ๋”ฐ๋ผ ์ˆ˜์ง์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ํŒจํ„ด์ด๋‹ค [1, 2]. ์ด ํŒจํ„ด์€ MVC(Model-View-Controller)์™€ ๊ฐ™์ด ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๋ชจ๋ธ/๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ์—ญํ• ์„ ๋‚˜๋ˆ„์–ด ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ์ดˆ์ ์ธ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค [3, 4]. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ณ„์ธต ๊ฐ„์˜ ์˜์กด์„ฑ์ด ์–ฝํžˆ๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด, ์ตœ๊ทผ์—๋Š” ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๋‚˜ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ๋ชจ๋“ˆ ๊ตฌ์กฐ๋กœ ์ง„ํ™”ํ•˜๋Š” ์ถ”์„ธ์— ์žˆ๋‹ค [1, 4]. ## ๐Ÿ“– Core Content * **๊ณ„์ธต๋ณ„ ์ฑ…์ž„์˜ ๋ถ„๋ฆฌ (Separation of Concerns):** ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ๋…๋ฆฝ์ ์ธ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค. ์ƒํ˜ธ์ž‘์šฉ(UI/ํ‘œํ˜„) ๊ณ„์ธต์€ HTTP ์š”์ฒญ์ด๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ˆ˜์‹ ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์œ ์ฆˆ์ผ€์ด์Šค) ๊ณ„์ธต์€ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•œ๋‹ค [5, 6]. ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ์‹ค๋ฌด ์ ์šฉ์„ ๋ณด๋ฉด, Django์—์„œ๋Š” HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์–‡์€ ๋ทฐ(Thin Views)์™€ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ณด์œ ํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ธต(Service Layer), ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์™€ ๊ด€๋ จ๋œ ๋šฑ๋šฑํ•œ ๋ชจ๋ธ(Fat Models) ๋“ฑ์œผ๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ์“ฐ์ธ๋‹ค [7, 8]. * **DTO (Data Transfer Object)๋ฅผ ํ†ตํ•œ ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ:** ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” UI/์ธํ”„๋ผ ๊ณ„์ธต๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด DTO๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค [9, 10]. DTO๋Š” ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์— ์œ„์น˜ํ•˜๋ฉฐ, ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ด๋‚˜ ์ง๋ ฌํ™”(Serialization) ๋กœ์ง์œผ๋กœ๋ถ€ํ„ฐ ์บก์Аํ™”ํ•˜๊ณ  ๋ณดํ˜ธํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค [11, 12]. * **ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ (Cross-Cutting Concerns)์˜ ์ ์šฉ:** ๋กœ๊น…, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ๋ณด์•ˆ ๋“ฑ ์—ฌ๋Ÿฌ ๊ณ„์ธต(Data, Business, UI)์— ๊ฑธ์ณ ๊ณตํ†ต์œผ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ผ๊ณ  ํ•œ๋‹ค [2]. ๊ณ„์ธตํ˜• ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์ด ๊ฐ ๊ณ„์ธต๋งˆ๋‹ค ์ค‘๋ณต ์ž‘์„ฑ(DRY ์›์น™ ์œ„๋ฐฐ)๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด, AOP(๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋‚˜ ์ธํ„ฐ์…‰ํ„ฐ, ๋ฒ ์ด์Šค ํด๋ž˜์Šค(Base Class) ๋“ฑ์„ ํ†ตํ•ด ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๋ ˆ๋ฒจ์—์„œ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค [13-15]. ## โš–๏ธ Trade-offs & Caveats * **์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์Šค์ผ€์ผ๋ง์˜ ํ•œ๊ณ„ (๊ณ„์ธต๋ณ„ ํด๋” ๊ตฌ์กฐ์˜ ๋ฌธ์ œ):** NestJS์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ „ํ†ต์ ์ธ ๊ณ„์ธตํ˜• ํด๋” ๊ตฌ์กฐ(์˜ˆ: ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ•œ ํด๋”์—, ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ๋‹ค๋ฅธ ํด๋”์— ๋ชจ์œผ๋Š” ๋ฐฉ์‹)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ทน๋„๋กœ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค [4]. '์‚ฌ์šฉ์ž(Users)' ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ๊ด€์„ฑ ์—†๋Š” ์—ฌ๋Ÿฌ ๊ณ„์ธต์˜ ํด๋”๋ฅผ ๋„˜๋‚˜๋“ค์–ด์•ผ ํ•˜๋ฉฐ, ๊ณ„์ธต์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ์ข…์†์„ฑ์ด ๋ณด์ด์ง€ ์•Š๊ฒŒ ๊ฒฐํ•ฉ๋  ์œ„ํ—˜์ด ํฌ๋‹ค [4]. ๋”ฐ๋ผ์„œ ๊ทœ๋ชจ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ณ„์ธตํ˜• ํด๋” ๊ตฌ์กฐ๋ฅผ ํ”ผํ•˜๊ณ , ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based)์˜ ๋ชจ๋“ˆ ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [4]. * **์ˆ˜์ง์  ์ข…์†์„ฑ(Hierarchical Structure)์˜ ์œ„ํ—˜:** ์ „ํ†ต์ ์ธ N-Tier ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์™ธ๋ถ€ ์ธํ”„๋ผ๊ฐ€ ๊ฐ€์žฅ ํ•˜๋‹จ์— ์œ„์น˜ํ•˜๋Š” ์ˆ˜์ง์  ๊ตฌ์กฐ๋ฅผ ์•”์‹œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค [1]. ์ด๋กœ ์ธํ•ด ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(๋„๋ฉ”์ธ)์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ์ˆ ์— ์ข…์†๋˜๋Š” ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค [1, 16]. ์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)์„ ํ™œ์šฉํ•˜์—ฌ ๋„๋ฉ”์ธ์„ ๋ณดํ˜ธํ•˜๋Š” ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋Œ€์•ˆ์œผ๋กœ ์ œ์‹œ๋œ๋‹ค [17]. * **๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ์˜ ์ฆ๊ฐ€:** ๊ณ„์ธต์„ ์—„๊ฒฉํ•˜๊ฒŒ ๋‚˜๋ˆŒ ๊ฒฝ์šฐ, ๊ฐ ๊ณ„์ธต์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋‚˜๋“ค ๋•Œ๋งˆ๋‹ค DTO์™€ ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ๊ฐ„์˜ ๋งคํ•‘(Mapping) ์ฝ”๋“œ๋ฅผ ์˜๋ฌด์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค [18, 19]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] - [[Hexagonal Architecture]] - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜์ง์ ์ธ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜(N-Tier)๊ฐ€ ๊ฐ€์ง€๋Š” 'ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์™ธ๋ถ€ ์ธํ”„๋ผ์— ์ข…์†๋˜๋Š” ๋ฌธ์ œ'๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด๋‹ค [1, 16]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํฌํŠธ(Ports)์™€ ์–ด๋Œ‘ํ„ฐ(Adapters)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์˜ ๋ฐฉํ–ฅ์„ ๋‚ด๋ถ€๋กœ ํ–ฅํ•˜๊ฒŒ ํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ณดํ˜ธํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [17, 20]. - [[Clean Architecture]] - ์—ฐ๊ฒฐ ์ด์œ : ๊ณ„์ธตํ˜• ๊ตฌ์กฐ์—์„œ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ, ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ UI์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ์•„ํ‚คํ…์ฒ˜ ์ฒ ํ•™์ด๋‹ค [16, 21]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-Cutting Concerns)๋ฅผ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ชจ๋“ˆํ™”๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ์„ค๊ณ„ ๊ธฐ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค [21, 22]. #### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] - [[DTO (Data Transfer Object)]] - ์—ฐ๊ฒฐ ์ด์œ : ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๋ณดํ˜ธํ•˜๊ณ  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ๊ฐ์ฒด ํŒจํ„ด์ด๋‹ค [9, 10]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต๊ณผ ์ƒํ˜ธ์ž‘์šฉ(UI)/์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต ์‚ฌ์ด์—์„œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์ฆ ๋ฐ ๋ณ€ํ™˜ ๋กœ์ง์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค [5, 11]. - [[Cross-Cutting Concerns]] - ์—ฐ๊ฒฐ ์ด์œ : ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์˜ ์—ฌ๋Ÿฌ ๊ณ„์ธต์„ ์ˆ˜์ง์œผ๋กœ ๊ด€ํ†ตํ•˜๋ฉฐ ๋ฐœ์ƒํ•˜๋Š” ๋กœ๊น…, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ์ธ์ฆ ๋“ฑ์˜ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ์ด๋‹ค [2, 23]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณ„์ธต ๊ฐ„์˜ ์ฝ”๋“œ ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด AOP, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [13, 24]. ### Deeper Research Questions - ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜(Layered Architecture)์™€ ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜(Hexagonal Architecture)์˜ ์˜์กด์„ฑ ํ๋ฆ„(Dependency Flow)์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋ฉฐ, ์ด๊ฒƒ์ด ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? - NestJS ํ”„๋กœ์ ํŠธ์—์„œ MVC ํ˜•ํƒœ์˜ ์ „ํ†ต์ ์ธ ๊ณ„์ธตํ˜• ํด๋” ๊ตฌ์กฐ๊ฐ€ ๊ฐ€์ง„ ํ•œ๊ณ„๋ฅผ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ๋ชจ๋“ˆ ํด๋” ๊ตฌ์กฐ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? - Django ํ™˜๊ฒฝ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌ์„ฑํ•  ๋•Œ 'Fat Models, Thin Views' ํŒจํ„ด๊ณผ 'Service Layer' ํŒจํ„ด์€ ๊ฐ๊ฐ ์–ด๋– ํ•œ ์žฅ๋‹จ์ (Trade-off)์„ ๊ฐ€์ง€๋Š”๊ฐ€? - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต๊ณผ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด DTO๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋งคํ•‘(Mapping) ์ฝ”๋“œ๋กœ ์ธํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์„ค๊ณ„ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-Cutting Concerns)๋ฅผ ๋‹ค์ˆ˜์˜ ๊ณ„์ธต์— ์ ์šฉํ•  ๋•Œ, ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™(SRP, DRY)์„ ์œ„๋ฐฐํ•˜์ง€ ์•Š๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์—๋Ÿฌ ํ•ธ๋“ค๋ง๊ณผ ๋กœ๊น…์„ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? ### Practical Application Contexts - **Implementation:** Django์™€ ๊ฐ™์€ ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ ๊ตฌํ˜„ ์‹œ ๋ทฐ(View)๋Š” ์–‡๊ฒŒ ์œ ์ง€ํ•˜์—ฌ HTTP ์š”์ฒญ ์–ด๋Œ‘ํ„ฐ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ๋ณ„๋„์˜ ์„œ๋น„์Šค(Service) ๊ณ„์ธต์—, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋Š” ๋ชจ๋ธ์— ์œ„์ž„ํ•˜๋„๋ก ๊ณ„์ธต์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค [8, 25]. - **System Design:** ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ ๊ธฐ๋Šฅ๋ณ„๋กœ ํ‹ฐ์–ด(Tier)๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ฐ ๋ถ€๋ถ„์˜ ์—ญํ• ๊ณผ ์ฑ…์ž„ ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ๊ทœ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [2]. - **Operation / Maintenance:** ์ดˆ๊ธฐ์—๋Š” ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ•ด ๋ณด์ด๋‚˜ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๊ณ„์ธต๋ณ„ ๋ถ„๋ฆฌ๊ฐ€ ์ˆ˜์ • ์ž‘์—…์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ์œ ์ง€๋ณด์ˆ˜ ์‹œ ๊ด€๋ จ ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ ๊ณ„์ธต์— ํฉ์–ด์ง€๋Š” ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์šด์˜ ๋‹จ๊ณ„์—์„œ ๊ธฐ๋Šฅ ๋‹จ์œ„ ๋ชจ๋“ˆํ™”(Feature-based)๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ทผ๊ฑฐ๊ฐ€ ๋œ๋‹ค [4]. - **Learning Path:** ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜ ํ•™์Šต ์‹œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” MVC ํŒจํ„ด๊ณผ ์—ญํ•  ๊ธฐ๋ฐ˜ ๊ณ„์ธต ๋ถ„๋ฆฌ๋ฅผ ๋จผ์ € ์ดํ•ดํ•œ ๋’ค, ์ด๋ฅผ ๊ฐœ์„ ํ•œ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋‚˜ ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๊ธฐ์ดˆ ์ง€์‹์œผ๋กœ ํ™œ์šฉ๋œ๋‹ค [1, 16]. - **My Project Relevance:** NestJS๋‚˜ Spring Boot ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ, ํด๋” ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ๊ฐˆ์ง€, ์ธํ„ฐํŽ˜์ด์Šค(Controller)์™€ ๋น„์ฆˆ๋‹ˆ์Šค ํ•ต์‹ฌ ๋กœ์ง(Service), ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ์ ‘๊ทผ(Repository)์„ ์–ด๋–ป๊ฒŒ ๊ฒฉ๋ฆฌํ• ์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ๋กœ ์ž‘๋™ํ•œ๋‹ค [19, 26, 27]. ### Adjacent Topics - [[Dependency Injection (DI)]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ณ„์ธตํ˜• ๊ตฌ์กฐ์—์„œ ์ƒ์œ„ ๊ณ„์ธต์ด ํ•˜์œ„ ๊ณ„์ธต์— ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ์„ ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ์— ์œ„์ž„ํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ์ด ํ•„์š”ํ•˜๋‹ค. - [[Active Record Pattern vs Repository Pattern]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต(Data Access Layer)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์กฐ์ž‘ํ•  ๋•Œ, ๋„๋ฉ”์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งคํ•‘ ๋กœ์ง์„ ํ•ฉ์น  ๊ฒƒ์ธ๊ฐ€ ๋ถ„๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ORM ์„ค๊ณ„ ํŒจํ„ด ํƒ๊ตฌ๋กœ ์ด์–ด์ง„๋‹ค. --- *Last updated: 2026-05-03*