{"title":"심화 튜토리얼: 재사용 가능한 앱을 만드는 법","version":"3.0","locale":"ko","docname":"intro/reusable-apps","url":"/ko/3.0/intro/reusable-apps/","canonical":"https://djangodocs.dev/ko/3.0/intro/reusable-apps/","summary":"이 심화 튜토리얼은 튜토리얼 7장 의 완료 지점에서 시작합니다. 이제 우리의 Web-poll을 새 프로젝트에서 재사용하거나 다른 사람들과 공유할 수 있는 독립적인 파이썬 패키지로 만들 것입니다. 아직 튜토리얼 1~7장을 완료하지 않았다면, 읽어보고 당신의 예제 프로젝트를 아래에 설명하는 것과…","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>이 심화 튜토리얼은 <a class=\"reference internal\" href=\"/ko/3.0/intro/tutorial07/\"><span class=\"doc\">튜토리얼 7장</span></a>의 완료 지점에서 시작합니다. 이제 우리의 Web-poll을 새 프로젝트에서 재사용하거나 다른 사람들과 공유할 수 있는 독립적인 파이썬 패키지로 만들 것입니다.</p>\n<p>아직 튜토리얼 1~7장을 완료하지 않았다면, 읽어보고 당신의 예제 프로젝트를 아래에 설명하는 것과 일치시킬 것을 권장합니다.</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>Reusability is the way of life in Python. <a class=\"reference external\" href=\"https://pypi.org/\">The Python Package Index (PyPI)</a> has a vast range of packages you can use in your own\nPython programs. Check out <a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a> for\nexisting reusable apps you could incorporate in your project. Django itself is\nalso a normal Python package. This means that you can take existing Python\npackages or Django apps and compose them into your own web project. You only\nneed to write the parts that make your project unique.</p>\n<p>이제 우리가 작업했던 것과 같은 설문조사 앱이 필요하여 새로운 프로젝트를 시작했다고 가정해봅시다. 어떻게 이 앱을 재사용할 수 있게 만들 수 있을까요? 운 좋게도, 여러분은 이미 방법을 알고 있습니다. <a class=\"reference internal\" href=\"/ko/3.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>A Django <em>application</em> is a Python package that is specifically intended\nfor use in a Django project. An application may use common Django\nconventions, such as having <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>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">views</span></code>\nsubmodules.</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=\"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\">mysite</span><span class=\"o\">/</span>\n    <span class=\"n\">manage</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">mysite</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">asgi</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">wsgi</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">polls</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">migrations</span><span class=\"o\">/</span>\n            <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n            <span class=\"mi\">0001</span><span class=\"n\">_initial</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">static</span><span class=\"o\">/</span>\n            <span class=\"n\">polls</span><span class=\"o\">/</span>\n                <span class=\"n\">images</span><span class=\"o\">/</span>\n                    <span class=\"n\">background</span><span class=\"o\">.</span><span class=\"n\">gif</span>\n                <span class=\"n\">style</span><span class=\"o\">.</span><span class=\"n\">css</span>\n        <span class=\"n\">templates</span><span class=\"o\">/</span>\n            <span class=\"n\">polls</span><span class=\"o\">/</span>\n                <span class=\"n\">detail</span><span class=\"o\">.</span><span class=\"n\">html</span>\n                <span class=\"n\">index</span><span class=\"o\">.</span><span class=\"n\">html</span>\n                <span class=\"n\">results</span><span class=\"o\">.</span><span class=\"n\">html</span>\n        <span class=\"n\">tests</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">templates</span><span class=\"o\">/</span>\n        <span class=\"n\">admin</span><span class=\"o\">/</span>\n            <span class=\"n\">base_site</span><span class=\"o\">.</span><span class=\"n\">html</span>\n</code></pre></div>\n<p>여러분은 <a class=\"reference internal\" href=\"/ko/3.0/intro/tutorial07/\"><span class=\"doc\">튜토리얼 7</span></a> 에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/templates</span></code>  나 <a class=\"reference internal\" href=\"/ko/3.0/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a> 에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates</span></code>  를 생성하였습니다. 이제 프로젝트와 어플리케이션으로 분리한 이유가 명확합니다. <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> 어플리케이션의 부분들은 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>에 모두 있습니다.  It makes the application self-contained and easier to drop into a new project.</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>파이썬 패키징의 현재상태는 다양한 도구들로 인해 약간 혼란스럽습니다. 이 튜토리얼에서, 우리의 패키지를 빌드하는데 <a class=\"reference external\" href=\"https://pypi.org/project/setuptools/\">setuptools</a> 를 사용할 것입니다. 권장 패키징 도구(<code class=\"docutils literal notranslate\"><span class=\"pre\">distribute</span></code> 포크와 병합된)입니다. 설치하고 재설치하는데 <a class=\"reference external\" href=\"https://pypi.org/project/pip/\">pip</a> 를 사용할 수도 있습니다. 이제 이 두 패키지들을 설치해야합니다. 도움이 필요하면 <a class=\"reference internal\" href=\"/ko/3.0/topics/install/#installing-official-release\"><span class=\"std std-ref\">pip로 Django 설치하는 법</span></a> 을 참조할 수 있습니다. 같은 방법으로 <code class=\"docutils literal notranslate\"><span class=\"pre\">setuptools</span></code> 도 설치할 수 있습니다.</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>먼저, Django 프로젝트 외부에 <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-choosing-a-name-for-your-app admonition\">\n<p class=\"admonition-title\">앱 이름 선택</p>\n<p>패키지 이름을 선택할 때, 기존 패키지들과 충돌을 피하기 위해 PyPI 같은 리소스들을 점검하세요.  배포할 패키지를 생성할 때, 모듈 이름 앞에 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-</span></code> 를 앞에 붙이는 것이 좋습니다. 이러면 Django 앱을 찾는 다른 사용자가 여러분의 앱을 Django 고유 앱으로 인식하는데 도움이 됩니다.</p>\n<p>애플리케이션 라벨(즉, 애플리케이션 패키지 경로의 마지막 부분)은 <a class=\"reference internal\" href=\"/ko/3.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/3.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\">django-polls</span></code> 디렉토리의 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> 디렉토리로 이동하세요.</p></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\">django-polls/README.rst</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\">Polls</span>\n<span class=\"gh\">=====</span>\n\nPolls is a Django app to conduct Web-based polls. For each question,\nvisitors 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\">        &#39;polls&#39;,</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(&#39;polls/&#39;, include(&#39;polls.urls&#39;)),\n\n<span class=\"m\">3.</span> Run <span class=\"s\">``python manage.py migrate``</span> to create the polls models.\n\n<span class=\"m\">4.</span> Start the development server and visit http://127.0.0.1:8000/admin/\n   to create a poll (you&#39;ll need the Admin app enabled).\n\n<span class=\"m\">5.</span> Visit http://127.0.0.1:8000/polls/ 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>Next we’ll create <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.cfg</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.py</span></code> files which detail how to\nbuild and install the app. A full explanation of these files is beyond the\nscope of this tutorial, but the <a class=\"reference external\" href=\"https://setuptools.readthedocs.io/en/latest/\">setuptools documentation</a> has a good explanation.\nCreate the files <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.cfg</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.py</span></code>\nwith the following contents:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"ini\"><figcaption class=\"code-block-caption\">django-polls/setup.cfg</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</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=\"Ini code\"><code><span class=\"k\">[metadata]</span>\n<span class=\"na\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">django-polls</span>\n<span class=\"na\">version</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">0.1</span>\n<span class=\"na\">description</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">A Django app to conduct Web-based polls.</span>\n<span class=\"na\">long_description</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">file: README.rst</span>\n<span class=\"na\">url</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">https://www.example.com/</span>\n<span class=\"na\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">Your Name</span>\n<span class=\"na\">author_email</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">yourname@example.com</span>\n<span class=\"na\">license</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">BSD-3-Clause</span><span class=\"w\">  </span><span class=\"c1\"># Example license</span>\n<span class=\"na\">classifiers</span><span class=\"w\"> </span><span class=\"o\">=</span>\n<span class=\"w\">    </span><span class=\"na\">Environment</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Web Environment</span>\n<span class=\"w\">    </span><span class=\"na\">Framework</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Django</span>\n<span class=\"w\">    </span><span class=\"na\">Framework</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Django :: X.Y</span><span class=\"w\">  </span><span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n<span class=\"w\">    </span><span class=\"na\">Intended Audience</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Developers</span>\n<span class=\"w\">    </span><span class=\"na\">License</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: OSI Approved :: BSD License</span>\n<span class=\"w\">    </span><span class=\"na\">Operating System</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: OS Independent</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3 :: Only</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3.6</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3.7</span>\n<span class=\"w\">    </span><span class=\"na\">Programming Language</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Python :: 3.8</span>\n<span class=\"w\">    </span><span class=\"na\">Topic</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Internet :: WWW/HTTP</span>\n<span class=\"w\">    </span><span class=\"na\">Topic</span><span class=\"w\"> </span><span class=\"o\">:</span><span class=\"s\">: Internet :: WWW/HTTP :: Dynamic Content</span>\n\n<span class=\"k\">[options]</span>\n<span class=\"na\">include_package_data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">true</span>\n<span class=\"na\">packages</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">find:</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">django-polls/setup.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\">setuptools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">setup</span>\n\n<span class=\"n\">setup</span><span class=\"p\">()</span>\n</code></pre></figure>\n</li>\n<li><p>기본적으로 파이썬 모듈들과 패키지들만 패키지에 포함되어 있습니다. 추가 파일을 포함 시키기위해선 <code class=\"docutils literal notranslate\"><span class=\"pre\">MANIFEST.in</span></code> 파일을 만들어야합니다. 이전 단계에서 나온 setuptools 문서에 이 파일에 대해 자세한 설명이 있습니다. 템플릿들, <code class=\"docutils literal notranslate\"><span class=\"pre\">README.rst</span></code> , 우리의 <code class=\"docutils literal notranslate\"><span class=\"pre\">LICENSE</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\">django-polls/MANIFEST.in</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>include LICENSE\ninclude README.rst\nrecursive-include polls/static *\nrecursive-include polls/templates *\n</code></pre></figure>\n</li>\n<li><p>선택사항입니다만, 자세한 문서를 포함시키는 것을 추천합니다. 장래의 문서들을 위해 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/docs</span></code> 라는 빈 디렉토리를 생성합니다. <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code> 에 다음 한줄을 추가합니다:</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\">recursive</span><span class=\"o\">-</span><span class=\"n\">include</span> <span class=\"n\">docs</span> <span class=\"o\">*</span>\n</code></pre></div>\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</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">setup.py</span> <span class=\"pre\">sdist</span></code> 로 패키지를 빌드해보세요 (<code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> 내에서 실행). 이 명령은 <code class=\"docutils literal notranslate\"><span class=\"pre\">dist</span></code> 디렉토리를 생성하고, 새 패키지  <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls-0.1.tar.gz</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>Note that per-user installations can still affect the behavior of system\ntools that run as that user, so using a virtual environment is a more robust\nsolution (see below).</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=\"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\">python</span> <span class=\"o\">-</span><span class=\"n\">m</span> <span class=\"n\">pip</span> <span class=\"n\">install</span> <span class=\"o\">--</span><span class=\"n\">user</span> <span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span><span class=\"o\">/</span><span class=\"n\">dist</span><span class=\"o\">/</span><span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span><span class=\"o\">-</span><span class=\"mf\">0.1</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span>\n</code></pre></div>\n</li>\n<li><p>운이 따라준다면, 여러분의 Django 프로젝트는 이제 잘 작동할 것입니다. 확인해보기위해 서버를 다시 실행하세요.</p></li>\n<li><p>pip를 사용해 패키지를 삭제</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\">python</span> <span class=\"o\">-</span><span class=\"n\">m</span> <span class=\"n\">pip</span> <span class=\"n\">uninstall</span> <span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span>\n</code></pre></div>\n</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>Python 패키지 색인 (PyPI)&lt;<a class=\"reference external\" href=\"https://pypi.org/\">https://pypi.org/</a>&gt;`_과 같은 공용 저장소에 패키지를 게시하십시오. <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>packaging.python.org &lt;<a class=\"reference external\" href=\"https://packaging.python.org\">https://packaging.python.org</a>&gt;`_에는 앱 퍼플리싱을 위한  <a href=\"#id5\"><span class=\"problematic\" id=\"id6\">`</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>앞에서, 우리는 설문 조사 앱을 사용자 라이브러리로 설치했습니다. 여기에는 몇 가지 단점이 있습니다:</p>\n<ul class=\"simple\">\n<li><p>사용자 라이브러리를 수정하면 시스템의 다른 파이썬 소프트웨어에 영향을 미칠 수 있습니다.</p></li>\n<li><p>이 패키지의 여러 버전 (또는 이름이 같은 다른 버전)을 실행할 수 없습니다.</p></li>\n</ul>\n<p>Typically, these situations only arise once you’re maintaining several Django\nprojects. When they do, the best solution is to use <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/venv.html\" title=\"(Python v3.14에서)\"><span class=\"xref std std-doc\">venv</span></a>. This tool allows you to maintain multiple isolated\nPython environments, each with its own copy of the libraries and package\nnamespace.</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/3.0/intro/"}],"prev":{"docname":"intro/tutorial07","title":"첫 번째 장고 앱 작성하기, part 7","url":"/ko/3.0/intro/tutorial07/"},"next":{"docname":"intro/whatsnext","title":"다음에 읽을 내용","url":"/ko/3.0/intro/whatsnext/"},"formats":{"html":"/ko/3.0/intro/reusable-apps/","markdown":"/ko/3.0/intro/reusable-apps.md","json":"/ko/3.0/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/ko/3.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","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}