{"id":5300,"date":"2025-12-23T18:37:10","date_gmt":"2025-12-23T09:37:10","guid":{"rendered":"https:\/\/secondlife.lol\/?p=5300"},"modified":"2025-12-24T16:58:51","modified_gmt":"2025-12-24T07:58:51","slug":"django-container-diagram-architecture","status":"publish","type":"post","link":"https:\/\/secondlife.lol\/zh\/django-container-diagram-architecture\/","title":{"rendered":"Django \uc544\ud0a4\ud14d\ucc98 2\ubd80: Container Diagram\uc73c\ub85c \ubc31\uc5d4\ub4dc \uad6c\uc870 \uc815\ub9ac\ud558\uae30"},"content":{"rendered":"<style>.kb-image5300_4dca1d-fc .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5300_4dca1d-fc\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"335\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-53-600x335.jpg\" alt=\"Container Diagram image\" class=\"kb-img wp-image-5308\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-53-600x335.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-53-300x168.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-53-768x429.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-53-18x10.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-53.jpg 1200w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n\n<p>2\ubd80\uc5d0\uc11c\ub294 Container Diagram\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30 \ud574\ubcf4\ub824\uace0 \ud558\ub294\ub370\uc694. <a href=\"https:\/\/secondlife.lol\/django-system-context-diagram\/\">1\ubd80<\/a>\uc5d0\uc11c \uc2dc\uc2a4\ud15c \ucee8\ud14d\uc2a4\ud2b8 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc73c\ub85c \u201c\uc774 \uc2dc\uc2a4\ud15c\uc774 \uc138\uc0c1\uacfc \uc5b4\ub5bb\uac8c \uc5f0\uacb0\ub3fc \uc788\ub294\uc9c0\u201d\ub97c \uadf8\ub824\ubd24\uc8e0.<\/p>\n\n\n\n<p>\uc774\uc81c \ud55c \ub2e8\uacc4 \uc548\uc73c\ub85c \ub4e4\uc5b4\uac00\uc11c,<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201c\uc2dc\uc2a4\ud15c \uc548\uc5d0\ub294 \uc5b4\ub5a4 <strong>\uad6c\uc131\uc694\uc18c(\ucee8\ud14c\uc774\ub108)<\/strong> \ub4e4\uc774 \uc788\uace0<br>\uc11c\ub85c \uc5b4\ub5bb\uac8c \ud1b5\uc2e0\ud558\ub294\uac00?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p>\ub97c \ubcf4\uc5ec\uc8fc\ub294 \uac83\uc774 \ubc14\ub85c <strong>\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8(Container Diagram)<\/strong>\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc5ec\uae30\uc11c \ub9d0\ud558\ub294 <strong>\ucee8\ud14c\uc774\ub108(Container)<\/strong> \ub294<br>\ub3c4\ucee4 \ucee8\ud14c\uc774\ub108\uac00 \uc544\ub2c8\ub77c, <strong>\uc5ed\ud560 \ub2e8\uc704\uc758 \uc2e4\ud589 \ucef4\ud3ec\ub10c\ud2b8<\/strong>\ub77c\uace0 \uc774\ud574\ud558\uc2dc\uba74 \ud3b8\ud574\uc694.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Web App (Django)<\/li>\n\n\n\n<li>Background Worker (Celery)<\/li>\n\n\n\n<li>Database (<a href=\"https:\/\/www.postgresql.org\/\" target=\"_blank\" rel=\"noopener\">Postgres<\/a> \/ <a href=\"https:\/\/sqlite.org\/\" target=\"_blank\" rel=\"noopener\">SQLite<\/a>)<\/li>\n\n\n\n<li>Cache (Redis \ub610\ub294 LocMem)<\/li>\n\n\n\n<li>Message Broker<\/li>\n\n\n\n<li>Static file server<\/li>\n\n\n\n<li>SMTP \/ Gmail<\/li>\n<\/ul>\n\n\n\n<p>\uc774\ub7f0 \uac83\ub4e4\uc774 \uc804\ubd80 \ucee8\ud14c\uc774\ub108\uac00 \ub418\uace0,<br>\uc774\ub4e4\uc744 \uc5f0\uacb0\ud574\uc11c \uadf8\ub9b0 \uadf8\ub9bc\uc774 \ubc14\ub85c \ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc785\ub2c8\ub2e4.<\/p>\n\n\n<style>.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-content-wrap{padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);border-top:3px solid var(--global-palette2, #2B6CB0);border-right:3px solid var(--global-palette2, #2B6CB0);border-bottom:3px solid var(--global-palette2, #2B6CB0);border-left:3px solid var(--global-palette2, #2B6CB0);border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-right-radius:5px;border-bottom-left-radius:5px;box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-contents-title-wrap{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-contents-title-wrap{color:var(--global-palette2, #2B6CB0);}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-contents-title{color:var(--global-palette2, #2B6CB0);font-size:28px;font-weight:regular;font-style:normal;}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-content-wrap .kb-table-of-content-list{color:var(--global-palette1, #3182CE);line-height:2em;font-weight:regular;font-style:normal;margin-top:var(--global-kb-spacing-sm, 1.5rem);margin-right:0px;margin-bottom:0px;margin-left:0px;}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-content-wrap .kb-table-of-content-list .kb-table-of-contents__entry:hover{color:var(--global-palette6, #718096);}@media all and (max-width: 1024px){.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-content-wrap{border-top:3px solid var(--global-palette2, #2B6CB0);border-right:3px solid var(--global-palette2, #2B6CB0);border-bottom:3px solid var(--global-palette2, #2B6CB0);border-left:3px solid var(--global-palette2, #2B6CB0);}}@media all and (max-width: 1024px){.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-contents-title{font-size:28px;}}@media all and (max-width: 767px){.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-content-wrap{border-top:3px solid var(--global-palette2, #2B6CB0);border-right:3px solid var(--global-palette2, #2B6CB0);border-bottom:3px solid var(--global-palette2, #2B6CB0);border-left:3px solid var(--global-palette2, #2B6CB0);}.kb-table-of-content-nav.kb-table-of-content-id83_5f28a6-34 .kb-table-of-contents-title{font-size:28px;}}<\/style>\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_854f1c-41, .wp-block-kadence-advancedheading.kt-adv-heading5300_854f1c-41[data-kb-block=\"kb-adv-heading5300_854f1c-41\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_854f1c-41 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_854f1c-41[data-kb-block=\"kb-adv-heading5300_854f1c-41\"] 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-heading5300_854f1c-41 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_854f1c-41[data-kb-block=\"kb-adv-heading5300_854f1c-41\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5300_854f1c-41 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_854f1c-41\">\uc624\ub298 \ub9cc\ub4e4 \ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8 \uad6c\uc870 \ubbf8\ub9ac \ubcf4\uae30<\/h2>\n\n\n<style>.kb-image5300_93f656-14 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5300_93f656-14\"><figure class=\"aligncenter size-medium_large\"><img decoding=\"async\" width=\"768\" height=\"452\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-55-768x452.jpg\" alt=\"Container Diagram image\" class=\"kb-img wp-image-5311\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-55-768x452.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-55-300x176.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-55-600x353.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-55-18x12.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-55.jpg 1110w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/figure><\/div>\n\n\n\n<p>\uc704\uc640 \uac19\uc774 \uc0dd\uc131\ub41c <code>container.png<\/code>\ub294 \ub300\ub7b5 \uc774\ub7f0 \uad6c\uc131\uc744 \ub2f4\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\uc704\ucabd<\/strong>\n<ul class=\"wp-block-list\">\n<li>Web User (\ube0c\ub77c\uc6b0\uc800 \uc0ac\uc6a9\ud558\ub294 \uad00\ub9ac\uc790\/\uc751\ub2f5\uc790\/\ubd84\uc11d\uc790)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\uc911\uc559 \u2013 Survey System \ub0b4\ubd80 \ucee8\ud14c\uc774\ub108<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Django Web App<\/strong>\n<ul class=\"wp-block-list\">\n<li>HTTP \uc694\uccad \ucc98\ub9ac, \ud15c\ud50c\ub9bf \ub80c\ub354\ub9c1, REST API \uc81c\uacf5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Celery Worker<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc774\uba54\uc77c \ubcf4\ub0b4\uae30, \ub300\ub7c9 \ud1b5\uacc4 \ucc98\ub9ac \uac19\uc740 \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc791\uc5c5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Database (SQLite \/ Postgres)<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc124\ubb38, \uba74\ub2f4, \uc751\ub2f5, \uc870\uc9c1, \uc0ac\uc6a9\uc790 \ub370\uc774\ud130 \uc800\uc7a5<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Cache (LocMem \/ Redis)<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc138\uc158\/\uce90\uc2dc<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Static files<\/strong>\n<ul class=\"wp-block-list\">\n<li>CSS, JS, \uc774\ubbf8\uc9c0 \ub4f1 \uc815\uc801 \ud30c\uc77c<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Message broker (RabbitMQ \/ Redis)<\/strong>\n<ul class=\"wp-block-list\">\n<li>Celery \ud050<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>SMTP \/ Gmail<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc774\uba54\uc77c \ubc1c\uc1a1<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>\uc774\uac78 \ud14d\uc2a4\ud2b8\ub85c \ubaa8\ub378\ub9c1\ud55c \ud6c4 PlantUML\ub85c \uadf8\ub9ac\uba74,<br>\uc774\uc05c <strong>\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8<\/strong> PNG\uac00 \ub531! \uc0dd\uc131\ub429\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_9972de-a1, .wp-block-kadence-advancedheading.kt-adv-heading5300_9972de-a1[data-kb-block=\"kb-adv-heading5300_9972de-a1\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_9972de-a1 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_9972de-a1[data-kb-block=\"kb-adv-heading5300_9972de-a1\"] 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-heading5300_9972de-a1 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_9972de-a1[data-kb-block=\"kb-adv-heading5300_9972de-a1\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5300_9972de-a1 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_9972de-a1\">\ud30c\uc77c \uc900\ube44 \u2013 <code>container.puml<\/code> \ub9cc\ub4e4\uae30<\/h2>\n\n\n\n<p>1\ubd80\uc5d0\uc11c \ub9cc\ub4e0 \ud3f4\ub354\ub97c \uadf8\ub300\ub85c \uc501\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc774\ubbf8 \uc788\ub2e4\uba74 \uac74\ub108\ub6f0\uae30\nmkdir -p docs\/architecture<\/code><\/pre>\n\n\n\n<p>\uc774\uc81c <code>docs\/architecture\/container.puml<\/code> \ud30c\uc77c\uc744 \ub9cc\ub4e4\uace0 \ud3b8\uc9d1\uae30\ub97c \uc5f4\uc5b4\uc694.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_dbb55a-22, .wp-block-kadence-advancedheading.kt-adv-heading5300_dbb55a-22[data-kb-block=\"kb-adv-heading5300_dbb55a-22\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_dbb55a-22 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_dbb55a-22[data-kb-block=\"kb-adv-heading5300_dbb55a-22\"] 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-heading5300_dbb55a-22 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_dbb55a-22[data-kb-block=\"kb-adv-heading5300_dbb55a-22\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5300_dbb55a-22 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_dbb55a-22\">\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8 \uae30\ubcf8 \ud15c\ud50c\ub9bf \ucf54\ub4dc<\/h2>\n\n\n\n<p>\uc544\ub798 \ucf54\ub4dc\ub97c \ud1b5\uc9f8\ub85c \ubd99\uc5ec \ub123\uc73c\uba74,<br>\ud604\uc7ac \uc2dc\uc2a4\ud15c\uacfc \uac70\uc758 \uac19\uc740 \ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8(Container Diagram)\uc774 \ub098\uc635\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@startuml\n' C4-PlantUML \ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc6a9 \ub77c\uc774\ube0c\ub7ec\ub9ac\n!define C4P https:\/\/raw.githubusercontent.com\/plantuml-stdlib\/C4-PlantUML\/master\n!includeurl C4P\/C4_Container.puml\n\n' 1) \uc0ac\ub78c(\uc0ac\uc6a9\uc790) \uc815\uc758\nPerson(web_user, \"Web User\", \"\ube0c\ub77c\uc6b0\uc800\ub85c \uc124\ubb38\uc5d0 \uc751\ub2f5\ud558\uac70\ub098 \uba74\ub2f4\uc744 \uad00\ub9ac\ud558\ub294 \uc0ac\uc6a9\uc790\")\n\n' 2) \uc2dc\uc2a4\ud15c \uc804\uccb4 \ubc15\uc2a4\nSystem_Boundary(survey_system, \"Survey System\") {\n\n  ' 2-1) Django \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\n  Container(django_app, \"Django Web App\", \"Python \/ Django\",\n    \"HTTP \uc694\uccad \ucc98\ub9ac, \ud15c\ud50c\ub9bf \ub80c\ub354\ub9c1, REST API \uc81c\uacf5\")\n\n  ' 2-2) \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc791\uc5c5\uc6a9 Celery \uc6cc\ucee4\n  Container(celery_worker, \"Celery Worker\", \"Python \/ Celery\",\n    \"\uc774\uba54\uc77c \ubc1c\uc1a1, \ub300\ub7c9 \ud1b5\uacc4 \ucc98\ub9ac \ub4f1 \ube44\ub3d9\uae30 \uc791\uc5c5 \uc2e4\ud589\")\n\n  ' 2-3) \ub370\uc774\ud130\ubca0\uc774\uc2a4\n  ContainerDb(database, \"Database\", \"SQLite (dev) \/ Postgres (prod)\",\n    \"\uc0ac\uc6a9\uc790, \uc124\ubb38, \uc751\ub2f5, \uba74\ub2f4 \uae30\ub85d \ub4f1 \uc601\uc18d \ub370\uc774\ud130 \uc800\uc7a5\")\n\n  ' 2-4) \uce90\uc2dc \/ \uc138\uc158 \uc800\uc7a5\uc18c\n  Container(cache, \"Cache \/ Session Store\", \"LocMemCache \/ Redis\",\n    \"\uc138\uc158, \ube48\ubc88\ud788 \uc870\ud68c\ub418\ub294 \ub370\uc774\ud130 \uce90\uc2dc\")\n\n  ' 2-5) \uc815\uc801 \ud30c\uc77c \uc11c\ubc84\n  Container(static_files, \"Static Files\", \"Nginx \ub610\ub294 Django\",\n    \"CSS, JS, \uc774\ubbf8\uc9c0 \uac19\uc740 \uc815\uc801 \uc790\uc0b0 \uc81c\uacf5\")\n\n  ' 2-6) \uba54\uc2dc\uc9c0 \ube0c\ub85c\ucee4 (Celery \ud050)\n  Container(message_broker, \"Message Broker\", \"Redis \/ RabbitMQ\",\n    \"Celery \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc791\uc5c5 \ud050\")\n\n  ' 2-7) \uc774\uba54\uc77c \ubc1c\uc1a1\uc6a9 SMTP\n  Container_Ext(smtp, \"SMTP \/ Gmail\", \"\uc678\ubd80 \uc774\uba54\uc77c \uc11c\ube44\uc2a4\",\n    \"\uc54c\ub9bc, \uc778\ud130\ubdf0 \ucd08\ub300 \uba54\uc77c \ubc1c\uc1a1\")\n}\n\n' 3) \uad00\uacc4(Relationship) \uc815\uc758\nRel(web_user, django_app, \"HTTP \uc694\uccad\/\uc751\ub2f5 (\uc124\ubb38, \uba74\ub2f4, \ub300\uc2dc\ubcf4\ub4dc)\", \"HTTPS\")\n\nRel(django_app, database, \"ORM\uc73c\ub85c \uc77d\uae30\/\uc4f0\uae30\", \"SQL\")\nRel(django_app, cache, \"\uc138\uc158\/\uce90\uc2dc \uc77d\uae30\u00b7\uc4f0\uae30\", \"TCP\")\nRel(django_app, static_files, \"\uc815\uc801 \ud30c\uc77c \uc694\uccad\", \"HTTP\")\nRel(django_app, message_broker, \"\ubc31\uadf8\ub77c\uc6b4\ub4dc \uc791\uc5c5 enqueue\", \"AMQP \/ Redis\")\nRel(django_app, smtp, \"\uc54c\ub9bc \uc774\uba54\uc77c \ubc1c\uc1a1\", \"SMTP\")\n\nRel(celery_worker, database, \"\ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \ub370\uc774\ud130 \uc77d\uae30\u00b7\uc4f0\uae30\", \"SQL\")\nRel(celery_worker, message_broker, \"\uc791\uc5c5 \uc218\uc2e0\", \"AMQP \/ Redis\")\nRel(celery_worker, smtp, \"\ub300\ub7c9 \uc774\uba54\uc77c \ubc1c\uc1a1\", \"SMTP\")\n\nSHOW_LEGEND()\n@enduml<\/code><\/pre>\n\n\n\n<p>\uc774 \ucf54\ub4dc\uac00 \ubc14\ub85c \ub450 \ubc88\uc9f8 \uadf8\ub9bc\uc778 <strong>Container Diagram<\/strong>\uc758 \uc18c\uc2a4\uc5d0 \ud574\ub2f9\ud569\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_12af22-2b, .wp-block-kadence-advancedheading.kt-adv-heading5300_12af22-2b[data-kb-block=\"kb-adv-heading5300_12af22-2b\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_12af22-2b mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_12af22-2b[data-kb-block=\"kb-adv-heading5300_12af22-2b\"] 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-heading5300_12af22-2b img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_12af22-2b[data-kb-block=\"kb-adv-heading5300_12af22-2b\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5300_12af22-2b wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_12af22-2b\">\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8 \ub77c\uc778\ubcc4 \ud574\uc124<\/h2>\n\n\n<style>.kb-image5300_6938d9-d4 .kb-image-has-overlay:after{opacity:0.3;}<\/style>\n<div class=\"wp-block-kadence-image kb-image5300_6938d9-d4\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" width=\"600\" height=\"335\" src=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-54-600x335.jpg\" alt=\"\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8 \uadf8\ub9bc\" class=\"kb-img wp-image-5310\" srcset=\"https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-54-600x335.jpg 600w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-54-300x168.jpg 300w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-54-768x429.jpg 768w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-54-18x10.jpg 18w, https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-54.jpg 1200w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/figure><\/div>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_1e1fd2-22, .wp-block-kadence-advancedheading.kt-adv-heading5300_1e1fd2-22[data-kb-block=\"kb-adv-heading5300_1e1fd2-22\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_1e1fd2-22 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_1e1fd2-22[data-kb-block=\"kb-adv-heading5300_1e1fd2-22\"] 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-heading5300_1e1fd2-22 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_1e1fd2-22[data-kb-block=\"kb-adv-heading5300_1e1fd2-22\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5300_1e1fd2-22 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_1e1fd2-22\"><strong>1) System_Boundary \ube14\ub85d<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>System_Boundary(survey_system, \"Survey System\") { ... }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Survey System\uc774\ub77c\ub294 \ud558\ub098\uc758 \ud070 \uc0c1\uc790 \uc548\uc5d0<br>\uc5ec\ub7ec \uac1c\uc758 \ucee8\ud14c\uc774\ub108\ub97c \ubb36\uc5b4\uc90d\ub2c8\ub2e4.<\/li>\n\n\n\n<li>1\ubd80\uc758 \uc2dc\uc2a4\ud15c <strong>Container Diagram<\/strong>\uc5d0\uc11c\uc758 \u201cSystem\u201d\uc744<br>\ub0b4\ubd80 \uad6c\uc870\ub85c \ucabc\uac20 \ubc84\uc804\uc774\ub77c\uace0 \ubcf4\uba74 \ub3fc\uc694.<\/li>\n<\/ul>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_baf594-ed, .wp-block-kadence-advancedheading.kt-adv-heading5300_baf594-ed[data-kb-block=\"kb-adv-heading5300_baf594-ed\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_baf594-ed mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_baf594-ed[data-kb-block=\"kb-adv-heading5300_baf594-ed\"] 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-heading5300_baf594-ed img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_baf594-ed[data-kb-block=\"kb-adv-heading5300_baf594-ed\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5300_baf594-ed wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_baf594-ed\"><strong>2) Django Web App \ucee8\ud14c\uc774\ub108<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Container(django_app, \"Django Web App\", \"Python \/ Django\",\n  \"HTTP \uc694\uccad \ucc98\ub9ac, \ud15c\ud50c\ub9bf \ub80c\ub354\ub9c1, REST API \uc81c\uacf5\")<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>URL, \ubdf0, \ud15c\ud50c\ub9bf, DRF(API) \uac19\uc740 <strong>\uc8fc\uc694 \uc6f9 \ub85c\uc9c1<\/strong>\uc774 \ub2e4 \uc5ec\uae30.<\/li>\n\n\n\n<li>\ub098\uc911\uc5d0 <strong>Container Diagram<\/strong>\uc744 \ubcf4\uba74\uc11c<br>\u201c\uc774 \uae30\ub2a5\uc740 Celery Worker\ub85c \ube7c\uc57c\uaca0\ub2e4\u201d \uac19\uc740 \ub9ac\ud329\ud1a0\ub9c1 \uc544\uc774\ub514\uc5b4\ub97c \uc5bb\uae30 \uc27d\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_0e58a7-52, .wp-block-kadence-advancedheading.kt-adv-heading5300_0e58a7-52[data-kb-block=\"kb-adv-heading5300_0e58a7-52\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_0e58a7-52 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_0e58a7-52[data-kb-block=\"kb-adv-heading5300_0e58a7-52\"] 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-heading5300_0e58a7-52 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_0e58a7-52[data-kb-block=\"kb-adv-heading5300_0e58a7-52\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5300_0e58a7-52 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_0e58a7-52\"><strong>3) Celery Worker \ucee8\ud14c\uc774\ub108<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>Container(celery_worker, \"Celery Worker\", \"Python \/ Celery\",\n  \"\uc774\uba54\uc77c \ubc1c\uc1a1, \ub300\ub7c9 \ud1b5\uacc4 \ucc98\ub9ac \ub4f1 \ube44\ub3d9\uae30 \uc791\uc5c5 \uc2e4\ud589\")<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc7a5\uace0\uc5d0\uc11c <code>delay()<\/code>\ub85c \ubcf4\ub0b4\ub294 \uc791\uc5c5\ub4e4\uc774 \ub3c4\ub294 \uacf3.<\/li>\n\n\n\n<li>\ubb34\uac70\uc6b4 \ud1b5\uacc4, \ub9ac\ud3ec\ud2b8 \uc0dd\uc131, \ub300\ub7c9 \uc774\uba54\uc77c \ub4f1\uc740<br>Container Diagram \uc0c1\uc5d0\uc11c \ud56d\uc0c1 Worker \ucabd\uc73c\ub85c \ube7c\ub450\uba74 \uad6c\uc870\uac00 \uae54\ub054\ud574\uc9d1\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_481957-4a, .wp-block-kadence-advancedheading.kt-adv-heading5300_481957-4a[data-kb-block=\"kb-adv-heading5300_481957-4a\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_481957-4a mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_481957-4a[data-kb-block=\"kb-adv-heading5300_481957-4a\"] 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-heading5300_481957-4a img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_481957-4a[data-kb-block=\"kb-adv-heading5300_481957-4a\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5300_481957-4a wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_481957-4a\"><strong>4) Database \/ Cache \/ Static Files<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Database \ucee8\ud14c\uc774\ub108<\/strong>\ub294 Django ORM\uc774 \ubd99\ub294 \ucabd<\/li>\n\n\n\n<li><strong>Cache \ucee8\ud14c\uc774\ub108<\/strong>\ub294 \uc138\uc158\/\uce90\uc2dc \uc5ed\ud560<\/li>\n\n\n\n<li><strong>Static Files \ucee8\ud14c\uc774\ub108<\/strong>\ub294 Nginx\ub4e0, S3\ub4e0, \uc815\uc801 \uc790\uc0b0\uc744 \uc8fc\ub294 \uc5ed\ud560<\/li>\n<\/ul>\n\n\n\n<p>\uc2e4\uc81c \uad6c\ud604\uc740 \uc870\uae08\uc529 \ub2ec\ub77c\ub3c4,<br>\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc5d0\uc11c\ub294 \u201c\uc5ed\ud560\u201d \uae30\uc900\uc73c\ub85c\ub9cc \uae54\ub054\ud558\uac8c \ub098\ub204\ub294 \uac8c \ud575\uc2ec\uc785\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_93220f-6c, .wp-block-kadence-advancedheading.kt-adv-heading5300_93220f-6c[data-kb-block=\"kb-adv-heading5300_93220f-6c\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_93220f-6c mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_93220f-6c[data-kb-block=\"kb-adv-heading5300_93220f-6c\"] 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-heading5300_93220f-6c img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_93220f-6c[data-kb-block=\"kb-adv-heading5300_93220f-6c\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading5300_93220f-6c wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_93220f-6c\"><strong>5) Message Broker + SMTP<\/strong><\/h3>\n\n\n\n<p>Container Diagram\uc5d0\uc11c \uc774 \ub458\uc740 \u201c\uc678\ubd80\uc774\uc9c0\ub9cc \uc2dc\uc2a4\ud15c\uc5d0 \uac15\ud558\uac8c \ubb36\uc778\u201d \ub290\ub08c\uc73c\ub85c \ud45c\ud604\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Message Broker: Celery\uac00 \uc758\uc874\ud558\ub294 \ud050 \uc2dc\uc2a4\ud15c<\/li>\n\n\n\n<li>SMTP: \uc678\ubd80 \uba54\uc77c \uc11c\ubc84\uc9c0\ub9cc, \uc11c\ube44\uc2a4 \uc785\uc7a5\uc5d0\uc11c \uac70\uc758 \ud544\uc218 \uc778\ud504\ub77c<\/li>\n<\/ul>\n\n\n\n<p>\uc774\ub807\uac8c \uc801\uc5b4\ub450\uba74, \ub098\uc911\uc5d0<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201cRabbitMQ\uc5d0\uc11c Redis\ub85c \ubc14\uafc0\uae4c?\u201d<br>\u201c\ub0b4\ubd80 SMTP \uc11c\ubc84\ub85c \ubc14\uafc0\uae4c?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p>\uac19\uc740 \ub17c\uc758\uac00 \ub098\uc62c \ub54c<br>\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uae30\uc900\uc73c\ub85c \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc774\uc57c\uae30\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_9fd1e0-c0, .wp-block-kadence-advancedheading.kt-adv-heading5300_9fd1e0-c0[data-kb-block=\"kb-adv-heading5300_9fd1e0-c0\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_9fd1e0-c0 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_9fd1e0-c0[data-kb-block=\"kb-adv-heading5300_9fd1e0-c0\"] 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-heading5300_9fd1e0-c0 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_9fd1e0-c0[data-kb-block=\"kb-adv-heading5300_9fd1e0-c0\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5300_9fd1e0-c0 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_9fd1e0-c0\">\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8 \ub80c\ub354\ub9c1 (PNG \uc0dd\uc131)<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">VSCode \ud50c\ub7ec\uadf8\uc778\uc77c \ub54c<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>container.puml<\/code> \ud30c\uc77c \uc5f4\uae30<\/li>\n\n\n\n<li>\ubbf8\ub9ac\ubcf4\uae30 \uc2e4\ud589 \u2192 <strong>Container Diagram<\/strong>\uc774 \ubcf4\uc774\ub294\uc9c0 \ud655\uc778<\/li>\n\n\n\n<li>\uc6b0\ud074\ub9ad \u2192 Export as PNG (\ud655\uc7a5\uc5d0 \ub530\ub77c \uae30\ub2a5 \uc774\ub984\uc774 \uc870\uae08 \ub2e4\ub97c \uc218 \uc788\uc5b4\uc694)<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">plantuml.jar\uc77c \ub54c<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>java -jar tools\/plantuml.jar docs\/architecture\/container.puml<\/code><\/pre>\n\n\n\n<p>\uc2e4\ud589 \ud6c4 <code>docs\/architecture\/container.png<\/code>\uac00 \ub9cc\ub4e4\uc5b4\uc9c0\uba74,<br>\uc774\uac78 \uc0ac\uc6a9\ud558\uace0\uc790 \ud558\ub294 \uacf3\uc5d0 \uc5c5\ub85c\ub4dc\ud574\uc11c <strong>\u201c<strong>Container Diagram<\/strong>\u201d<\/strong> \uc124\uba85\uc139\uc158\uc73c\ub85c \uc0ac\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading5300_e02a01-b0, .wp-block-kadence-advancedheading.kt-adv-heading5300_e02a01-b0[data-kb-block=\"kb-adv-heading5300_e02a01-b0\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading5300_e02a01-b0 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading5300_e02a01-b0[data-kb-block=\"kb-adv-heading5300_e02a01-b0\"] 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-heading5300_e02a01-b0 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading5300_e02a01-b0[data-kb-block=\"kb-adv-heading5300_e02a01-b0\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h2 class=\"kt-adv-heading5300_e02a01-b0 wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading5300_e02a01-b0\">\uc2e4\ubb34\uc5d0\uc11c \ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8 \ud65c\uc6a9 \ud301 3\uac00\uc9c0<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\ubc30\ud3ec \uad6c\uc870 \ub17c\uc758\uc758 \uae30\uc900\uc73c\ub85c \uc0ac\uc6a9<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u201cDjango Web App\uc740 \uba87 \uac1c?\u201d<\/li>\n\n\n\n<li>\u201cWorker\ub294 Auto Scaling \ud544\uc694?\u201d<\/li>\n\n\n\n<li>\u201cRedis\ub294 \uc138\uc158\/\ube0c\ub85c\ucee4 \uacb8\uc6a9\uc778\uac00, \ubd84\ub9ac\uc778\uac00?\u201d<br>\uc774\ub7f0 \uc598\uae30\ub97c \ud560 \ub54c \ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc55e\uc5d0 \ub450\uace0 \ud68c\uc758\ud558\uba74<br>\ub9d0\uc774 \ud6e8\uc52c \ube68\ub9ac \ud1b5\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\uc7a5\uc560 \uc6d0\uc778 \uc815\ub9ac \ub54c \uc0ac\uc6a9<\/strong>\n<ul class=\"wp-block-list\">\n<li>\uc608: \u201cMessage Broker \uc7a5\uc560 \u2192 Celery Worker \u2192 Django Web App \uc751\ub2f5 \uc9c0\uc5f0\u201d<br>\uc774\ub7f0 \uc2dd\uc73c\ub85c \uc7a5\uc560 \uacbd\ub85c\ub97c \ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8 \uc704\uc5d0 \ud45c\uc2dc\ud558\uba74<br>\ubcf4\uace0\uc11c\ub098 \ud68c\uc758\uc790\ub8cc\ub85c\ub3c4 \ud6cc\ub96d\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\ubbf8\ub798 \uad6c\uc870(\ud0c0\uac9f \uc544\ud0a4\ud14d\ucc98) \uadf8\ub9b4 \ub54c \ubcf5\uc81c\ud574\uc11c \uc0ac\uc6a9<\/strong>\n<ul class=\"wp-block-list\">\n<li>\ud604\uc7ac \uad6c\uc870(Container Diagram V1)\uc640<\/li>\n\n\n\n<li>\ubaa9\ud45c \uad6c\uc870(Container Diagram V2)\ub97c \ub450 \uc7a5\uc73c\ub85c \ub9cc\ub4e4\uc5b4 \ub450\uba74<br>\u201c\ubb34\uc5c7\uc744 \ubc14\uafc0\uc9c0\u201d\uac00 \ud655\uc2e4\ud574\uc9d1\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc774\ub807\uac8c \uc368\uba39\ub2e4 \ubcf4\uba74<br>\uc790\uc5f0\uc2a4\ub7fd\uac8c <a href=\"https:\/\/secondlife.lol\/django-component-diagram-architecture\/\">3\ubd80\uc5d0\uc11c \ub2e4\ub8f0 <strong>\ucef4\ud3ec\ub10c\ud2b8 \ub2e4\uc774\uc5b4\uadf8\ub7a8<\/strong><\/a>\uc73c\ub85c \ub0b4\ub824\uac00\ub294 \ud750\ub984\ub3c4 \uc7a1\ud788\uac8c \ub3fc\uc694.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>2\ubd80\uc5d0\uc11c\ub294 Container Diagram\uc5d0 \ub300\ud574\uc11c \uc774\uc57c\uae30 \ud574\ubcf4\ub824\uace0 \ud558\ub294\ub370\uc694. 1\ubd80\uc5d0\uc11c \uc2dc\uc2a4\ud15c \ucee8\ud14d\uc2a4\ud2b8&#8230;<\/p>","protected":false},"author":3,"featured_media":5308,"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,942,938,1008,1009,1010,936,944,1007,1006],"class_list":["post-5300","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it-jewel","tag-c4-","tag-django-","tag-plantuml","tag-1008","tag-1009","tag-1010","tag-936","tag-944","tag-1007","tag-1006"],"taxonomy_info":{"category":[{"value":15,"label":"D \ubcf4\ubb3c\ucc3d\uace0(Jewel)"}],"post_tag":[{"value":941,"label":"C4 \ubaa8\ub378"},{"value":942,"label":"Django \uc544\ud0a4\ud14d\ucc98"},{"value":938,"label":"PlantUML"},{"value":1008,"label":"\ubc31\uc5d4\ub4dc \uc544\ud0a4\ud14d\ucc98"},{"value":1009,"label":"\uc124\ubb38 \uc2dc\uc2a4\ud15c"},{"value":1010,"label":"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc124\uacc4 \ubb38\uc11c"},{"value":936,"label":"\uc2dc\uc2a4\ud15c \ub2e4\uc774\uc5b4\uadf8\ub7a8"},{"value":944,"label":"\uc5d4\ud130\ud504\ub77c\uc774\uc988 \uc544\ud0a4\ud14d\ucc98"},{"value":1007,"label":"\uc6f9 \uc2dc\uc2a4\ud15c \uc124\uacc4"},{"value":1006,"label":"\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8"}]},"featured_image_src_large":["https:\/\/secondlife.lol\/wp-content\/uploads\/2025\/12\/image-53-600x335.jpg",600,335,true],"author_info":{"display_name":"TERE","author_link":"https:\/\/secondlife.lol\/zh\/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":55,"filter":"raw","cat_ID":15,"category_count":55,"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":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":1008,"name":"\ubc31\uc5d4\ub4dc \uc544\ud0a4\ud14d\ucc98","slug":"%eb%b0%b1%ec%97%94%eb%93%9c-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98","term_group":0,"term_taxonomy_id":1008,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":1009,"name":"\uc124\ubb38 \uc2dc\uc2a4\ud15c","slug":"%ec%84%a4%eb%ac%b8-%ec%8b%9c%ec%8a%a4%ed%85%9c","term_group":0,"term_taxonomy_id":1009,"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":944,"name":"\uc5d4\ud130\ud504\ub77c\uc774\uc988 \uc544\ud0a4\ud14d\ucc98","slug":"%ec%97%94%ed%84%b0%ed%94%84%eb%9d%bc%ec%9d%b4%ec%a6%88-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98","term_group":0,"term_taxonomy_id":944,"taxonomy":"post_tag","description":"","parent":0,"count":2,"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":1006,"name":"\ucee8\ud14c\uc774\ub108 \ub2e4\uc774\uc5b4\uadf8\ub7a8","slug":"%ec%bb%a8%ed%85%8c%ec%9d%b4%eb%84%88-%eb%8b%a4%ec%9d%b4%ec%96%b4%ea%b7%b8%eb%9e%a8","term_group":0,"term_taxonomy_id":1006,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"_links":{"self":[{"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/posts\/5300","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/comments?post=5300"}],"version-history":[{"count":7,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/posts\/5300\/revisions"}],"predecessor-version":[{"id":5762,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/posts\/5300\/revisions\/5762"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/media\/5308"}],"wp:attachment":[{"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/media?parent=5300"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/categories?post=5300"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secondlife.lol\/zh\/wp-json\/wp\/v2\/tags?post=5300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}