{"title":"심화 튜토리얼: 재사용 가능한 앱을 만드는 법","version":"1.11","locale":"ko","docname":"intro/reusable-apps","url":"/ko/1.11/intro/reusable-apps/","canonical":"https://djangodocs.dev/ko/1.11/intro/reusable-apps/","summary":"이 심화 튜토리얼은 Tutorial 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/1.11/intro/tutorial07/\"><span class=\"doc\">Tutorial 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>웹 어플리케이션을 설계, 빌드, 테스트와 관리는 꽤나 큰 일입니다. 많은 파이썬 그리고 Django 프로젝트들은 공통의 문제를 공유합니다. 만약 우리가 이 반복적인 작업들중에서 몇몇을 구해낼수 있다면 정말 멋지지 않을까요?</p>\n<p>재사용 성은 파이썬에서 삶의 방식입니다. <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>Python 패키지 색인 (PyPI) &lt;<a class=\"reference external\" href=\"https://pypi.python.org/pypi\">https://pypi.python.org/pypi</a>&gt;`_은 당신 자신의 파이썬 프로그램에서 사용할 수있는 방대한 패키지를 가지고 있습니다. 프로젝트에 통합 할 수있는 기존의 재사용 가능한 응용 프로그램에 대해서는`Django Packages &lt;<a class=\"reference external\" href=\"https://djangopackages.org\">https://djangopackages.org</a>&gt;`_를 확인하십시오. Django 자체도 파이썬 패키지입니다. 즉, 기존의 Python 패키지 또는 Django 앱을 가져 와서 자신의 웹 프로젝트 로 구성 할 수 있습니다. 프로젝트 를 고유하게 만드는 부분 만 작성하면됩니다.</p>\n<p>이제 우리가 작업했던 것과 같은 설문 조사 앱이 필요하여 새로운 프로젝트를 시작했다고 가정해봅시다. 어떻게 이 앱을 재사용할 수 있게 만들 수 있을까요? 운 좋게도, 여러분은 이미 방법을 알고 있습니다. <a class=\"reference internal\" href=\"/ko/1.11/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</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 코드를 묶어놓은 것입니다. package 는 Python 코드가 들어있는 하나 이상의 파일들이 포함되어  있으며, 이를 “module” 이라고도 합니다.</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>나중에 우리는 다른사람들이 쉽게 파이썬 패키지를 설치하는 과정을 설명하기 위해  <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\">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\">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/1.11/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/1.11/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.python.org/pypi/setuptools\">setuptools</a> 를 사용할 것입니다. 권장 패키징 도구(<code class=\"docutils literal notranslate\"><span class=\"pre\">distribute</span></code> 포크와 병합된)입니다. 설치하고 재설치하는데 <a class=\"reference external\" href=\"https://pypi.python.org/pypi/pip\">pip</a> 를 사용할 수도 있습니다. 이제 이 두 패키지들을 설치해야합니다. 도움이 필요하면 <a class=\"reference internal\" href=\"/ko/1.11/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/1.11/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>, or <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code>  같은 Django <a class=\"reference internal\" href=\"/ko/1.11/ref/contrib/\"><span class=\"doc\">contrib packages</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=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/README.rst</code></figcaption><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=\"django-polls/README.rst\"><code>=====\nPolls\n=====\n\nPolls is a simple 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\nQuick start\n-----------\n\n1. Add &quot;polls&quot; to your INSTALLED_APPS setting like this::\n\n    INSTALLED_APPS = [\n        ...\n        &#39;polls&#39;,\n    ]\n\n2. Include the polls URLconf in your project urls.py like this::\n\n    url(r&#39;^polls/&#39;, include(&#39;polls.urls&#39;)),\n\n3. Run `python manage.py migrate` to create the polls models.\n\n4. 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\n5. 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>다음에, 우리는 앱을 빌드하고 설치하는 방법에 대한 세부 사항을 제공하는 <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.py</span></code> 파일을 생성 할 것입니다. 이 파일에 대한 전체적인 설명은 이 튜토리얼의 범위에서 벗어나지만, <a class=\"reference external\" href=\"https://setuptools.readthedocs.io/en/latest/\">setuptools 문서</a> 에 좋은 설명이 입습니다. 다음 내용으로  <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.py</span></code> 파일을 만드세요.</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/setup.py</code></figcaption><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=\"django-polls/setup.py\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n<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\">find_packages</span><span class=\"p\">,</span> <span class=\"n\">setup</span>\n\n<span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">dirname</span><span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">),</span> <span class=\"s1\">&#39;README.rst&#39;</span><span class=\"p\">))</span> <span class=\"k\">as</span> <span class=\"n\">readme</span><span class=\"p\">:</span>\n    <span class=\"n\">README</span> <span class=\"o\">=</span> <span class=\"n\">readme</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># allow setup.py to be run from any path</span>\n<span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">chdir</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">normpath</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">abspath</span><span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">),</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">pardir</span><span class=\"p\">)))</span>\n\n<span class=\"n\">setup</span><span class=\"p\">(</span>\n    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;django-polls&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"s1\">&#39;0.1&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">packages</span><span class=\"o\">=</span><span class=\"n\">find_packages</span><span class=\"p\">(),</span>\n    <span class=\"n\">include_package_data</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"n\">license</span><span class=\"o\">=</span><span class=\"s1\">&#39;BSD License&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># example license</span>\n    <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s1\">&#39;A simple Django app to conduct Web-based polls.&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">long_description</span><span class=\"o\">=</span><span class=\"n\">README</span><span class=\"p\">,</span>\n    <span class=\"n\">url</span><span class=\"o\">=</span><span class=\"s1\">&#39;https://www.example.com/&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">author</span><span class=\"o\">=</span><span class=\"s1\">&#39;Your Name&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">author_email</span><span class=\"o\">=</span><span class=\"s1\">&#39;yourname@example.com&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">classifiers</span><span class=\"o\">=</span><span class=\"p\">[</span>\n        <span class=\"s1\">&#39;Environment :: Web Environment&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Framework :: Django&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Framework :: Django :: X.Y&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># replace &quot;X.Y&quot; as appropriate</span>\n        <span class=\"s1\">&#39;Intended Audience :: Developers&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;License :: OSI Approved :: BSD License&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># example license</span>\n        <span class=\"s1\">&#39;Operating System :: OS Independent&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python&#39;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># Replace these appropriately if you are stuck on Python 2.</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3.4&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3.5&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Topic :: Internet :: WWW/HTTP&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Topic :: Internet :: WWW/HTTP :: Dynamic Content&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">],</span>\n<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=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/MANIFEST.in</code></figcaption><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=\"django-polls/MANIFEST.in\"><code><span class=\"n\">include</span> <span class=\"n\">LICENSE</span>\n<span class=\"n\">include</span> <span class=\"n\">README</span><span class=\"o\">.</span><span class=\"n\">rst</span>\n<span class=\"n\">recursive</span><span class=\"o\">-</span><span class=\"n\">include</span> <span class=\"n\">polls</span><span class=\"o\">/</span><span class=\"n\">static</span> <span class=\"o\">*</span>\n<span class=\"n\">recursive</span><span class=\"o\">-</span><span class=\"n\">include</span> <span class=\"n\">polls</span><span class=\"o\">/</span><span class=\"n\">templates</span> <span class=\"o\">*</span>\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>For more information on packaging, see Python’s <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/\">Tutorial on Packaging and\nDistributing Projects</a>.</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>사용자 단위 설치는 해당 사용자로 실행되는 시스템 도구들의 동작에 영향을 미칠 수 있으므로, <code class=\"docutils literal notranslate\"><span class=\"pre\">virtualenv</span></code> 가 보다 강력한 솔루션입니다 (아래 참조).</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\">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\">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>Post the package on a public repository, such as <a class=\"reference internal\" href=\"#the-python-package-index-pypi\">the Python Package Index\n(PyPI)</a>. <a class=\"reference external\" href=\"https://packaging.python.org\">packaging.python.org</a> has <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives\">a good\ntutorial</a>\nfor doing this.</p></li>\n</ul>\n</section>\n<section id=\"installing-python-packages-with-virtualenv\">\n<h2>virtualenv를 이용한 파이썬 패키지 설치하기<a class=\"heading-anchor\" href=\"#installing-python-packages-with-virtualenv\"><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>일반적으로, 이러한 상황들은 여러가지 Django 프로젝트들을 관리할 때 발생합니다. 그런 경우, 최고의 해결책은 <a class=\"reference external\" href=\"https://virtualenv.pypa.io/\">virtualenv</a> 을 사용하는 것입니다. 이 도구는 각자의 라이브러리와 패키지 네임스페이스 복사본을 가진 격리된 파이썬 환경들을 관리할 수 있도록 해줍니다.</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":"virtualenv를 이용한 파이썬 패키지 설치하기","anchor":"installing-python-packages-with-virtualenv","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"시작하기","url":"/ko/1.11/intro/"}],"prev":{"docname":"intro/tutorial07","title":"첫 번째 장고 앱 작성하기, part 7","url":"/ko/1.11/intro/tutorial07/"},"next":{"docname":"intro/whatsnext","title":"다음에 읽을 내용","url":"/ko/1.11/intro/whatsnext/"},"formats":{"html":"/ko/1.11/intro/reusable-apps/","markdown":"/ko/1.11/intro/reusable-apps.md","json":"/ko/1.11/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/ko/1.11/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","fr","ja","id","pt-br","ko","es","el","pl"]}