Django - 웹페이지 만들기(1) / MVC와 애플리케이션 생성

이승현·2023년 11월 2일

Django

목록 보기
2/8
post-thumbnail

1. 가상환경 경로 등록

VS Code에서 가상환경을 사용하기 위해서 실행시마다 Interpreter를 설정해야 하는데 기본 경로를 설정해주면 번거로움을 덜 수 있다.

Ctrl + Shift + p 를 누른 후 User Setting을 선택

"python.defaultInterpreterPath": "가상환경의 python.exe 경로"를 입력, 저장해준다.

이제 터미널을 실행하면 자동으로 가상환경으로 진입하게 된다.
이후에 해당 문장을 Setting.json에서 삭제하면 설정을 제거할 수 있다.


2. View와 Urls

✅ MVC (Model, View, Controller)

  • 소프트웨어를 개발하기 위해서는 기능과 인터페이스 구현을 분리하여야 한다.
  • MVC는 모델-뷰-컨트롤러를 의미하며 서로 다른 일을 처리하는 세 역할로 구분한다.
    • 모델은 데이터에 대한 저장과 로직을 관리한다.
    • 뷰는 화면과 인터페이스를 담당한다.
    • 컨트롤러는 모델과 뷰를 연결하여 조작을 위해 작동한다.
  • 사용자는 컨트롤러로 상호작용하여 모델에서 데이터를 받아와 뷰를 통해 결과를 전달받게 된다.
  • 구분돤 애플리케이션 재작 방법은 집중된 개발로 효율이 증가하게 된다.

Django는 기본적으로 애플리케이션이라는 단위로 웹을 구성한다.
이때 애플리케이션에서 다양한 파일을 통해 해야 할 역할을 수행한다.

  • view.py : 각 페이지에서 나타낼
  • templates : HTML을 통해 페이지를 표현
  • urls.py : URL을 통해 표현할 페이지를 선택
  • models.py : 활용할 데이터베이스에 대해 정의

먼저 뷰와 urls를 통해 페이지에 어떻게 영향을 끼칠수 있는지 확인해보자

📑 djangoProject/urls.py

from django.contrib import admin
from django.urls import path
from .views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', mainpage), #추가
]

urls.py에 경로를 추가한다. 이때 path는 url과 views.py에 표현될 함수를 기입한다.
views를 import 해야할 필요가 있다.

📑 djangoProject/views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import View

def mainpage(request):
   return render(request, "mainpage.html")

views.py에서는 데이터베이스를 불러오고 페이지에서 표현해야 할 데이터를 전달한다.
함수로 지정되어있고 request를 인자로 받는다.
render의 경우 request와 함께 Template의 이름을 받게 된다.

웹 페이지의 경우 html로 작성하면 되는데 프로젝트 폴더에 templates 폴더를 만들어서 파일을 작성하면 된다.

📑 djangoProject/templates/mainpage.html

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>장고의 세계에 오신 것을 환영합니다!</title>
</head>
<body>
  이제 페이지를 하나씩 채워보도록 합시다.
</body>
</html>

간단하게 다음과 같은 html을 만들어 메인 페이지로 사용할 수 있다.
하지만 template를 사용하기 위해서는 settings에 templates에 대한 정보를 추가해야한다.

📑 djangoProject/settings.py

...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'djangoProject/templates')], #추가
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
...

settings.py에 TEMPLATES에 경로를 기입해주면 이제 간단한 이름으로 html을 부를 수 있다.

따라서 코드의 흐름은 urls -> views -> templates 순서로 진행을 하게 된다.

실제로 실행을 해주면 페이지가 잘 나타나는 것을 확인할 수 있다.


3. 애플리케이션 생성

장고의 특징으로는 애플리케이션으로 기능을 분할하여 개발할 수 있다는 장점이 있다.
따라서 특정한 기능의 경우 애플리케이션을 생성하여 코드를 만드는 것이 편리하다.

djangoBooks라는 애플리케이션을 만들도록 하자
해당 애플리케이션은 도서에 대한 데이터를 정의하고 페이지를 구성한다.
python manage.py startapp 앱이름 콘솔창에 입력하면 된다.

urls.py라는 파일을 이전처럼 같은 폴더에 만든 코드를 입력하자.

📑 djangoBooks/urls.py

from django.urls import path
from .views import *

app_name = "djangoBooks"

urlpatterns = [
    path('', books_list.as_view(), name='list'),
    path('detail', books_detail.as_view(), name='detail'),    
]

이때 as_view()와 name을 사용했는데 as_view()의 경우에는 views.py에서 해당 대상을 클래스로 정의한 다음 사용한다는 것을 의미한다.
name의 경우 HTML에서 redirect와 같은 행위에서 짧게 쓰기 위한 별칭이다.

하지만 이렇게 앱을 만들더라도 연결을 하지 않으면 아무 의미가 없는데 앱을 연결하기 위해서는 먼저 settings.py에 앱을 추가해야 한다.

📑 djangoProject/settings.py

...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'djangoBooks', #추가
]
...

urls.py에서 정의한 app_name = "djangoBooks"가 여기서 앱을 추가하는데 사용되었다.
또 메인에서의 urls.py도 변경을 해주어야 페이지를 넘겨줄 수 있다.

📑 djangoProject/urls.py

from django.contrib import admin
from django.urls import path,include

from .views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', mainpage),       
    path('books/', include('djangoBooks.urls')), #추가됨
]

다음과 같이 추가하면 url에서 books/ 태그가 추가되는 부분은 자동으로 djangoBooks라는 애플리케이션의 urls.py와 연결됨을 의미한다.

📑 djangoBooks/views.py

from django.shortcuts import render
from django.views.generic import View

class books_list(View):
    context = {}
    template_name = 'books_list.html'
    def get(self,request): 
        return render(request, self.template_name, self.context)

    def post(self,request):
        return render(request, self.template_name, self.context)

class books_detail(View):
    context = {}
    template_name = 'books_detail.html'
    def get(self,request): 
        return render(request, self.template_name, self.context)

    def post(self,request):
        return render(request, self.template_name, self.context)

urls.py와 연결할 views.py를 작성하면 이렇게 작성할 수 있다.
기본적으로 페이지는 GET과 POST와 같은 방법으로 페이지간 데이터를 넘겨준다.
또 render라는 return되는 함수 자체가 htmlhtml로 보내야하는 데이터를 담을 수 있는데 이렇게 구성을 놓고 시작하면 편리하다. ( 정의되지 않은 파라미터로 인한 오류를 잡을 수 있다. )

📑 djangoBooks/templates/books_list.html

<html lang="ko">
  <head>
    <meta charset="utf-8">
    <title>장고북스</title>
  </head>
  <body>
    도서 목록 페이지
  </body>
</html>

📑 djangoBooks/templates/books_detail.html

<html lang="ko">
  <head>
    <meta charset="utf-8">
    <title>장고북스</title>
  </head>
  <body>
    도서 상세 페이지
  </body>
</html>

url에 books를 추가하면 다음과 같이 페이지로 이동하고 작성한 html처럼 변하게 된다.

간단하게 특정 기능을 수행하기 위한 애플리케이션이 추가가 된다.


0개의 댓글