{"title":"Django 훑어보기","version":"3.1","locale":"ko","docname":"intro/overview","url":"/ko/3.1/intro/overview/","canonical":"https://djangodocs.dev/ko/3.1/intro/overview/","summary":"Django는 급한 분위기의 뉴스룸에서 개발되어서 보편적인 웹 개발 업무를 빠르고 쉽게 만들어주도록 설계되었습니다. 여기서는 Django와 데이터 드리븐 웹 어플리케이션을 어떻게 작성하는지에 대한 개요를 보실수 있습니다. 이 문서의 목표는 Django가 어떻게 동작하는지 이해하는데 충분한…","html":"<h1>Django 훑어보기<a class=\"heading-anchor\" href=\"#django-at-a-glance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django는 급한 분위기의 뉴스룸에서 개발되어서 보편적인 웹 개발 업무를 빠르고 쉽게 만들어주도록 설계되었습니다. 여기서는 Django와 데이터 드리븐 웹 어플리케이션을 어떻게 작성하는지에 대한 개요를 보실수 있습니다.</p>\n<p>이 문서의 목표는 Django가 어떻게 동작하는지 이해하는데 충분한 기술적 사항들을 알려주는데 있습니다. 하지만 튜토리얼이나 레퍼런스의 역할을 의도하지는 않습니다 – 물론 우리는 그 두가지를 다 가지고있죠! 프로젝트를 시작할 준비가 되었으면 <a class=\"reference internal\" href=\"/ko/3.1/intro/tutorial01/\"><span class=\"doc\">튜토리얼로 시작</span></a>하거나 <a class=\"reference internal\" href=\"/ko/3.1/topics/\"><span class=\"doc\">바로 좀더 자세한 문서로 뛰어들수 있습니다</span></a>.</p>\n<section id=\"design-your-model\">\n<h2>모델 설계<a class=\"heading-anchor\" href=\"#design-your-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>설사 Django를 데이터베이스 없이 쓸 수 있을 지라도 데이터베이스 레이아웃을 파이썬 코드로 표현할 수 있는 <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Object-relational_mapping\">object-relational mapper</a>가 같이 딸려 옵니다.</p>\n<p><a class=\"reference internal\" href=\"/ko/3.1/topics/db/models/\"><span class=\"doc\">data-model 구문</span></a>은 당신의 모델을 표현할 풍부한 방법을 제공해줍니다 – 이는 지금까지 수년간 데이터베이스 스키마 문제들을 해결하는데에 많은 도움을 주어왔습니다. 아래의 간단한 예제를 보시죠.</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">mysite/news/models.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Reporter</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">full_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">70</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">full_name</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">content</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n    <span class=\"n\">reporter</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Reporter</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">headline</span>\n</code></pre></figure>\n</section>\n<section id=\"install-it\">\n<h2>설치하기<a class=\"heading-anchor\" href=\"#install-it\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>다음으로, 데이터베이스를 자동으로 생성해주는 Django command-line 유틸리티를 실행하여 줍니다:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>makemigrations\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>migrate\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py makemigrations\n<span class=\"gp\">...\\&gt;</span> py manage.py migrate\n</code></pre></div></div></div>\n<p><a class=\"reference internal\" href=\"/ko/3.1/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> 명령은 생성 가능한 모델을 찾아 테이블이 존재하지 않을 경우 마이그레이션을 생성합니다. <a class=\"reference internal\" href=\"/ko/3.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> 명령은 마이그레이션을 실행하고 사용자의 데이터베이스에 테이블을 생성합니다. 이는 더욱 <a class=\"reference internal\" href=\"/ko/3.1/topics/migrations/\"><span class=\"doc\">풍부한 스키마 제어</span></a>를 선택적으로 제공합니다.</p>\n</section>\n<section id=\"enjoy-the-free-api\">\n<h2>자유로운 API 즐기기<a class=\"heading-anchor\" href=\"#enjoy-the-free-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>With that, you’ve got a free, and rich, <a class=\"reference internal\" href=\"/ko/3.1/topics/db/queries/\"><span class=\"doc\">Python API</span></a>\nto access your data. The API is created on the fly, no code generation\nnecessary:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># Import the models we created from our &quot;news&quot; app</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">news.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span><span class=\"p\">,</span> <span class=\"n\">Reporter</span>\n\n<span class=\"c1\"># No reporters are in the system yet.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Create a new Reporter.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">Reporter</span><span class=\"p\">(</span><span class=\"n\">full_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;John Smith&#39;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Save the object into the database. You have to call save() explicitly.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Now it has an ID.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">id</span>\n<span class=\"mi\">1</span>\n\n<span class=\"c1\"># Now the new reporter is in the database.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Fields are represented as attributes on the Python object.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">full_name</span>\n<span class=\"s1\">&#39;John Smith&#39;</span>\n\n<span class=\"c1\"># Django provides a rich database lookup API.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">full_name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">full_name__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;mith&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"n\">Traceback</span> <span class=\"p\">(</span><span class=\"n\">most</span> <span class=\"n\">recent</span> <span class=\"n\">call</span> <span class=\"n\">last</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n<span class=\"n\">DoesNotExist</span><span class=\"p\">:</span> <span class=\"n\">Reporter</span> <span class=\"n\">matching</span> <span class=\"n\">query</span> <span class=\"n\">does</span> <span class=\"ow\">not</span> <span class=\"n\">exist</span><span class=\"o\">.</span>\n\n<span class=\"c1\"># Create an article.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">datetime</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">date</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"p\">(</span><span class=\"n\">pub_date</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">(),</span> <span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;Django is cool&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>     <span class=\"n\">content</span><span class=\"o\">=</span><span class=\"s1\">&#39;Yeah.&#39;</span><span class=\"p\">,</span> <span class=\"n\">reporter</span><span class=\"o\">=</span><span class=\"n\">r</span><span class=\"p\">)</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Now the article is in the database.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Article</span><span class=\"p\">:</span> <span class=\"n\">Django</span> <span class=\"ow\">is</span> <span class=\"n\">cool</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Article objects get API access to related Reporter objects.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">reporter</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">full_name</span>\n<span class=\"s1\">&#39;John Smith&#39;</span>\n\n<span class=\"c1\"># And vice versa: Reporter objects get API access to Article objects.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">article_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Article</span><span class=\"p\">:</span> <span class=\"n\">Django</span> <span class=\"ow\">is</span> <span class=\"n\">cool</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># The API follows relationships as far as you need, performing efficient</span>\n<span class=\"c1\"># JOINs for you behind the scenes.</span>\n<span class=\"c1\"># This finds all articles by a reporter whose name starts with &quot;John&quot;.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">reporter__full_name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Article</span><span class=\"p\">:</span> <span class=\"n\">Django</span> <span class=\"ow\">is</span> <span class=\"n\">cool</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Change an object by altering its attributes and calling save().</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">full_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Billy Goat&#39;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Delete an object with delete().</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house\">\n<h2>동적인 관리자 인터페이스: 단순한 뼈대 세우기가 아닙니다 – 이것은 완성된 집입니다<a class=\"heading-anchor\" href=\"#a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Once your models are defined, Django can automatically create a professional,\nproduction ready <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/admin/\"><span class=\"doc\">administrative interface</span></a> –\na website that lets authenticated users add, change and delete objects. The\nonly step required is to register your model in the admin site:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">mysite/news/models.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">content</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n    <span class=\"n\">reporter</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Reporter</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">mysite/news/admin.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Article</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>The philosophy here is that your site is edited by a staff, or a client, or\nmaybe just you – and you don’t want to have to deal with creating backend\ninterfaces only to manage content.</p>\n<p>Django 앱을 생성하는 하나의 전형적인 작업 흐름은 일단 모델을 만들고 관리자 사이트를 올려서 가능한 빨리 작동할 수 있게 만드는 것입니다, 그래서 당신의 운영자(혹은 고객)이 데이터 입력을 시작할 수 있게 합니다. 그러면 밖으로 데이터를 표현하는 방법을 개발합니다.</p>\n</section>\n<section id=\"design-your-urls\">\n<h2>URL 설계<a class=\"heading-anchor\" href=\"#design-your-urls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>깔끔하고 우아한 URL 계획은 고품질의 웹 어플리케이션에 매우 중요한 부분입니다. Django는 아름다운 URL 설계를 장려하며 URL에  <code class=\"docutils literal notranslate\"><span class=\"pre\">.php</span></code> 나 <code class=\"docutils literal notranslate\"><span class=\"pre\">.asp</span></code> 같은 불필요한 내용들을 넣지 않습니다.</p>\n<p>To design URLs for an app, you create a Python module called a <a class=\"reference internal\" href=\"/ko/3.1/topics/http/urls/\"><span class=\"doc\">URLconf</span></a>. A table of contents for your app, it contains a mapping\nbetween URL patterns and Python callback functions. URLconfs also serve to\ndecouple URLs from Python code.</p>\n<p>아래의 코드는 위의 <code class=\"docutils literal notranslate\"><span class=\"pre\">Reporter</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code>  예제에 대해서 URLconf를 어떻게 쓰는지 보여줍니다:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">mysite/news/urls.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;articles/&lt;int:year&gt;/&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">year_archive</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;articles/&lt;int:year&gt;/&lt;int:month&gt;/&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">month_archive</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;articles/&lt;int:year&gt;/&lt;int:month&gt;/&lt;int:pk&gt;/&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">article_detail</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>위 코드는 URL 경로들을 파이썬 콜백 함수들(“views”)로 연결해 줍니다. 경로를 나타내는 문자열들은 매개 변수 태그들을 사용하여 URL 로부터 값을 “캡처”합니다. 사용자가 페이지를 요청하면, Django 는 각 경로를 순서대로 실행하고, 요청된 URL 과 일치하는 첫번째 것에서 정지하게 됩니다. (만약 아무것도 매치하는 것이 없다면, Django 는 특수한 사례인 404 view 를 호출합니다.) 이 경로들은 로드할 때 정규표현식으로 컴파일 되어 있기 때문에 엄청나게 빠릅니다.</p>\n<p>URL 패턴 중 하나가 일치하면 Django는 주어진 뷰를 호출합니다. 뷰는 파이썬 함수로, 각각의 뷰에는 요청 메타데이터가 포함된 요청 개체와 패턴에 잡힌 값이 전달 됩니다.</p>\n<p>예를 들어, 사용자가 URL “/articles/2005/05/39323/”로 요청을 보냅니다, 그러면 Django는 다음처럼 함수를 호출하게 됩니다. <code class=\"docutils literal notranslate\"><span class=\"pre\">news.views.article_detail(request,</span> <span class=\"pre\">year=2005,</span> <span class=\"pre\">month=5,</span> <span class=\"pre\">pk=39323)</span></code>.</p>\n</section>\n<section id=\"write-your-views\">\n<h2>뷰 작성하기<a class=\"heading-anchor\" href=\"#write-your-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>각각의 뷰는 다음 두 가지 중 하나를 수행할 책임이 있습니다. 요청된 페이지의 내용을 담고 있는 <a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> 객체를 반환하거나, <a class=\"reference internal\" href=\"/ko/3.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a> 같은 예외를 발생시키는 것 입니다. 나머지는 여러분에게 달려있습니다.</p>\n<p>일반적으로 뷰는 파라미터들에 따라 데이터를 가져오며 템플릿을 로드하고 템플릿을 가져온 데이타로 렌더링합니다. 아래는 위에서 만든 <code class=\"docutils literal notranslate\"><span class=\"pre\">year_archive</span></code>에 대한 예제 뷰입니다.</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">mysite/news/views.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">year_archive</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">year</span><span class=\"p\">):</span>\n    <span class=\"n\">a_list</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"n\">year</span><span class=\"p\">)</span>\n    <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;year&#39;</span><span class=\"p\">:</span> <span class=\"n\">year</span><span class=\"p\">,</span> <span class=\"s1\">&#39;article_list&#39;</span><span class=\"p\">:</span> <span class=\"n\">a_list</span><span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;news/year_archive.html&#39;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>이 예제는 Django의 <a class=\"reference internal\" href=\"/ko/3.1/topics/templates/\"><span class=\"doc\">템플릿 시스템</span></a>을 사용합니다. Django 템플릿 시스템은 몇몇 강력한 기능들을 가지고 있지만 프로그래머가 아닌 사람도 사용하기에 어렵지 않도록 간결함을 유지하도록 노력하였습니다.</p>\n</section>\n<section id=\"design-your-templates\">\n<h2>여러분만의 템플릿 작성<a class=\"heading-anchor\" href=\"#design-your-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>위의 코드는 <code class=\"docutils literal notranslate\"><span class=\"pre\">news/year_archive.html</span></code> 템플릿을 로드합니다.</p>\n<p>장고는 여러분이 템플릿들중 중복을 최소화할 수 있게 하는 템플릿 검색 경로를 가지고 있습니다. 여러분의 장소 셋팅에 <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> 템플릿을 확인하기 위한 디렉토리의 목록을 명시합니다.  만약 첫번째 디렉토리에 템플릿이 존재하지 않으면, 두번째 디렉토리, 그 외 디렉토리를 점검합니다.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">news/year_archive.html</span></code> 템플릿을 발견했다고 합시다.  아마도 이런 모양일 것입니다:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\">mysite/news/templates/news/year_archive.html</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>Articles for <span class=\"cp\">{{</span> <span class=\"nv\">year</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>Articles for <span class=\"cp\">{{</span> <span class=\"nv\">year</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">article</span> <span class=\"k\">in</span> <span class=\"nv\">article_list</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">article.headline</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>By <span class=\"cp\">{{</span> <span class=\"nv\">article.reporter.full_name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>Published <span class=\"cp\">{{</span> <span class=\"nv\">article.pub_date</span><span class=\"o\">|</span><span class=\"nf\">date</span><span class=\"s2\">:&quot;F j, Y&quot;</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<p>변수는 이중 중괄호로 둘러싸입니다. <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">article.headline</span> <span class=\"pre\">}}</span></code> 의 뜻은 “article의 headline 속성의 값을 출력하겠다.” 입니다. 하지만 마침표가 속성의 조회에만 사용되는것은 아닙니다. 점은 사전의 키 조회에도 사용될수 있으며 인덱스 조회와 함수 호출에도 사용될 수 있습니다.</p>\n<p>참고로 <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">article.pub_date|date:&quot;F</span> <span class=\"pre\">j,</span> <span class=\"pre\">Y&quot;</span> <span class=\"pre\">}}</span></code>는 유닉스 스타일의 “파이프”(“|” 문자)를 사용한것입니다. 이 파이프는 템플릿 필터를 호출하며 이를 통해 변수의 값을 필터링 할 수 있습니다. 이 코드에서 date 필터는 파이썬의 datetime 개체를 지정한 포맷으로 변환 시킵니다.(PHP의 date 함수처럼 말이죠, 네 PHP 의 좋은 아이디어 중에 하나입니다.)</p>\n<p>여러분은 좋아하는 여러 필터들을 함께 연결할 수 있습니다. 여러분은 <a class=\"reference internal\" href=\"/ko/3.1/howto/custom-template-tags/#howto-writing-custom-template-filters\"><span class=\"std std-ref\">커스텀 템플릿 필터</span></a>를 작성할 수 있습니다. 여러분은 은밀하게 실행되는 커스텀 파이썬 코드인 <a class=\"reference internal\" href=\"/ko/3.1/howto/custom-template-tags/\"><span class=\"doc\">커스텀 템플릿 태그</span></a>를 작성할 수도 있습니다.</p>\n<p>이제 마지막으로 Django의 “템플릿 상속” 개념을 사용해 보죠. 이를 통해 <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">extends</span> <span class=\"pre\">&quot;base.html&quot;</span> <span class=\"pre\">%}</span></code> 코드가 무슨 일을 하는지 알 수 있습니다. 이 코드의 의미는 ”한 뭉치의 block들이 정의된 ‘base’라는 템플릿을 먼저 로드하고 뒤따르는 block들로 이 block들을 채운다는것”입니다. 간단히 말해 템플릿 안의 중복을 극적으로 낮추게 합니다. 각각의 템플릿은 자신이 표현하려는 내용들만 정의할 수 있게 되기 때문입니다.</p>\n<p>“base.html” 템플릿은 <a class=\"reference internal\" href=\"/ko/3.1/howto/static-files/\"><span class=\"doc\">정적 파일</span></a>의 사용을 포함하여, 다음과 같이 보일 것입니다.</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\">mysite/templates/base.html</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">static</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">img</span> <span class=\"na\">src</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">static</span> <span class=\"s1\">&#39;images/sitelogo.png&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"na\">alt</span><span class=\"o\">=</span><span class=\"s\">&quot;Logo&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>Simplistically, it defines the look-and-feel of the site (with the site’s logo),\nand provides “holes” for child templates to fill. This means that a site redesign\ncan be done by changing a single file – the base template.</p>\n<p>It also lets you create multiple versions of a site, with different base\ntemplates, while reusing child templates. Django’s creators have used this\ntechnique to create strikingly different mobile versions of sites by only\ncreating a new base template.</p>\n<p>여러분이 선호하는 템플릿 시스템이 있다면 꼭 Django의 템플릿 시스템을 사용할 필요는 없습니다. Django의 템플릿 시스템은 Django의 모델계층과 매우 잘 통합되어 있지만 꼭 이를 사용하도록 강제하는 것은 아닙니다. 이러한 이유들로 Django의 데이터베이스 API 역시 반드시 써야 할 필요는 없습니다. 여러분은 다른 데이터베이스 추상화 계층을 사용할수 있으며 XML 파일이나 디스크에서 다른 파일을 사용하거나 여러분이 원하는 다른 여러가지 방식으로 사용할수도 있습니다. 각각의 Django 구성요소들 – 모델, 뷰, 템플릿 – 은 서로 결합도가 낮게 되어있습니다.</p>\n</section>\n<section id=\"this-is-just-the-surface\">\n<h2>이건 단지 껍데기일 뿐<a class=\"heading-anchor\" href=\"#this-is-just-the-surface\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>이건 Django의 기능에 대한 간략한 개요에 불과합니다. 다음과 같이 좀 더 유용한 기능들도 많습니다.</p>\n<ul class=\"simple\">\n<li><p>memached나 기타 백엔드와 통합된 <a class=\"reference internal\" href=\"/ko/3.1/topics/cache/\"><span class=\"doc\">캐시 프레임워크</span></a>.</p></li>\n<li><p>A <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/syndication/\"><span class=\"doc\">syndication framework</span></a> that lets you\ncreate RSS and Atom feeds by writing a small Python class.</p></li>\n<li><p>이보다 더 매력적인 자동생성 관리자 기능 – 이 개요는 극히 일부만 다루었습니다.</p></li>\n</ul>\n<p>The next steps are for you to <a class=\"reference external\" href=\"https://www.djangoproject.com/download/\">download Django</a>, read <a class=\"reference internal\" href=\"/ko/3.1/intro/tutorial01/\"><span class=\"doc\">the tutorial</span></a> and join <a class=\"reference external\" href=\"https://www.djangoproject.com/community/\">the community</a>. Thanks for your interest!</p>\n</section>","rootId":"django-at-a-glance","toc":[{"title":"모델 설계","anchor":"design-your-model","children":[]},{"title":"설치하기","anchor":"install-it","children":[]},{"title":"자유로운 API 즐기기","anchor":"enjoy-the-free-api","children":[]},{"title":"동적인 관리자 인터페이스: 단순한 뼈대 세우기가 아닙니다 – 이것은 완성된 집입니다","anchor":"a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house","children":[]},{"title":"URL 설계","anchor":"design-your-urls","children":[]},{"title":"뷰 작성하기","anchor":"write-your-views","children":[]},{"title":"여러분만의 템플릿 작성","anchor":"design-your-templates","children":[]},{"title":"이건 단지 껍데기일 뿐","anchor":"this-is-just-the-surface","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"시작하기","url":"/ko/3.1/intro/"}],"prev":{"docname":"intro/index","title":"시작하기","url":"/ko/3.1/intro/"},"next":{"docname":"intro/install","title":"빠른 설치 가이드","url":"/ko/3.1/intro/install/"},"formats":{"html":"/ko/3.1/intro/overview/","markdown":"/ko/3.1/intro/overview.md","json":"/ko/3.1/intro/overview.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/intro/overview.txt","official":"https://docs.djangoproject.com/ko/3.1/intro/overview/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}