첫 번째 장고 앱 작성하기, part 1Link to this heading

예제로 배워봅시다.

이 튜토리얼을 통해, 간단한 설문조사(Polls) 어플리케이션을 만드는 과정을 따라해 보겠습니다.

두 파트로 구성되어 있습니다.

  • 사람들이 설문 내용을 보고 직접 투표할 수 있는 개방된 사이트

  • 관리자가 설문을 추가, 변경, 삭제할 수 있는 관리용 사이트

Django 설치가 되어 있다고 가정합니다. 쉘 프롬프트 ($ 접두사로 표시)에서 다음 명령을 실행하여 Django가 설치되어 있고 어떤 버전인지 알 수 있습니다.

Linux / macOS

Shell
$ python -m django --version

Windows

Windows
...\> py -m django --version

Django가 설치 되었다면, 설치된 Django의 버전을 확인할 수 있습니다. 만약 설치가 제대로 되지 않았다면, “No module named django”와 같은 에러가 발생합니다.

이 튜토리얼은 Django |version|을 기준으로 작성되었으며, Python 3.12 이상을 지원합니다. 사용 중인 Django 버전이 일치하지 않는 경우, 이 페이지 오른쪽 아래에 있는 버전 선택기를 사용하여 해당 버전에 맞는 튜토리얼을 참고하거나 Django를 최신 버전으로 업데이트할 수 있습니다. 이전 버전의 Python을 사용 중이라면 :ref:`faq-python-version-support`에서 호환되는 Django 버전을 확인하세요.

프로젝트 만들기Link to this heading

Django를 처음 사용한다면, 초기 설정에 주의를 기울여야 합니다. Django project를 구성하는 코드를 자동 생성해야 하는데, 이 과정에서 데이터베이스 설정, Django 위한 옵션들, 어플리케이션을 위한 설정들과 같은 Django 인스턴스를 구성하는 수많은 설정들이 생성되기 때문입니다.

커맨드라인에서 cd 명령을 사용해 코드를 저장할 디렉토리로 이동한 후, 다음 명령을 실행하여 새 Django 프로젝트를 생성합니다.

Linux / macOS

Shell
$ django-admin startproject mysite djangotutorial

Windows

Windows
...\> django-admin startproject mysite djangotutorial

이 명령을 실행하면 mysite``라는 프로젝트가 포함된 ``djangotutorial 디렉토리가 생성됩니다. 디렉토리 이름은 Django에 영향을 주지 않으므로 원하는 이름으로 변경해도 됩니다. 제대로 작동하지 않는다면 :ref:`troubleshooting-django-admin`를 참고하세요.

:djadmin:`startproject`에서 무엇이 생성되는지 확인해 봅시다.

Text
djangotutorial/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

이 파일들은,

  • manage.py: Django 프로젝트와 다양한 방법으로 상호작용 하는 커맨드라인의 유틸리티 입니다. manage.py 에 대한 자세한 정보는 django-admin and manage.py 에서 확인할 수 있습니다.

  • mysite/: 프로젝트의 실제 Python 패키지 디렉토리입니다. 이 디렉토리의 이름은 내부의 내용을 임포트할 때 사용하는 Python 패키지 이름이 됩니다(예: mysite.urls).

  • mysite/__init__.py: Python으로 하여금 이 디렉토리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일입니다. Python 초심자라면, Python 공식 홈페이지의 패키지를 읽어보세요.

  • mysite/settings.py: 이 Django 프로젝트의 설정 파일입니다. :doc:`/topics/settings`에서 설정이 어떻게 동작하는지 확인할 수 있습니다.

  • mysite/urls.py: 현재 Django project 의 URL 선언을 저장합니다. Django 로 작성된 사이트의 “목차” 라고 할 수 있습니다. URL dispatcher 에서 URL 에 대한 자세한 내용을 읽어보세요.

  • mysite/asgi.py: 현재 프로젝트를 서비스하기 위한 ASGI-호환 웹 서버의 진입점입니다. 자세한 내용은 ASGI를 사용하여 배포하는 방법 를 참조하십시오.

  • mysite/wsgi.py: 현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점입니다. WSGI를 사용하여 배포하는 방법를 읽어보세요.

개발 서버Link to this heading

Django 프로젝트가 제대로 동작하는지 확인해 봅시다. 아직 이동하지 않았다면 djangotutorial 디렉토리로 이동한 후, 다음 명령을 실행하세요.

Linux / macOS

Shell
$ python manage.py runserver

Windows

Windows
...\> py manage.py runserver

커맨드라인에서 다음과 같은 출력을 볼 수 있습니다.

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are
applied. Run 'python manage.py migrate' to apply them.

2026년 08월 11일 - 15:50:53
Django version 6.1, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
For more information on production servers see: https://docs.djangoproject.com/en/6.1/howto/deployment/

