{"title":"심화 튜토리얼: 재사용 가능한 앱을 만드는 법","version":"6.0","locale":"ko","docname":"intro/reusable-apps","url":"/ko/6.0/intro/reusable-apps/","canonical":"https://djangodocs.dev/ko/6.0/intro/reusable-apps/","summary":"This advanced tutorial begins where Tutorial 8 left off. We’ll be turning our web-poll into a standalone Python package you can reuse in new projects and share with…","html":"<h1>심화 튜토리얼: 재사용 가능한 앱을 만드는 법<a class=\"heading-anchor\" href=\"#advanced-tutorial-how-to-write-reusable-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>This advanced tutorial begins where <a class=\"reference internal\" href=\"/ko/6.0/intro/tutorial08/\"><span class=\"doc\">Tutorial 8</span></a>\nleft off. We’ll be turning our web-poll into a standalone Python package\nyou can reuse in new projects and share with other people.</p>\n<p>최근에 튜토리얼 1~8장을 완료하지 않았다면, 이를 다시 살펴보고 예제 프로젝트를 아래에서 설명하는 내용과 일치시키는 것을 권장합니다.</p>\n<section id=\"reusability-matters\">\n<h2>재사용의 중요성<a class=\"heading-anchor\" href=\"#reusability-matters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>웹 어플리케이션을 설계, 빌드, 테스트, 유지하는 것은 꽤나 큰 일입니다. 수많은 Python과 Django 프로젝트들에는 공통적인 문제가 있습니다. 만약 우리가 이러한 반복적인 작업들 중에서 몇몇을 구해낼 수 있다면 정말 멋지지 않을까요?</p>\n<p>재사용성은 Python의 핵심 가치입니다. <a class=\"reference external\" href=\"https://pypi.org/\">Python Package Index(PyPI)</a>에는 여러분의 Python 프로그램에 사용할 수 있는 방대한 패키지가 있습니다. 여러분의 프로젝트에 활용할 수 있는 재사용 가능 앱을 <a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a>에서 확인하세요. Django는 그 자체로서 Python 패키지이기도 합니다. 이는 기존 Python 패키지 또는 Django 앱을 가져다가 당신의 웹 프로젝트에 이용할 수 있음을 의미합니다. 프로젝트만의 고유한 부분을 작성하기만 하면 됩니다.</p>\n<p>이제 우리가 작업했던 것과 같은 설문조사 앱이 필요하여 새로운 프로젝트를 시작했다고 가정해봅시다. 어떻게 이 앱을 재사용할 수 있게 만들 수 있을까요? 운 좋게도, 여러분은 이미 방법을 알고 있습니다. <a class=\"reference internal\" href=\"/ko/6.0/intro/tutorial01/\"><span class=\"doc\">튜토리얼 1장</span></a> 에서, 우리는 <code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code> 를 이용하여 프로젝트 수준의 URLconf에서 설문조사를 분리하는 방법을 배웠습니다. 이 튜토리얼에서는, 새로운 프로젝트에서 사용하기 쉬운 앱을 만들고 이 앱을 설치하고 사용할 다른 사람들을 위해 게시할 준비를 하기 위한 추가적인 작업을 진행할 것입니다.</p>\n<aside class=\"admonition-package-app admonition\">\n<p class=\"admonition-title\">패키지? 앱?</p>\n<p>Python <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-package\" title=\"(Python v3.14에서)\"><span class=\"xref std std-term\">package</span></a>는 재사용을 쉽게 하기 위해 연관된 Python 코드를 묶어 놓은 것입니다. 패키지에는 Python 코드가 들어있는 하나 이상의 파일(“모듈”이라고도 함)들이 포함되어  있습니다.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">import</span> <span class=\"pre\">foo.bar</span></code> 나 <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">foo</span> <span class=\"pre\">import</span> <span class=\"pre\">bar</span></code> 로 패키지를 import 할 수 있습니다. 디렉토리(<code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>와 같은)는 패키지를 형성하기 위해, 특별한 파일 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code>를 포함하고 있습니다, 그 파일이 빈파일일 경우에도 포함하고 있습니다.</p>\n<p>Django <em>어플리케이션</em>은 Django 프로젝트에 사용하기 위한 파이썬 패키지일 뿐입니다. 애플리케이션은 <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">tests</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">urls</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">views</span></code> 서브모듈들을 포함하고 있는 공통적인 Django 규칙을 이용할 수 있습니다.</p>\n<p>여기서는 다른 사람들이 Python 패키지를 쉽게 설치할 수 있게 만드는 과정을 이르는 데 <em>패키징</em>이라는 용어를 사용할 것입니다. 약간 혼동될 수도 있습니다.</p>\n</aside>\n</section>\n<section id=\"your-project-and-your-reusable-app\">\n<h2>프로젝트와 재사용가능한 앱<a class=\"heading-anchor\" href=\"#your-project-and-your-reusable-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>이전 튜토리얼을 마치면, 프로젝트는 다음과 같을 것입니다.</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>djangotutorial/\n    manage.py\n    mysite/\n        __init__.py\n        settings.py\n        urls.py\n        asgi.py\n        wsgi.py\n    polls/\n        __init__.py\n        admin.py\n        apps.py\n        migrations/\n            __init__.py\n            0001_initial.py\n        models.py\n        static/\n            polls/\n                images/\n                    background.png\n                style.css\n        templates/\n            polls/\n                detail.html\n                index.html\n                results.html\n        tests.py\n        urls.py\n        views.py\n    templates/\n        admin/\n            base_site.html\n</code></pre></div>\n<p>여러분은 <span class=\"xref std std-doc\">튜토리얼 7 &lt;/intro/tutorial07&gt;`에서 ``djangotutorial/templates``를, :doc:`Tutorial 3 &lt;/intro/tutorial03&gt;`에서 ``polls/templates``를 생성했습니다. 이제 프로젝트와 애플리케이션의 템플릿 디렉터리를 분리한 이유가 더 명확해졌을 것입니다. ``polls`</span> 애플리케이션과 관련된 모든 구성 요소는 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>polls``에 포함되어 있습니다. 이렇게 하면 애플리케이션이 독립적으로 구성되어 새로운 프로젝트에서도 쉽게 사용할 수 있습니다.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> 디렉토리가 이제 새 Django 프로젝트로 복사되었고, 바로 재사용할 수 있습니다. 그래도 게시 할 준비가 되지 않았습니다. 이를 위해, 다른 사람들이 쉽게 설치할 수 있도록 앱을 패키지화해야합니다.</p>\n</section>\n<section id=\"installing-some-prerequisites\">\n<span id=\"installing-reusable-apps-prerequisites\"></span><h2>필수 구성 요소 설치<a class=\"heading-anchor\" href=\"#installing-some-prerequisites\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Python  패키징의 현재 상태는 다양한 도구들로 인해 약간 혼란스럽습니다. 이 튜토리얼에서는 패키지를 빌드하는데 <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/setuptools`을 사용할 것입니다. 권장 패키징 도구(``distribute`/\">setuptools`을 사용할 것입니다. 권장 패키징 도구(``distribute`</a> 포크와 병합된)입니다. 설치하고 삭제하기 위해 <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pip`을 사용할 것입니다. 당신은 이제 두 패키지를 설치해야합니다. 도움이 필요하면 :ref:/\">pip`을 사용할 것입니다. 당신은 이제 두 패키지를 설치해야합니다. 도움이 필요하면 :ref:</a> pip로 Django 설치하는 법 &lt;installing-official-release&gt;`.을 참조할 수 있습니다. 같은 방법으로  <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>setuptools``도 설치할 수 있습니다.</p>\n</section>\n<section id=\"packaging-your-app\">\n<h2>앱 패키징하기<a class=\"heading-anchor\" href=\"#packaging-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>파이썬 <em>패키징</em> 은 쉽게 설치하고 사용할 수 있는 특별한 형식으로 앱을 준비하는 것을 의미합니다. 장고 자체도 이와 같이 패키지화되어 있습니다. 설문조사처럼 작은 앱은 이 과정이 어렵지 않습니다.</p>\n<ol class=\"arabic\">\n<li><p>첫째로, 장고 프로젝트의 외부 경로에, 패키지를 위한 부모 폴더를 만듭니다. 이 폴더를 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>django-polls``라고 부르겠습니다.</p>\n<aside class=\"admonition-choosing-a-name-for-your-app admonition\">\n<p class=\"admonition-title\">앱 이름 선택</p>\n<p>패키지 이름을 정할 때 기존 패키지와의 충돌을 피하려면 PyPI를 확인하세요. 패키지 이름은 Django 전용임을 나타내기 위해 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-</span></code> 접두사를 사용하는 것을 권장하며, 이에 맞춰 모듈 이름에는 <code class=\"docutils literal notranslate\"><span class=\"pre\">django_</span></code> 접두사를 사용하는 것이 좋습니다. 예를 들어 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-ratelimit</span></code> 패키지에는 <code class=\"docutils literal notranslate\"><span class=\"pre\">django_ratelimit</span></code> 모듈이 포함되어 있습니다.</p>\n<p>어플리케이션 라벨(즉, 애플리케이션 패키지 경로의 마지막 부분)은 <a class=\"reference internal\" href=\"/ko/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>에서 <em>유일한</em> 것이어야 합니다. <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code> 같은 Django <a class=\"reference internal\" href=\"/ko/6.0/ref/contrib/\"><span class=\"doc\">contrib 패키지</span></a>와 동일한 라벨을 사용하지 마세요.</p>\n</aside>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> 디렉토리를 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> 디렉토리로 이동한 후, 이름을 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>django_polls``로 변경하세요.</p></li>\n<li><p>:attr:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~.AppConfig.name`이 새 모듈 이름을 참조하도록 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>django_polls/apps.py``를 수정하세요. 또한 앱에 짧은 이름을 부여하려면 :attr:<a href=\"#id5\"><span class=\"problematic\" id=\"id6\">`</span></a>~.AppConfig.label`을 추가하고, 재사용 가능한 앱의 사용자가 :setting:<a href=\"#id7\"><span class=\"problematic\" id=\"id8\">`</span></a>DEFAULT_AUTO_FIELD`를 변경하더라도 마이그레이션에 영향을 주지 않도록 :attr:<a href=\"#id9\"><span class=\"problematic\" id=\"id10\">`</span></a>~.AppConfig.default_auto_field`를 설정하세요.</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/django_polls/apps.py</span></code></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.apps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AppConfig</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PollsConfig</span><span class=\"p\">(</span><span class=\"n\">AppConfig</span><span class=\"p\">):</span>\n    <span class=\"n\">default_auto_field</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django.db.models.BigAutoField&quot;</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;django_polls&quot;</span>\n    <span class=\"n\">label</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;polls&quot;</span>\n</code></pre></figure>\n</li>\n<li><p>다음과 같은 내용으로 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/README.rst</span></code>를 생성합니다:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"rst\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/README.rst</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"gh\">============</span>\n<span class=\"gh\">django-polls</span>\n<span class=\"gh\">============</span>\n\ndjango-polls is a Django app to conduct web-based polls. For each\nquestion, visitors can choose between a fixed number of answers.\n\nDetailed documentation is in the &quot;docs&quot; directory.\n\n<span class=\"gh\">Quick start</span>\n<span class=\"gh\">-----------</span>\n\n<span class=\"m\">1.</span> Add &quot;polls&quot; to your INSTALLED_APPS setting like this::\n\n    INSTALLED_APPS = [\n<span class=\"c\">        ...,</span>\n<span class=\"c\">        &quot;django_polls&quot;,</span>\n<span class=\"c\">    ]</span>\n\n<span class=\"m\">2.</span> Include the polls URLconf in your project urls.py like this::\n\n    path(&quot;polls/&quot;, include(&quot;django_polls.urls&quot;)),\n\n<span class=\"m\">3.</span> Run <span class=\"s\">``python manage.py migrate``</span> to create the models.\n\n<span class=\"m\">4.</span> Start the development server and visit the admin to create a poll.\n\n<span class=\"m\">5.</span> Visit the <span class=\"s\">``/polls/``</span> URL to participate in the poll.\n</code></pre></figure>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/LICENSE</span></code> 파일을 생성합니다. 라이선스 선택은 이 튜토리얼의 범위를 벗어나므로, 라이선스 없이 공개된 코드는 <em>쓸모없음</em> 을 의미한다는 것만 말해두겠습니다.  Django와 많은 Django 호환 앱들이 BSD 라이센스로 배포되고 있습니다; 그러나 자신의 라이센스를 자유롭게 선택할 수 있습니다. 라이선스 선택이 누군가 여러분의 코드를 사용하는데 영향이 미칠수 있다는 사실은 알고 있어야합니다.</p></li>\n<li><p>다음으로, 앱을 빌드하고 설치하는 방법을 정의하는``pyproject.toml`` 파일을 생성합니다. 이 파일에 대한 자세한 설명은 이 튜토리얼의 범위를 벗어나지만, Python Packaging User Guide &lt;https://packaging.python.org/guides/writing-pyproject-toml/&gt;`_에 잘 설명되어 있습니다. 다음 내용으로 ``django-polls/pyproject.toml` 파일을 생성하세요.</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"toml\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/pyproject.toml</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Toml</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=\"Toml code\"><code><span class=\"k\">[build-system]</span>\n<span class=\"n\">requires</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"s2\">&quot;setuptools&gt;83&quot;</span><span class=\"p\">]</span>\n<span class=\"n\">build-backend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;setuptools.build_meta&quot;</span>\n\n<span class=\"k\">[project]</span>\n<span class=\"n\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;django-polls&quot;</span>\n<span class=\"n\">version</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;0.1&quot;</span>\n<span class=\"n\">dependencies</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;django&gt;=X.Y&quot;</span><span class=\"p\">,</span><span class=\"w\">  </span><span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n<span class=\"p\">]</span>\n<span class=\"n\">description</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;A Django app to conduct web-based polls.&quot;</span>\n<span class=\"n\">readme</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;README.rst&quot;</span>\n<span class=\"n\">license</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;BSD-3-Clause&quot;</span>\n<span class=\"n\">requires-python</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;&gt;= 3.12&quot;</span>\n<span class=\"n\">authors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span>\n<span class=\"w\">    </span><span class=\"p\">{</span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"p\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;Your Name&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">email</span><span class=\"w\"> </span><span class=\"p\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;yourname@example.com&quot;</span><span class=\"p\">},</span>\n<span class=\"p\">]</span>\n<span class=\"n\">classifiers</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Environment :: Web Environment&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Framework :: Django&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Framework :: Django :: X.Y&quot;</span><span class=\"p\">,</span><span class=\"w\">  </span><span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Intended Audience :: Developers&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Operating System :: OS Independent&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3 :: Only&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3.12&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3.13&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Programming Language :: Python :: 3.14&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Topic :: Internet :: WWW/HTTP&quot;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s2\">&quot;Topic :: Internet :: WWW/HTTP :: Dynamic Content&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n\n<span class=\"k\">[project.urls]</span>\n<span class=\"n\">Homepage</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;https://www.example.com/&quot;</span>\n</code></pre></figure>\n</li>\n<li><p>기본적으로 여러 일반적인 파일과 Python 모듈 및 패키지가 패키지에 포함됩니다. 추가 파일을 포함하려면 <code class=\"docutils literal notranslate\"><span class=\"pre\">MANIFEST.in</span></code> 파일을 생성해야 합니다. 템플릿과 정적 파일을 포함하려면, 다음 내용으로 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code> 파일을 생성하세요.</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"text\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>recursive-include django_polls/static *\nrecursive-include django_polls/templates *\n</code></pre></figure>\n</li>\n<li><p>선택 사항이지만, 앱에 자세한 문서를 포함하는 것을 권장합니다. 향후 문서를 위해 빈 디렉토리 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>django-polls/docs``를 생성하세요.</p>\n<p>파일을 추가하지 않으면 <code class=\"docutils literal notranslate\"><span class=\"pre\">docs</span></code> 디렉토리는 패키지에 포함되지 않을 것입니다. 많은 Django 앱들이 <a class=\"reference external\" href=\"https://readthedocs.org\">readthedocs.org</a> 같은 사이트들을 통해 온라인 문서를 제공합니다.</p>\n<p>Django와 Python 자체를 포함한 많은 Python 프로젝트는 Sphinx &lt;https://www.sphinx-doc.org/en/master/usage/quickstart.html&gt;`_를 사용하여 문서를 빌드합니다. Sphinx를 사용하기로 선택했다면, `Intersphinx &lt;https://www.sphinx-doc.org/en/master/usage/quickstart.html#intersphinx&gt;`_를 구성하고 프로젝트의 ``intersphinx_mapping` 설정에 Django 값을 포함하여 Django 문서로 연결할 수 있습니다:</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=\"n\">intersphinx_mapping</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;django&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span>\n        <span class=\"s2\">&quot;https://docs.djangoproject.com/en/stable/&quot;</span><span class=\"p\">,</span>\n        <span class=\"kc\">None</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>이렇게 설정하면 Django 문서와 같은 방식으로 “<code class=\"docutils literal notranslate\"><span class=\"pre\">:attr:`django.test.TransactionTestCase.databases`</span></code>”와 같은 특정 항목에 교차 링크를 걸 수 있습니다.</p>\n</li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/build/\">build</a> 패키지가 설치되었는지 확인하고(<code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">-m</span> <span class=\"pre\">pip</span> <span class=\"pre\">install</span> <span class=\"pre\">build</span></code>), <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> 디렉토리에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">-m</span> <span class=\"pre\">build``를</span> <span class=\"pre\">실행해</span> <span class=\"pre\">패키지를</span> <span class=\"pre\">빌드해</span> <span class=\"pre\">보세요.</span> <span class=\"pre\">그러면</span> <span class=\"pre\">``dist``라는</span> <span class=\"pre\">디렉토리가</span> <span class=\"pre\">생성되고,</span> <span class=\"pre\">새</span> <span class=\"pre\">패키지가</span> <span class=\"pre\">소스</span> <span class=\"pre\">및</span> <span class=\"pre\">바이너리</span> <span class=\"pre\">형식(``django_polls-0.1.tar.gz</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">django_polls-0.1-py3-none-any.whl</span></code>)으로 빌드됩니다.</p></li>\n</ol>\n<p>패키징에 관한 더 자세한 정보는 파이썬의 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>프로젝트 패키징 및 배포에 관한 튜토리얼 &lt;<a class=\"reference external\" href=\"https://packaging.python.org/distributing/\">https://packaging.python.org/distributing/</a>&gt;`_을 참조하십시오.</p>\n</section>\n<section id=\"using-your-own-package\">\n<h2>여러분의 패키지 사용하기<a class=\"heading-anchor\" href=\"#using-your-own-package\"><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\">polls</span></code> 디렉토리를 프로젝트 바깥으로 이동했으므로, 작동하지 않을것입니다. 우리의 새 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> 패키지를 설치하여 이 문제를 해결할 것입니다.</p>\n<aside class=\"admonition-installing-as-a-user-library admonition\">\n<p class=\"admonition-title\">유저 라이브러리 설치하기</p>\n<p>다음 단계는 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> 를 사용자 라이브러리로 설치합니다. 사용자 단위 설치는  관리자권한 접근이 안되는 시스템 뿐만아니라 시스템 서비스나 다른 사용자들의 영향으로부터 패키지를 보호하는 것 같은 이점이 많습니다.</p>\n<p>사용자별 설치는 여전히 해당 사용자로 실행되는 시스템 도구의 동작에 영향을 미칠 수 있으므로 가상 환경을 사용하는 것이 더 강력한 해결 방법입니다(아래 참조).</p>\n</aside>\n<ol class=\"arabic\">\n<li><p>패키지를 설치하기 위해 pip를 사용하세요 (당신은 이미 <a class=\"reference internal\" href=\"#installing-reusable-apps-prerequisites\"><span class=\"std std-ref\">설치하였습니다.</span></a> 그렇죠?),</p>\n<div class=\"code-block\" data-language=\"shell\"><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>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>--user<span class=\"w\"> </span>django-polls/dist/django_polls-0.1.tar.gz\n</code></pre></div>\n</li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>mysite/settings.py``가 새 모듈 이름을 가리키도록 업데이트하세요:</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=\"n\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django_polls.apps.PollsConfig&quot;</span><span class=\"p\">,</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>mysite/urls.py``가 새 모듈 이름을 가리키도록 업데이트하세요:</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=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;polls/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s2\">&quot;django_polls.urls&quot;</span><span class=\"p\">)),</span>\n    <span class=\"o\">...</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n<li><p>프로젝트가 계속 정상적으로 동작하는지 확인하려면 개발 서버를 실행하세요.</p></li>\n</ol>\n</section>\n<section id=\"publishing-your-app\">\n<h2>앱 퍼블리싱<a class=\"heading-anchor\" href=\"#publishing-your-app\"><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\">django-polls</span></code> 를 패키지화하고 테스트했기에, 세계와 공유할 준비가 되었습니다. 단순한 예제가 아니면, 여러분은 이제 아래와 같은 것들을 할 수 있습니다:</p>\n<ul class=\"simple\">\n<li><p>친구에게 패키지를 이메일로 보내기</p></li>\n<li><p>웹사이트에 패키지 업로드</p></li>\n<li><p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>the Python Package Index (PyPI)`_와 같은 공용 저장소에 패키지를 게시하세요. 이를 위한 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>좋은 튜토리얼 &lt;<a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives\">https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives</a>&gt;`_도 제공됩니다.</p></li>\n</ul>\n</section>\n<section id=\"installing-python-packages-with-a-virtual-environment\">\n<h2>파이썬 패키지를 가상 환경으로 설치하기<a class=\"heading-anchor\" href=\"#installing-python-packages-with-a-virtual-environment\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>앞에서 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>django-polls``를 사용자 라이브러리로 설치했습니다. 이 방식에는 몇 가지 단점이 있습니다:</p>\n<ul class=\"simple\">\n<li><p>사용자 라이브러리를 수정하면 시스템의 다른 파이썬 소프트웨어에 영향을 미칠 수 있습니다.</p></li>\n<li><p>이 패키지의 여러 버전 (또는 이름이 같은 다른 버전)을 실행할 수 없습니다.</p></li>\n</ul>\n<p>일반적으로 이러한 상황들은 여러 Django 프로젝트를 유지보수할 때만 발생합니다. 이러한 경우, 최선의 해결책은 :doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>venv &lt;python:tutorial/venv&gt;`를 사용하는 것입니다. 이 도구를 사용하면 각각 고유한 라이브러리 및 패키지 네임스페이스 복사본이 있는 다수의 분리된 Python 환경을 유지할 수 있습니다.</p>\n</section>","rootId":"advanced-tutorial-how-to-write-reusable-apps","toc":[{"title":"재사용의 중요성","anchor":"reusability-matters","children":[]},{"title":"프로젝트와 재사용가능한 앱","anchor":"your-project-and-your-reusable-app","children":[]},{"title":"필수 구성 요소 설치","anchor":"installing-some-prerequisites","children":[]},{"title":"앱 패키징하기","anchor":"packaging-your-app","children":[]},{"title":"여러분의 패키지 사용하기","anchor":"using-your-own-package","children":[]},{"title":"앱 퍼블리싱","anchor":"publishing-your-app","children":[]},{"title":"파이썬 패키지를 가상 환경으로 설치하기","anchor":"installing-python-packages-with-a-virtual-environment","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"시작하기","url":"/ko/6.0/intro/"}],"prev":{"docname":"intro/tutorial08","title":"첫 번째 Django 앱 작성하기, part 8","url":"/ko/6.0/intro/tutorial08/"},"next":{"docname":"intro/whatsnext","title":"다음에 읽을 내용","url":"/ko/6.0/intro/whatsnext/"},"formats":{"html":"/ko/6.0/intro/reusable-apps/","markdown":"/ko/6.0/intro/reusable-apps.md","json":"/ko/6.0/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/ko/6.0/intro/reusable-apps/","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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}