본문 바로가기

Programming👩🏻‍💻/Web framework

[Django] 공식문서로 익혀보기 part1 - 첫 시작, 프로젝트와 앱 만들기

 

Django를 공부하면서 아직 미비한 부분이 많아서 공식문서 튜토리얼대로 한번 학습을 해보려고 한다.

최고의 학습자료는 공식 문서라고 하는데!? 한번 시작 해보겠습니다.

 

 

 

*본 포스팅은  Django 설치 방법 및 가상환경 세팅 , 초기 서버 구동 등 기본적인 장고 개발 환경 가이드는 생략이 되어있습니다.

Django로 설문조사(Polls) 애플리케이션 만들어 보기

프로젝트 구조는 아래 두 파트로 구성이 되어 있다.

  • 유저가 설문 내용을 보고 직접 투표할 수 있는 사이트
  • 관리자가 설문 추가/변경/삭제할 수 있는 어드민 사이트

 

 

1. 프로젝트 만들기

터미널에서 코드를 저장할 디렉토리로 이동 후, 아래 명령어를 실행합니다.

 

💡Django에서는 mysite와 같은 디렉토리가 프로젝트 루트 디렉토리이면서 동시에 Python 패키지로 동작합니다.

이 폴더 안에는 settings.py, urls.py 등을 포함하는 패키지 역할을 하며 프로젝트의 구성과 설정을 담고 있는 중요한 폴더로 사용 됩니다.

$ django-admin startproject mysite

 

장고 프로젝트는 아래와 같이 구성됩니다.

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
  • manage.py: Django 개발에서 DB 관리, server/test 실행 모든 프로젝트 관리 작업을 이 스크립트를 통해 수행 가능합니다.
  • 프로젝트 내부 'mysite/' : 해당 디렉토리는 프로젝트 실제 Python 패키지이며 패키지명입니다. (e.g. mysite.urls)
  • __init__.py: Python에서 이 파일이 있으면 "이 폴더는 파이썬 패키지"라고 알려주는 역할을 합니다. 
  • settings.py: 프로젝트에 관련된 모든 설정 값을 담고 있습니다.
  • urls.py: 웹사이트 경로 맵핑 해주는 역할을 합니다.
  • wsgi.py (Web Server Gateway Interface): 웹서버와 Django 애플리캐이션을 연결하는 인터페이스로 주로 동기식 웹 애플리케이션에 사용합니다.
  • asgi.py (Asynchronous Server Gateway Interface): WSGI의 비동기 버전으로 동시 여러 요청 처리 가능합니다.
    *wsgi.py, asgi.py는 아직 저도 파악이 안된 상태라, 추후 자세히 포스팅 할 예정

 

 

 

2. 설문조사 앱 만들기

터미널에서 코드를 저장할 디렉토리로 이동 후, 아래 명령어를 실행합니다.

$ python manage.py startapp polls

 

'polls' 앱 구성은 아래와 같습니다.

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

이 디렉토리 구조는 polls(투표) 애플리케이션의 기능 구현을 위한 구성들입니다.

 

 

🫨장고 프로젝트와 앱 차이?

프로젝트는 웹 사이트에 대한 구성 및 앱의 모음이다.

은 프로젝트의 구성 기능으로 해당 사이트에서 작업을 수행하는 웹 애플리케이션이다.

 

3. 첫 번째 뷰 작성 및  URL 맵핑

 

사용자가 웹 브라우저를 통해 Django 서버로 특정 URL을 요청하면 Django가 이 요청을 처리합니다.Django가 URL 패턴에 따라 적절한 뷰 함수를 찾아서 호출할 때 첫 번째 인자로 request 객체를 자동으로 전달합니다.

# polls/views.py

from django.http import HttpResponse


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

 

예를 들어, 사용자가 /polls/ 경로로 접속했을 때 해당 URL에 맵핑된 index함수와 같은 뷰함수가 호출됩니다.

# polls/urls.py

from django.urls import path

from . import views

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

 

'/polls/' URL이 index 뷰함수와 연결되어 있다면 Django에서 index(request)를 호출하며 request 객체를 전달합니다.

request 객체에 포함할 수 있는 정보는 아래와 같은 형태로 구성되어 있습니다.

request = {
    'method': 'GET',
    'path': '/polls/',
    'GET': {},            # GET 파라미터 (예: ?name=value 형태의 쿼리스트링)
    'POST': {},           # POST 데이터 (폼 데이터 등)
    'COOKIES': {},        # 쿠키 데이터
    'META': {
        'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...',
        'HTTP_HOST': 'example.com',
        'REMOTE_ADDR': '123.456.789.012',
        # 기타 헤더 및 환경 정보
    },
    'user': AnonymousUser,  # 로그인하지 않은 경우 익명 사용자
}

 

 

4. 전역 URL 설정

현재까지는 앱에서 URL 맵핑하였는데, 웹사이트 주소창에 입력된 주소를 polls 앱이 처리할 수 있도록 mysite 프로젝트 전역 URL 설정에 polls앱의 URL 설정을 해주어야합니다.

 

다른 URL 설정 파일을 포함 시킬때 django.urls.include 를 import 해주어야 합니다.

include() 함수를 사용하여 polls.urls 를 포함 시킵니다.

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

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

 

 

💡include() 함수를 사용하는 이유는 URL 설정을 모듈화하기 위해서입니다.

- 각 앱마다 독립적인 urls.py를 가질 수 있어 코드 구조가 깔끔해집니다.

- 큰 프로젝트에서 URL 관리가 용이합니다

 

- 동일한 URL 패턴을 여러 경로에서 재사용할 수 있습니다.

* polls/urls.py 가 존재하는 한, 여러 경로를 정의하더라도 잘 동작됩니다.

# mysite/urls.py
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),  # 이렇게 해도 되고
    path('voting/', include('polls.urls')),  # 이렇게 해도 되고
    path('survey/election/', include('polls.urls')),  # 이렇게 해도 되고
]

 

 

polls.urls에서는 실제 view 함수들과 연결되는 더 구체적인 URL 패턴들이 정의됩니다.

# polls/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index),  # /polls/, /voting/, /survey/election/
    path('detail/<int:id>', views.detail),  # /polls/detail/1, /voting/detail/1 등
]

 

 

 

 

마무리

part2 포스팅에서 계속 됩니다.