- [완성 소스] : github.com/pahkey/jump2django/tree/2-01
- [실습 영상] : https://youtu.be/RzVGMyL6mXI
이제 차근차근 파이보를 만들면서 장고의 기능을 하나씩 알아가 보자.
앱(App)
우리는 앞에서 mysite 프로젝트를 생성했다. 하지만 프로젝트 단독으로는 아무런 일도 할 수 없다. 프로젝트에 기능을 추가하기 위해서는 앱을 생성해야 한다. 이제 게시판 기능을 담당할 pybo 앱을 생성해 보자.
다음처럼 명령 프롬프트에서 django-admin의 startapp 명령을 이용하여 pybo 앱을 생성하자.
(mysite) C:\projects\mysite> django-admin startapp pybo
(mysite) C:\projects\mysite>
명령을 실행하면 아무런 메시지 없이 종료된다. 하지만 pybo 앱 관련한 파일과 디렉터리가 생성되었음을 파이참에서 확인할 수 있다.
pybo 디렉터리가 생성되고 그 하위에 여러 파일들이 생성되었다. 이것들에 대해서는 하나하나 곧 자세하게 다룰 것이다.
Hello Pybo
이제 본격적으로 장고 프로그램을 만들어 보자.
브라우저에서 http://localhost:8000/pybo 페이지를 요청했을 때 "안녕하세요 pybo에 오신것을 환영합니다."라는 문자열을 출력하도록 만들어 보자.
로컬서버를 먼저 구동하자.
(mysite) C:\projects\mysite> python manage.py runserver
그리고 그냥 한번 브라우저에서 http://localhost:8000/pybo 페이지를 요청해 보자.
아마 위처럼 "Page not found (404)" 라는 오류가 발생할 것이다. 여기서 404는 HTTP 오류코드 중 하나이다.
404 오류는 브라우저가 요청한 페이지를 찾을 수 없을 경우에 발생한다.
장고는 오류가 발생하면 오류의 원인을 화면에 자세히 보여주기 때문에 오류를 파악하기 쉽다. 오류의 내용을 자세히 읽어보면 config/urls.py 파일에 요청한 pybo/ URL에 해당되는 매핑이 없다고 적혀 있다.
그렇다면 이제 오류를 해결하기 위해 해야 할일은 무엇일까? config/urls.py 파일에 pybo/ URL에 대한 매핑을 추가하는 것이다. 장고의 urls.py 파일은 페이지 요청이 발생하면 가장 먼저 호출되는 파일로 URL과 뷰 함수 간의 매핑을 정의한다. 뷰 함수는 views.py 파일에 정의된 함수를 말한다.
urls.py
URL 매핑을 추가하기 위해 config/urls.py 파일을 다음과 같이 수정하자.
[파일이름: projects/mysite/config/urls.py]
from django.contrib import admin
from django.urls import path
from pybo import views
urlpatterns = [
path('admin/', admin.site.urls),
path('pybo/', views.index),
]
pybo/ URL이 요청되면 views.index를 호출하라는 매핑을 urlpatterns에 추가하였다. views.index는 views.py 파일의 index 함수를 의미한다.
urlpatterns에서 실제 URL은 http://localhost:8000/pybo 이지만 호스트명과 포트가 생략된 pybo/로 매핑해야 한다. 왜냐하면 호스트(예:localhost)와 포트(예:8000)는 서버가 어떤 환경에서 실행되는지에 따라 변하기 때문이다.
또 한가지 pybo/ 를 pybo라고 하지 않고 뒤에 슬래시(/)를 하나 더 붙여 주었다. 이렇게 뒤에 슬래시를 붙여주면 브라우저 주소창에 http://localhost:8000/pybo 라고 입력해도 자동으로 http://localhost:8000/pybo/ 처럼 변환된다. 이렇게 되는 이유는 URL을 정규화하는 장고의 기능 때문이다. 특별한 경우가 아니라면 URL 매핑시 항상 끝에 슬래시를 붙여 주도록 하자.
views.py
이제 다시 http://localhost:8000/pybo 페이지를 요청해 보자. 아마도 "사이트에 연결할 수 없음"이라는 오류가 화면에 표시될 것이다. 오류의 원인은 URL 매핑에 추가한 뷰 함수 views.index가 없기 때문이다.
그렇다면 이제 pybo/views.py 파일에 index 함수를 추가해야 할 것이다. 다음과 같이 추가해 보자.
[파일이름: projects/mysite/pybo/views.py]
from django.http import HttpResponse
def index(request):
return HttpResponse("안녕하세요 pybo에 오신것을 환영합니다.")
HttpResponse는 요청에 대한 응답을 할때 사용한다. 여기서는 "안녕하세요 pybo에 오신것을 환영합니다." 라는 문자열을 브라우저에 출력하기 위해 사용되었다. index 함수의 매개변수 request는 HTTP 요청 객체이다. request 객체에 대해서는 뒤에서 자세히 알아보자.
이렇게 뷰 함수를 작성하고 다시 http://localhost:8000/pybo 페이지를 요청해 보자.
다음과 같은 결과를 볼 수 있을 것이다.
축하한다. 여러분의 첫 번째 장고 프로그램이 완성되었다!
장고 개발 흐름 정리하기
지금 여러분이 경험한 개발 과정은 앞으로의 실습 과정에서 여러 번 반복될 것이다. 그만큼 이 과정은 중요하다!
장고의 기본적인 흐름을 다시 정리해 보자.
- [1] 브라우저에서 로컬 서버로 http://localhost:8000/pybo 페이지를 요청하면
- [2] urls.py 파일에서 /pybo URL 매핑을 확인하여 views.py 파일의 index 함수를 호출하고
- [3] 호출한 결과를 브라우저에 반영한다.
URL 분리
잠깐, 다음으로 넘어가기 전에 config/urls.py 파일을 좀 손봐주어야 할 것 같다. 다시 강조하지만 pybo 앱에 관련한 것들은 pybo 앱 디렉터리 하위에 위치해야 한다. 하지만 이대로라면 pybo와 관련된 URL 매핑을 추가할 때마다 config/urls.py 파일을 수정해야 한다. config의 urls.py 파일은 앱이 아닌 프로젝트 성격의 파일이므로 이곳에는 프로젝트 성격의 URL 매핑만 추가되어야 한다. 따라서 pybo 앱에서만 사용하는 URL 매핑을 config/urls.py 파일에 계속 추가하는 것은 좋은 방법이 아니다.
좋은 방법이 있다. 먼저 config/urls.py 파일을 다음처럼 수정하자.
[파일이름: projects/mysite/config/urls.py]
from django.contrib import admin
from django.urls import path, include
from pybo import views # 더 이상 필요하지 않으므로 삭제
urlpatterns = [
path('admin/', admin.site.urls),
path('pybo/', include('pybo.urls')),
]
pybo/ URL에 대한 매핑을 path('pybo/', views.index) 에서 path('pybo/', include('pybo.urls'))로 수정했다.
path('pybo/', include('pybo.urls'))의 의미는 pybo/로 시작하는 페이지를 요청하면 이제 pybo/urls.py 파일의 매핑 정보를 읽어서 처리하라는 의미이다. 따라서 이제 pybo/question/create, pybo/answer/create 등의 pybo/로 시작하는 URL을 추가해야 할 때 config/urls.py 파일을 수정할 필요없이 pybo/urls.py 파일만 수정하면 된다.
그렇다면 이제 pybo/urls.py 파일을 생성해야 한다. 파이참에서 pybo/urls.py 파일을 생성하기 위해 [pybo → 마우스 오른쪽 클릭 → New → File]을 한 다음 파일명으로 urls.py를 입력하자.
그리고 pybo/urls.py 파일은 다음과 같이 작성하자.
[파일이름: projects/mysite/pybo/urls.py]
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
]
기존 config/urls.py 파일에 설정했던 내용과 별반 차이가 없다.
다만 path('', views.index) 처럼 pybo/ 가 생략된 '' 이 사용되었다. 이렇게 되는 이유는 config/urls.py 파일에서 이미 pybo/로 시작하는 URL이 pybo/urls.py 파일과 먼저 매핑되었기 때문이다.
즉, pybo/ URL은 다음처럼 config/urls.py 파일에 매핑된 pybo/ 와 pybo/urls.py 파일에 매핑된 '' 이 더해져 pybo/가 된다.
config/urls.pypybo/urls.py최종 URL
'pybo/' | + | '' | = | 'pybo/' |
'pybo/' | + | 'question/create/' | = | 'pybo/question/create/' |
위의 두번째 예시처럼 pybo/urls.py 파일에 path('question/create/', ...) 라는 URL매핑이 추가된다면 최종 매핑되는 URL은 pybo/가 더해진 pybo/question/create/가 될 것이다.
이제 다시 http://localhost:8000/pybo 페이지를 요청해 보자. URL 분리 후에도 동일한 결과가 나타나는 것을 확인할 수 있을 것이다.
이 과정에서 오류가 발생한다면 로컬서버를 재시작하자.
'Django' 카테고리의 다른 글
[Django] Django Architecture(구조) (0) | 2024.05.31 |
---|---|
[Django] 모델 (0) | 2024.05.29 |
[Django] 파이참 사용하기 (0) | 2024.05.27 |
[Django] 장고 프로젝트 생성하기 (0) | 2024.05.27 |
[Django] 파이썬 설치하기 (0) | 2024.05.25 |