이제 서버가 실행 중이니 웹 브라우저의 http://127.0.0.1:8000/ 를 통해 접속할 수 있습니다. 여러분은 로켓이 이륙하는 “Congratulations!” 페이지가 보일 것입니다. 잘 동작하네요!

Django 개발 서버를 시작했습니다. 개발 서버는 순수 Python으로 작성된 경량 웹 서버입니다. 운영 준비가 될 때까지 Apache와 같은 운영 서버를 구성할 필요 없이 신속하게 개발할 수 있도록 Django에 포함했습니다.

이쯤에서 하나 기억할 것이 있습니다. 이 서버를 운영 환경과 유사한 환경에서 사용하지 마십시오. 개발 중에만 사용할 수 있도록 되어 있습니다. (우리는 웹 서버가 아닌 웹 프레임워크를 만드는 사업을 하고 있습니다.)

(다른 포트에서 사이트를 실행하려면 :djadmin:`runserver`를 참고하세요.)

설문조사 앱 만들기Link to this heading

이제, 작업을 시작하기 위해 당신의 환경(프로젝트)이 설치되었습니다.

Django에서 당신이 작성하는 각 어플리케이션들은 다음과 같은 관례로 Python 패키지가 구성됩니다. Django 는 앱(app) 의 기본 디렉토리 구조를 자동으로 생성할 수 있는 도구를 제공하기 때문에, 코드에만 더욱 집중할 수 있습니다.

앱은 Python 경로 의 어느 위치에든 둘 수 있습니다. 이 튜토리얼에서는 djangotutorial 폴더 안에 poll 앱을 생성해 보겠습니다.

앱을 생성하기 위해 manage.py가 존재하는 디렉토리에서 다음의 명령을 입력해 봅시다.

Linux / macOS

Shell
$ python manage.py startapp polls

Windows

Windows
...\> py manage.py startapp polls

그러면 디렉토리 :file:`polls`가 생성되며, 이 디렉토리는 다음과 같이 배치됩니다.

Text
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

이 디렉토리 구조는 투표 어플리케이션의 집이 되어줄 것입니다.

첫 번째 뷰 작성하기Link to this heading

첫 번째 뷰를 작성해봅시다. “polls/view.py”를 열어 다음과 같은 파이썬 코드를 입력합니다

polls/views.py
Python
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

Django에서 사용할 수 있는 가장 기본적인 뷰입니다. 브라우저에서 접속하려면 URL에 매핑해야 하며 이를 위해 URL 구성, 즉 “URLconf”를 정의해야 합니다. 이러한 URL 구성은 각 Django 앱 내부에 정의되며, ``urls.py``라는 이름의 Python 파일입니다.

polls 앱의 URLconf를 정의하려면, 다음 내용으로 polls/urls.py 파일을 생성하세요.

polls/urls.py
Python
from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
]

앱 디렉토리는 다음과 같은 구조여야 합니다.

Text
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

다음 단계는 mysite 프로젝트의 루트 URLconf를 설정하여 polls.urls``에 정의된 URLconf를 포함하는 것입니다. 이를 위해 ``mysite/urls.py 파일에 django.urls.include``를 import하고, ``urlpatterns 리스트에 :func:`~django.urls.include`를 다음과 같이 추가합니다.

mysite/urls.py
Python
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("polls/", include("polls.urls")),
    path("admin/", admin.site.urls),
]

path() 함수는 최소 두 개의 인수(route``와 ``view)를 필요로 합니다. include() 함수는 다른 URLconf를 참조할 수 있게 해줍니다. Django가 :func:`~django.urls.include`를 만나면, 해당 시점까지 일치하는 URL 부분을 잘라내고 나머지 문자열은 추가 처리를 위해 포함된 URLconf로 전달합니다.

include()에 숨은 아이디어 덕분에 URL을 쉽게 연결할 수 있습니다. polls 앱에 그 자체의 URLconf(polls/urls.py)가 존재하는 한, “/polls/”, 또는 “/fun_polls/”, “/content/polls/”와 같은 경로, 또는 그 어떤 다른 root 경로에 연결하더라도, 앱은 여전히 잘 동작할 것입니다.

이제 index 뷰가 URLconf에 연결되었습니다. 잘 작동하는지 확인하기 위해 다음 명령을 입력해 보세요.

Linux / macOS

Shell
$ python manage.py runserver

Windows

Windows
...\> py manage.py runserver

브라우저에서 http://localhost:8000/polls/를 입력하면 index 뷰에 정의한 “Hello, world. You’re at the polls index.” 가 보일 것입니다.

request 와 response 의 기본 흐름을 이해하셨다면, 튜토리얼 2장 에서 데이터베이스 작업을 시작해보세요.