{"id":5302,"date":"2025-12-24T09:26:00","date_gmt":"2025-12-24T00:26:00","guid":{"rendered":"https:\/\/secondlife.lol\/?p=5302"},"modified":"2025-12-24T17:13:52","modified_gmt":"2025-12-24T08:13:52","slug":"django-component-diagram-architecture","status":"publish","type":"post","link":"https:\/\/secondlife.lol\/en\/django-component-diagram-architecture\/","title":{"rendered":"Django \uc544\ud0a4\ud14d\ucc98 3\ubd80: Component Diagram\uc73c\ub85c \ub808\uc774\uc5b4 \uad6c\uc870 \uc815\ub9ac\ud558\uae30"},"content":{"rendered":"<style>.kb-image5302_69051c-eb .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5302_69051c-eb\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"335\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-56-600x335.jpg\" alt=\"Component Diagram image\" class=\"kb-img wp-image-5313\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-56-600x335.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-56-300x168.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-56-768x429.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-56-18x10.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-56.jpg 1024w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubc88\uc5d0\ub294 Component Diagram\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\ub824\uace0 \ud558\ub294\ub370\uc694. \uc774\ubbf8 <a href=\"https:\/\/secondlife.lol\/django-system-context-diagram\/\">1<\/a>\u00b7<a href=\"https:\/\/secondlife.lol\/django-container-diagram-architecture\/\">2<\/a>\ubd80\uc5d0\uc11c \uc6b0\ub9ac\ub294<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc2dc\uc2a4\ud15c \ucee8\ud14d\uc2a4\ud2b8 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc73c\ub85c \u201c\uc2dc\uc2a4\ud15c vs \uc678\ubd80 \uc138\uacc4\u201d<\/li>\n\n\n\n<li>\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc73c\ub85c \u201c\uc2dc\uc2a4\ud15c \uc548\uc758 \ud070 \uc0c1\uc790\ub4e4(Django, DB, Worker \u2026)\u201d<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uae4c\uc9c0 \ubd24\uc8e0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc81c \ud55c \ub2e8\uacc4 \ub354 \ub0b4\ub824\uc640\uc11c,<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cDjango Web App \uc548\uc5d0\uc11c\ub294 <strong>\uc5b4\ub5a4 \ub808\uc774\uc5b4\ub4e4\uc774<\/strong><br>\uc11c\ub85c \uc5b4\ub5bb\uac8c \ud638\ucd9c\ub418\ub294\uac00?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\ub97c \uc815\ub9ac\ud558\ub294 \uac83\uc774 \ucef4\ud3ec\ub10c\ud2b8 \ub2e4\uc774\uc5b4\uadf8\ub7a8(Component Diagram)\uc785\ub2c8\ub2e4.<br><a href=\"https:\/\/c4model.com\/\" target=\"_blank\" rel=\"noopener\">C4 \ubaa8\ub378<\/a>\ub85c \uce58\uba74 <strong>Level 3 (Component)<\/strong> \uc5d0 \ud574\ub2f9\ud574\uc694.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc9c0\uae08 \uc55e\uc73c\ub85c \ud568\uaed8 \ubcf4\ub824\ub294 <code>component.png<\/code> \ub3c4 \uc774\ub7f0 \uad6c\uc870\uc77c \uac70\uc608\uc694.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Views \/ URLs<\/strong> \u2013 HTTP \uc694\uccad\uc744 \ubc1b\ub294 Django View \ub808\uc774\uc5b4<\/li>\n\n\n\n<li><strong>Services<\/strong> \u2013 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1 \ubaa8\ub4c8 (Python \uc11c\ube44\uc2a4 \ub808\uc774\uc5b4)<\/li>\n\n\n\n<li><strong>Background Tasks<\/strong> \u2013 Celery \ube44\ub3d9\uae30 \uc791\uc5c5<\/li>\n\n\n\n<li><strong>Models \/ Repositories<\/strong> \u2013 Django ORM \ubaa8\ub378 \uacc4\uce35<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 4\uac1c\uc758 \ub808\uc774\uc5b4 \uad00\uacc4\ub97c \uae54\ub054\ud558\uac8c \uadf8\ub824\ub450\uba74,<br>\uc0c8\ub85c\uc6b4 \uae30\ub2a5\uc744 \ucd94\uac00\ud560 \ub54c \u201c\uc5b4\ub514\uc5d0 \ucf54\ub4dc\ub97c \ub123\uc5b4\uc57c \ud558\uc9c0?\u201d\ub97c \uacb0\uc815\ud558\uae30\uac00 \ud6e8\uc52c \ud3b8\ud574\uc9d1\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5302_67b43f-7a, .wp-block-kadence-advancedheading.kt-adv-heading5302_67b43f-7a[data-kb-block=\"kb-adv-heading5302_67b43f-7a\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5302_67b43f-7a mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5302_67b43f-7a[data-kb-block=\"kb-adv-heading5302_67b43f-7a\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading5302_67b43f-7a img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5302_67b43f-7a[data-kb-block=\"kb-adv-heading5302_67b43f-7a\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5302_67b43f-7a wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5302_67b43f-7a\">\uc608\uc2dc \uad6c\uc870: \uc124\ubb38\u00b7\uba74\ub2f4 <a href=\"https:\/\/www.djangoproject.com\/\" target=\"_blank\" rel=\"noopener\">Django<\/a> Component Diagram<\/h2>\n\n\n<style>.kb-image5302_0465c9-f7 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5302_0465c9-f7\"><figure class=\"aligncenter size-medium\"><img decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-57-300x300.jpg\" alt=\"Django Component Diagram image\" class=\"kb-img wp-image-5314\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-57-300x300.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-57-600x600.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-57-150x150.jpg 150w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-57-768x768.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-57-12x12.jpg 12w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-57.jpg 1024w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\uc124\ubb38\u00b7\uba74\ub2f4 \ud1b5\ud569\uad00\ub9ac \uc2dc\uc2a4\ud15c\uc744 \uc608\ub85c \ub4e4\uba74,<br>\ucef4\ud3ec\ub10c\ud2b8 \ub2e4\uc774\uc5b4\uadf8\ub7a8 \uc548\uc5d0\ub294 \ub300\ub7b5 \uc774\ub7f0 \uc694\uc18c\uac00 \ub4e4\uc5b4\uac11\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Views \/ URLs<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc124\ubb38 \ubaa9\ub85d\/\uc0dd\uc131 View<\/li>\n\n\n\n<li>\uba74\ub2f4 \uc77c\uc815\/\uae30\ub85d View<\/li>\n\n\n\n<li>\ub300\uc2dc\ubcf4\ub4dc View(API \ud3ec\ud568)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Services<\/strong>\n<ul class=\"wp-block-list\">\n<li><code>survey_service<\/code> \u2013 \uc124\ubb38 \uc0dd\uc131\u00b7\ubcf5\uc0ac\u00b7\ubc30\ud3ec \ub85c\uc9c1<\/li>\n\n\n\n<li><code>interview_service<\/code> \u2013 \uc778\ud130\ubdf0 \ucee4\ubc84 \uc0dd\uc131, \uc790\ub3d9 \uc800\uc7a5, \uac80\ud1a0 \uc644\ub8cc \ucc98\ub9ac<\/li>\n\n\n\n<li><code>report_service<\/code> \u2013 \ud1b5\uacc4 \uc9d1\uacc4, \ub9ac\ud3ec\ud2b8 \uc0dd\uc131 \ub85c\uc9c1<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Background Tasks (Celery)<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc751\ub2f5 \uc644\ub8cc \uc2dc \uc774\uba54\uc77c \uc54c\ub9bc \ubc1c\uc1a1<\/li>\n\n\n\n<li>\ub300\ub7c9 \ub9ac\ud3ec\ud2b8 \uc0dd\uc131(\uc5d1\uc140, PDF)<\/li>\n\n\n\n<li>\uc57c\uac04 \ubc30\uce58 \ud1b5\uacc4 \uc5c5\ub370\uc774\ud2b8<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Models \/ Repositories<\/strong>\n<ul class=\"wp-block-list\">\n<li><code>Survey<\/code>, <code>SurveyResponse<\/code>, <code>InterviewCover<\/code>, <code>InterviewRecord<\/code><\/li>\n\n\n\n<li>\uc870\uc9c1\/\uc9c1\uae09\/\uc0ac\uc774\ud2b8 \uad00\ub828 \ubaa8\ub378<\/li>\n\n\n\n<li>\ub9ac\ud3ec\ud2b8\/\ub85c\uadf8\/\uc774\ub825 \ubaa8\ub378<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uac78 \u201c\uc2e4\uc81c \ucf54\ub4dc \uad6c\uc870\u201d\uc640 \ud568\uaed8 \ubcf4\uc5ec\uc8fc\ub294 \uc9c0\ub3c4 \uc5ed\ud560\uc774 \ubc14\ub85c Component Diagram\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><code>component.puml<\/code> \uae30\ubcf8 \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>docs\/architecture\/component.puml<\/code> \ud30c\uc77c\uc744 \uc0c8\ub85c \ub9cc\ub4e4\uc5b4 \uc5f4\uace0,<br>\uc544\ub798 \ud15c\ud50c\ub9bf\uc744 \uadf8\ub300\ub85c \ubd99\uc5ec \ub123\uc5b4 \ubcfc\uac8c\uc694.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@startuml\n!define C4P https:\/\/raw.githubusercontent.com\/plantuml-stdlib\/C4-PlantUML\/master\n!includeurl C4P\/C4_Component.puml\n\n' 1) \uc2dc\uc2a4\ud15c \uacbd\uacc4\nContainer_Boundary(django_app, \"Django Web Application\") {\n\n  ' Views \/ URLs \ub808\uc774\uc5b4\n  Component(views, \"Views \/ URLs\", \"Django Views\",\n    \"HTTP \uc694\uccad\uc744 \ubc1b\uace0 \ud3fc \uac80\uc99d, \uc11c\ube44\uc2a4 \ud638\ucd9c, \ud15c\ud50c\ub9bf \ub80c\ub354\ub9c1\uc744 \ub2f4\ub2f9\")\n\n  ' Service \ub808\uc774\uc5b4\n  Component(services, \"Services\", \"Python modules\",\n    \"\uc124\ubb38\u00b7\uba74\ub2f4\u00b7\ub9ac\ud3ec\ud2b8 \ub4f1 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ucea1\uc290\ud654\")\n\n  ' Background Tasks (Celery)\n  Component(background_tasks, \"Background Tasks\", \"Celery tasks\",\n    \"\uc774\uba54\uc77c \ubc1c\uc1a1, \ub9ac\ud3ec\ud2b8 \uc0dd\uc131, \ub300\ub7c9 \ucc98\ub9ac \ub4f1 \ube44\ub3d9\uae30 \uc791\uc5c5\")\n\n  ' Models \/ Repositories\n  ComponentDb(models_repo, \"Models \/ Repositories\", \"Django ORM\",\n    \"Survey, Interview, Response \ub4f1 \ub3c4\uba54\uc778 \ub370\uc774\ud130 \uc601\uc18d\ud654\")\n}\n\n' 2) \uad00\uacc4 \uc124\uc815\nRel(views, services, \"\ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1 \ud638\ucd9c (\uc608: \uc124\ubb38 \uc0dd\uc131, \uba74\ub2f4 \uc800\uc7a5)\")\nRel(services, models_repo, \"ORM\uc744 \ud1b5\ud574 \ub370\uc774\ud130 \uc77d\uae30\/\uc4f0\uae30\")\nRel(services, background_tasks, \"\ube44\ub3d9\uae30 \uc791\uc5c5 enqueue (delay())\")\nRel(background_tasks, models_repo, \"\ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \ub370\uc774\ud130 \uac31\uc2e0\")\n\nSHOW_LEGEND()\n@enduml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ucf54\ub4dc\ub85c \ub80c\ub354\ud558\uba74,<br>\uc9c0\uae08 \uc544\ub798\uc758 \uadf8\ub9bc\uc5d0\uc11c \ubcf4\uace0 \uc788\ub294 <code>component.png<\/code> \uc640 \uac70\uc758 \ub3d9\uc77c\ud55c \uad6c\uc870\uc758<br>Component Diagram\uc744 \uc5bb\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<style>.kb-image5302_4970ec-2a .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5302_4970ec-2a\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"328\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-58-600x328.jpg\" alt=\"Component Diagram image\" class=\"kb-img wp-image-5315\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-58-600x328.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-58-300x164.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-58-768x419.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-58-18x10.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-58.jpg 1024w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\uc2e4\uc81c Django \ud504\ub85c\uc81d\ud2b8\uc640 \ub9e4\ud551\ud558\uae30<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704 \ucef4\ud3ec\ub10c\ud2b8\ub4e4\uc744 <strong>\uc2e4\uc81c \ucf54\ub4dc<\/strong>\uc640 \uc5f0\uacb0\ud574 \ubcfc\uac8c\uc694.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Views \/ URLs<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc704\uce58: \uac01 \uc571\uc758 <code>views.py<\/code>, <code>urls.py<\/code><\/li>\n\n\n\n<li>\uc608:\n<ul class=\"wp-block-list\">\n<li><code>survey\/views.py<\/code> \u2192 \uc124\ubb38 CRUD View<\/li>\n\n\n\n<li><code>interview\/views.py<\/code> \u2192 \uba74\ub2f4 \ucee4\ubc84 \uc800\uc7a5 View (sequence \ub2e4\uc774\uc5b4\uadf8\ub7a8\uacfc \uc5f0\uacb0)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Services<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc704\uce58: <code>services\/<\/code> \ub514\ub809\ud1a0\ub9ac \ub610\ub294 \uac01 \uc571 \ub0b4 <code>services.py<\/code><\/li>\n\n\n\n<li>\uc608:\n<ul class=\"wp-block-list\">\n<li><code>survey\/services.py<\/code> \u2192 \uc124\ubb38 \uc0dd\uc131, \ubcf5\uc0ac, \ubc30\ud3ec \ud568\uc218<\/li>\n\n\n\n<li><code>interview\/services.py<\/code> \u2192 \uc790\ub3d9 \uc800\uc7a5 \uc138\uc158 \ucc98\ub9ac, \uac80\ud1a0 \uc0c1\ud0dc \ubcc0\uacbd<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Background Tasks<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc704\uce58: <code>tasks.py<\/code><\/li>\n\n\n\n<li>\uc608:\n<ul class=\"wp-block-list\">\n<li><code>interview\/tasks.py<\/code> \u2192 \uba74\ub2f4 \uc644\ub8cc \ud6c4 \uc54c\ub9bc \uba54\uc77c \ubc1c\uc1a1<\/li>\n\n\n\n<li><code>dashboard\/tasks.py<\/code> \u2192 \uc57c\uac04 \ubc30\uce58 \ud1b5\uacc4 \uc9d1\uacc4<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Models \/ Repositories<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc704\uce58: \uac01 \uc571\uc758 <code>models.py<\/code><\/li>\n\n\n\n<li>\uc608:\n<ul class=\"wp-block-list\">\n<li><code>Survey<\/code>, <code>SurveyResponse<\/code>, <code>InterviewCover<\/code>, <code>InterviewRecord<\/code> \ub4f1<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\ubb34\uc5d0\uc11c\ub294 <strong>\ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uba3c\uc800 \uadf8\ub824\ub450\uace0<\/strong><br>\u201c\uc6b0\ub9ac \ud504\ub85c\uc81d\ud2b8\ub294 View \u2192 Service \u2192 Model \uad6c\uc870\ub85c \uac04\ub2e4\u201d<br>\ub77c\ub294 \uc6d0\uce59\uc744 \ud300 \ub0b4\uc5d0 \ud569\uc758\uc2dc\ud0a4\ub294 \ub370 \uc4f0\uba74 \uc88b\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Component Diagram \ub80c\ub354\ub9c1\ud558\uae30<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc29\ubc95\uc740 1\u00b72\ubd80\uc5d0 \ud588\ub358 \uac83\uacfc \ub3d9\uc77c\ud558\uac8c \ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">VSCode + PlantUML \ud655\uc7a5 \uc0ac\uc6a9 \uc2dc<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>component.puml<\/code> \uc5f4\uae30<\/li>\n\n\n\n<li>\ubbf8\ub9ac\ubcf4\uae30(Preview) \uc2e4\ud589<\/li>\n\n\n\n<li>\ud544\uc694\ud558\uba74 PNG\ub85c Export \ud6c4 \uc800\uc7a5<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">plantuml.jar \uc0ac\uc6a9 \uc2dc<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>java -jar tools\/plantuml.jar docs\/architecture\/component.puml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2192 <code>docs\/architecture\/component.png<\/code> \uc0dd\uc131<br>\uc0ac\uc6a9\ud558\uace0\uc790 \ud558\ub294 \uacf3\uc758 \u201cComponent Diagram \uc608\uc2dc\u201d \uc139\uc158\uc5d0 \uc0bd\uc785\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\uc2e4\ubb34\uc5d0\uc11c \ucef4\ud3ec\ub10c\ud2b8 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc4f0\ub294 \uc774\uc720<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u201c\uc5b4\ub514\uc5d0 \ucf54\ub4dc\ub97c \ub450\uc9c0?\u201d \uace0\ubbfc \uc904\uc774\uae30<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc0c8 \uae30\ub2a5 \ucd94\uac00\ud560 \ub54c\n<ul class=\"wp-block-list\">\n<li>\ud654\uba74\/\uc694\uccad \ucc98\ub9ac \u2192 View<\/li>\n\n\n\n<li>\uaddc\uce59\/\uacc4\uc0b0\/\uac80\uc99d \u2192 Service<\/li>\n\n\n\n<li>\uc624\ub798 \uac78\ub9ac\ub294 \uc77c \u2192 Background Task<\/li>\n\n\n\n<li>\ub370\uc774\ud130 \uc800\uc7a5 \u2192 Model<br>\uc774\ub77c\ub294 \uacf5\ud1b5 \ub8f0\uc744 \uc2dc\uac01\uc801\uc73c\ub85c \uc124\uc815\ud574 \ub458 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ub9ac\ud329\ud1a0\ub9c1 \ub17c\uc758\uc6a9 \uae30\uc900<\/strong>\n<ul class=\"wp-block-list\">\n<li>Service\uc5d0 \ub85c\uc9c1\uc774 \ub108\ubb34 \ubab0\ub824 \uc788\uc73c\uba74<br>\ucef4\ud3ec\ub10c\ud2b8 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \ubcf4\uba74\uc11c<br>\u201c\uc5ec\uae30 \ubd80\ubd84\uc744 \ubcc4\ub3c4 \uc11c\ube44\uc2a4\/\ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4\ub85c \ubd84\ub9ac\ud558\uc790\u201d \uac19\uc740 \ub17c\uc758\ub97c \ud558\uae30 \uc27d\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\uc2e0\uaddc \ud300\uc6d0 \uc628\ubcf4\ub529 \uc790\ub8cc<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc0c8\ub85c \ub4e4\uc5b4\uc628 \uac1c\ubc1c\uc790\uc5d0\uac8c<br>ERD\ubcf4\ub2e4 \uba3c\uc800 \uc774 Component Diagram\uc744 \ubcf4\uc5ec\uc8fc\uba74<br>\u201c\uc544, \uc774 \ud504\ub85c\uc81d\ud2b8\ub294 \ub808\uc774\uc5b4\uac00 \uc774\ub807\uac8c \ub098\ub258\uc5b4 \uc788\uad6c\ub098\u201d<br>\ub97c \ube68\ub9ac \uc774\ud574\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\uc774\ubc88\uc5d0\ub294 Component Diagram\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\ub824\uace0 \ud558\ub294\ub370\uc694. \uc774\ubbf8 1\u00b72\ubd80\uc5d0\uc11c \uc6b0\ub9ac\ub294 \uae4c\uc9c0&#8230;<\/p>","protected":false},"author":3,"featured_media":5313,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[15],"tags":[941,1014,942,938,1013,1012,1010,936,1007,1011],"class_list":["post-5302","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it-jewel","tag-c4-","tag-django--","tag-django-","tag-plantuml","tag-1013","tag-1012","tag-1010","tag-936","tag-1007","tag-1011"],"taxonomy_info":{"category":[{"value":15,"label":"D \ubcf4\ubb3c\ucc3d\uace0(Jewel)"}],"post_tag":[{"value":941,"label":"C4 \ubaa8\ub378"},{"value":1014,"label":"Django \uc124\ubb38 \uc2dc\uc2a4\ud15c"},{"value":942,"label":"Django \uc544\ud0a4\ud14d\ucc98"},{"value":938,"label":"PlantUML"},{"value":1013,"label":"\ubc31\uadf8\ub77c\uc6b4\ub4dc \uc791\uc5c5"},{"value":1012,"label":"\uc11c\ube44\uc2a4 \ub808\uc774\uc5b4"},{"value":1010,"label":"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc124\uacc4 \ubb38\uc11c"},{"value":936,"label":"\uc2dc\uc2a4\ud15c \ub2e4\uc774\uc5b4\uadf8\ub7a8"},{"value":1007,"label":"\uc6f9 \uc2dc\uc2a4\ud15c \uc124\uacc4"},{"value":1011,"label":"\ucef4\ud3ec\ub10c\ud2b8 \ub2e4\uc774\uc5b4\uadf8\ub7a8"}]},"featured_image_src_large":["https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-56-600x335.jpg",600,335,true],"author_info":{"display_name":"TERE","author_link":"https:\/\/secondlife.lol\/en\/author\/tere\/"},"comment_info":0,"category_info":[{"term_id":15,"name":"D \ubcf4\ubb3c\ucc3d\uace0(Jewel)","slug":"it-jewel","term_group":0,"term_taxonomy_id":15,"taxonomy":"category","description":"","parent":0,"count":57,"filter":"raw","cat_ID":15,"category_count":57,"category_description":"","cat_name":"D \ubcf4\ubb3c\ucc3d\uace0(Jewel)","category_nicename":"it-jewel","category_parent":0}],"tag_info":[{"term_id":941,"name":"C4 \ubaa8\ub378","slug":"c4-%eb%aa%a8%eb%8d%b8","term_group":0,"term_taxonomy_id":941,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":1014,"name":"Django \uc124\ubb38 \uc2dc\uc2a4\ud15c","slug":"django-%ec%84%a4%eb%ac%b8-%ec%8b%9c%ec%8a%a4%ed%85%9c","term_group":0,"term_taxonomy_id":1014,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":942,"name":"Django \uc544\ud0a4\ud14d\ucc98","slug":"django-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98","term_group":0,"term_taxonomy_id":942,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":938,"name":"PlantUML","slug":"plantuml","term_group":0,"term_taxonomy_id":940,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":1013,"name":"\ubc31\uadf8\ub77c\uc6b4\ub4dc \uc791\uc5c5","slug":"%eb%b0%b1%ea%b7%b8%eb%9d%bc%ec%9a%b4%eb%93%9c-%ec%9e%91%ec%97%85","term_group":0,"term_taxonomy_id":1012,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1012,"name":"\uc11c\ube44\uc2a4 \ub808\uc774\uc5b4","slug":"%ec%84%9c%eb%b9%84%ec%8a%a4-%eb%a0%88%ec%9d%b4%ec%96%b4","term_group":0,"term_taxonomy_id":1013,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1010,"name":"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc124\uacc4 \ubb38\uc11c","slug":"%ec%86%8c%ed%94%84%ed%8a%b8%ec%9b%a8%ec%96%b4-%ec%84%a4%ea%b3%84-%eb%ac%b8%ec%84%9c","term_group":0,"term_taxonomy_id":1010,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":936,"name":"\uc2dc\uc2a4\ud15c \ub2e4\uc774\uc5b4\uadf8\ub7a8","slug":"%ec%8b%9c%ec%8a%a4%ed%85%9c-%eb%8b%a4%ec%9d%b4%ec%96%b4%ea%b7%b8%eb%9e%a8","term_group":0,"term_taxonomy_id":936,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":1007,"name":"\uc6f9 \uc2dc\uc2a4\ud15c \uc124\uacc4","slug":"%ec%9b%b9-%ec%8b%9c%ec%8a%a4%ed%85%9c-%ec%84%a4%ea%b3%84","term_group":0,"term_taxonomy_id":1007,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":1011,"name":"\ucef4\ud3ec\ub10c\ud2b8 \ub2e4\uc774\uc5b4\uadf8\ub7a8","slug":"%ec%bb%b4%ed%8f%ac%eb%84%8c%ed%8a%b8-%eb%8b%a4%ec%9d%b4%ec%96%b4%ea%b7%b8%eb%9e%a8","term_group":0,"term_taxonomy_id":1011,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"_links":{"self":[{"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/posts\/5302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/comments?post=5302"}],"version-history":[{"count":3,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/posts\/5302\/revisions"}],"predecessor-version":[{"id":5764,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/posts\/5302\/revisions\/5764"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/media\/5313"}],"wp:attachment":[{"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/media?parent=5302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/categories?post=5302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secondlife.lol\/en\/wp-json\/wp\/v2\/tags?post=5302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}